diff --git a/.github/test.yml b/.github/test.yml
index f863c5e..c600796 100644
--- a/.github/test.yml
+++ b/.github/test.yml
@@ -13,7 +13,7 @@ jobs:
strategy:
matrix:
operating-system: [ubuntu-22.04]
- php-versions: ["8.0", "8.1"]
+ php-versions: ["8.2"]
env:
extensions: pcov, imagick
tools: composer
diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml
index 43ed4b7..cc91c01 100644
--- a/.github/workflows/docker.yml
+++ b/.github/workflows/docker.yml
@@ -14,7 +14,7 @@ jobs:
strategy:
matrix:
os: [ubuntu-22.04]
- php: ["8.1"]
+ php: ["8.2"]
env:
tools: composer
ini-values: default_charset='UTF-8'
diff --git a/.github/workflows/release-free.yml b/.github/workflows/release-free.yml
index 0a1978e..016720e 100644
--- a/.github/workflows/release-free.yml
+++ b/.github/workflows/release-free.yml
@@ -11,7 +11,7 @@ jobs:
strategy:
matrix:
operating-system: [ubuntu-latest]
- php-versions: ["8.1"]
+ php-versions: ["8.2"]
env:
tools: composer
ini-values: default_charset='UTF-8'
diff --git a/.package/4.4.2.txt b/.package/4.4.2.txt
deleted file mode 100644
index a170111..0000000
--- a/.package/4.4.2.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Chevereto 4.4.2 (2026-01-06)
-
-- Fixed bug with "Upgrade now" button display
-- Fixed bug in /settings/api route display
-- Fixed bug in delete URL not working
-- Fixed bug in Free edition missing Follow class
-- Fixed API documentation links
diff --git a/.package/4.5.0.txt b/.package/4.5.0.txt
new file mode 100644
index 0000000..6e52dab
--- /dev/null
+++ b/.package/4.5.0.txt
@@ -0,0 +1,28 @@
+Chevereto 4.5.0 (2026-04-08)
+
+- Added /_/api/4/auth/verify route
+- Added /_/api/4/config/traefik internal HTTP provider route
+- Added /_/api/4/tenants/{id}/user-password-reset route
+- Added CHEVERETO_ENABLE_GUESTS env for controlling guest interactions
+- Added CHEVERETO_SERVICE_NAME env for specifying the service name
+- Added CHEVERETO_TRIAL_ENABLE_* keys support for controlling features enabled during trial
+- Added CHEVERETO_TRIAL_MAX_* keys support for controlling max limits during trial
+- Added CHEVERETO_TRIAL env for controlling trial mode
+- Added envTrialAware helper function for accessing trial-aware env variables
+- Added version-installed command
+- Added login_providers tenant stats
+- Added password parameter for password-reset command
+- Added port 8080 to the list of allowed ports
+- Added support for more email providers: AhaSend, Amazon SES, Azure, Brevo, Infobip, MailerSend, Mailgun, Mailjet, Mailomat, MailPace, Mailtrap, Mandrill, Microsoft Graph, Postal, Postmark, Resend, Scaleway, SendGrid and Sweego
+- Bumped minimum PHP version to 8.2
+- Fixed "Powered by" message
+- Fixed bug affecting homepage (free edition)
+- Fixed bug on /_/api/4/* routes missing error responses
+- Fixed bug on Tenants jobs:worker command when passing tenant id
+- Fixed bug on Tenants caching system
+- Fixed bug on tenants CLI database-migrate command
+- Fixed bug preventing Tenant installation
+- Fixed missing custom semantics parsing for image route description
+- Improved "Something went wrong" error page for both SaaS and self-hosted contexts
+- Improved album dropdown options on uploader
+- Renamed env variable CHEVERETO_JOBS_WORKER_INTERVAL to CHEVERETO_SCHEDULER_INTERVAL
diff --git a/app/bin/tenants b/app/bin/tenants
index 878d877..770bf7a 100755
--- a/app/bin/tenants
+++ b/app/bin/tenants
@@ -246,6 +246,7 @@ if($missingOptions ?? false) {
$envDefault = require dirname(__DIR__, 1) . '/env-default.php';
$envVar = array_merge($envDefault, ENV, getCheveretoEnv());
$envVar['CHEVERETO_DB_TABLE_ROOT_PREFIX'] = $envVar['CHEVERETO_DB_TABLE_PREFIX'];
+$envVar['CHEVERETO_CACHE_KEY_ROOT_PREFIX'] = $envVar['CHEVERETO_CACHE_KEY_PREFIX'];
$envVar['CHEVERETO_DB_TABLE_PREFIX'] .= '_'; // chv__
$envVar['CHEVERETO_CACHE_KEY_PREFIX'] .= '_:'; // chv:_:
new EnvVar($envVar);
@@ -273,6 +274,7 @@ $redis->connect(env()['CHEVERETO_CACHE_HOST'], (int) env()['CHEVERETO_CACHE_PORT
if (env()['CHEVERETO_CACHE_PASSWORD'] !== '') {
$redis->auth(env()['CHEVERETO_CACHE_PASSWORD']);
}
+$redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP);
new EncryptionInstance(
new Encryption(
new Key(env()['CHEVERETO_ENCRYPTION_KEY'])
@@ -494,7 +496,7 @@ $databaseMigrate = function() use ($tenants, $opts, $logger): void {
}
foreach ($tenantsUpdate as $tenant) {
runAppCommand(
- command: ['-C', 'database-update'],
+ command: ['-C', 'database-migrate'],
env: array_merge($_ENV, [
'CHEVERETO_TENANT' => $tenant['id'],
]),
@@ -527,7 +529,7 @@ $jobsWorker = function() use ($tenants, $opts, $logger): void {
while (true) {
$now = time();
if($opts['id'] ?? null) {
- $tenantsId = $opts['id'];
+ $tenantsId = [$opts['id']];
} else {
$tenantsId = $tenants->getTenantsIds(
['is_enabled' => true],
@@ -539,7 +541,7 @@ $jobsWorker = function() use ($tenants, $opts, $logger): void {
}
foreach ($tenantsId as $tenantId) {
$tenant = $tenants->getTenant($tenantId);
- $intervalSec = (int) ($tenant->env['CHEVERETO_JOBS_WORKER_INTERVAL'] ?? 300);
+ $intervalSec = (int) ($tenant->env['CHEVERETO_SCHEDULER_INTERVAL'] ?? 300);
$mustRun = $tenant->lastJobAt === null
|| (strtotime($tenant->lastJobAt) + $intervalSec) <= $now;
if ($mustRun) {
@@ -547,11 +549,27 @@ $jobsWorker = function() use ($tenants, $opts, $logger): void {
tenantId: $tenantId,
lastJobAt: datetimegmt()
);
+ $commandEnv = array_merge($_ENV, [
+ 'CHEVERETO_TENANT' => $tenantId,
+ ]);
+ $commandExit = runAppCommand(
+ command: ['-C', 'version-installed'],
+ env: $commandEnv,
+ isVerbose: $isVerbose,
+ logger: $logger
+ );
+ if($commandExit === 255) {
+ $logger->write(
+ << $tenantId,
- ]),
+ env: $commandEnv,
isVerbose: $isVerbose,
logger: $logger
);
diff --git a/app/composer.json b/app/composer.json
index 8c67bc6..89e284e 100644
--- a/app/composer.json
+++ b/app/composer.json
@@ -16,29 +16,27 @@
"composer/package-versions-deprecated": true
},
"platform": {
- "php": "8.1.28"
+ "php": "8.2"
}
},
"require": {
- "php": "^8.1",
+ "php": "^8.2",
"intervention/image": "^2.6",
"jeroendesloovere/xmp-metadata-extractor": "^2.0",
"guzzlehttp/psr7": "^1.7||^2",
"aws/aws-sdk-php": "^3.336.15",
- "phpmailer/phpmailer": "^6.5",
- "psr/cache": "^1",
+ "psr/cache": "^3.0",
"psr/log": "^1||^2||^3",
"phpseclib/phpseclib": "^3.0.37",
"mobiledetect/mobiledetectlib": "^2.8",
"mlocati/ip-lib": "^1.17",
"composer/ca-bundle": "^1.2",
- "chevere/throwable-handler": "^1.0.2",
"pragmarx/google2fa": "^8.0",
"pragmarx/google2fa-qrcode": "^3.0",
"phpseclib/bcmath_compat": "^2.0",
"chillerlan/php-qrcode": "^4.3",
- "firebase/php-jwt": "^6.3",
- "lychee-org/php-exif": "1.0.2",
+ "firebase/php-jwt": "^7.0",
+ "lychee-org/php-exif": "^1.0.2",
"p3k/emoji-detector": "^1.0",
"php-ffmpeg/php-ffmpeg": "^1.2",
"psy/psysh": "^0.11.8",
@@ -46,11 +44,32 @@
"chevere/var-dump": "^2.0.7",
"chevere/var-support": "^1.0",
"matthiasmullie/scrapbook": "^1.0",
- "xrdebug/php": "^3.0",
"donatj/phpuseragentparser": "^1.11",
"chevere/router": "^0.9.1",
"chevere/http": "^0.7.1",
- "laminas/laminas-httphandlerrunner": "^2.13"
+ "laminas/laminas-httphandlerrunner": "^2.13",
+ "chevere/throwable-handler": "^1.0",
+ "symfony/mailer": "^7.4",
+ "symfony/http-client": "^7.4",
+ "symfony/amazon-mailer": "^7.4",
+ "symfony/aha-send-mailer": "^7.4",
+ "symfony/azure-mailer": "^7.4",
+ "symfony/brevo-mailer": "^7.4",
+ "symfony/infobip-mailer": "^7.4",
+ "symfony/mailgun-mailer": "^7.4",
+ "symfony/mailjet-mailer": "^7.4",
+ "symfony/mailomat-mailer": "^7.4",
+ "symfony/mail-pace-mailer": "^7.4",
+ "symfony/mailer-send-mailer": "^7.4",
+ "symfony/mailtrap-mailer": "^7.4",
+ "symfony/mailchimp-mailer": "^7.4",
+ "symfony/microsoft-graph-mailer": "^7.4",
+ "symfony/postal-mailer": "^7.4",
+ "symfony/postmark-mailer": "^7.4",
+ "symfony/resend-mailer": "^7.4",
+ "symfony/scaleway-mailer": "^7.4",
+ "symfony/sendgrid-mailer": "^7.4",
+ "symfony/sweego-mailer": "^7.4"
},
"autoload": {
"files": [
diff --git a/app/composer.lock b/app/composer.lock
index 5d2fddf..b287898 100644
--- a/app/composer.lock
+++ b/app/composer.lock
@@ -4,8 +4,141 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "5e2bfdedaf52961199396451f17a71e2",
+ "content-hash": "43b717369b031292cb23399f2243b065",
"packages": [
+ {
+ "name": "async-aws/core",
+ "version": "1.28.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/async-aws/core.git",
+ "reference": "e8b02ac30b17afaf1352cbd352dceb789d792d39"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/async-aws/core/zipball/e8b02ac30b17afaf1352cbd352dceb789d792d39",
+ "reference": "e8b02ac30b17afaf1352cbd352dceb789d792d39",
+ "shasum": ""
+ },
+ "require": {
+ "ext-hash": "*",
+ "ext-simplexml": "*",
+ "php": "^8.2",
+ "psr/cache": "^1.0 || ^2.0 || ^3.0",
+ "psr/log": "^1.0 || ^2.0 || ^3.0",
+ "symfony/deprecation-contracts": "^2.1 || ^3.0",
+ "symfony/http-client": "^4.4.16 || ^5.1.7 || ^6.0 || ^7.0 || ^8.0",
+ "symfony/http-client-contracts": "^1.1.8 || ^2.0 || ^3.0",
+ "symfony/service-contracts": "^1.0 || ^2.0 || ^3.0"
+ },
+ "conflict": {
+ "async-aws/s3": "<1.1",
+ "symfony/http-client": "5.2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.5.42",
+ "symfony/error-handler": "^7.3.2 || ^8.0",
+ "symfony/phpunit-bridge": "^7.3.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.28-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "AsyncAws\\Core\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Core package to integrate with AWS. This is a lightweight AWS SDK provider by AsyncAws.",
+ "keywords": [
+ "amazon",
+ "async-aws",
+ "aws",
+ "sdk",
+ "sts"
+ ],
+ "support": {
+ "source": "https://github.com/async-aws/core/tree/1.28.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/jderusse",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nyholm",
+ "type": "github"
+ }
+ ],
+ "time": "2026-02-16T10:24:54+00:00"
+ },
+ {
+ "name": "async-aws/ses",
+ "version": "1.14.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/async-aws/ses.git",
+ "reference": "8ba4c7f5bbb4d1055f3ebedcf0ea1b8b79393e5b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/async-aws/ses/zipball/8ba4c7f5bbb4d1055f3ebedcf0ea1b8b79393e5b",
+ "reference": "8ba4c7f5bbb4d1055f3ebedcf0ea1b8b79393e5b",
+ "shasum": ""
+ },
+ "require": {
+ "async-aws/core": "^1.9",
+ "php": "^8.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.5.42",
+ "symfony/error-handler": "^7.3.2 || ^8.0",
+ "symfony/phpunit-bridge": "^7.3.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.14-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "AsyncAws\\Ses\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "SES client, part of the AWS SDK provided by AsyncAws.",
+ "keywords": [
+ "amazon",
+ "async-aws",
+ "aws",
+ "sdk",
+ "ses"
+ ],
+ "support": {
+ "source": "https://github.com/async-aws/ses/tree/1.14.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/jderusse",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nyholm",
+ "type": "github"
+ }
+ ],
+ "time": "2026-02-16T10:24:54+00:00"
+ },
{
"name": "aws/aws-crt-php",
"version": "v1.2.7",
@@ -62,16 +195,16 @@
},
{
"name": "aws/aws-sdk-php",
- "version": "3.369.7",
+ "version": "3.377.0",
"source": {
"type": "git",
"url": "https://github.com/aws/aws-sdk-php.git",
- "reference": "8678ee11ac680d462fabbecb455112a17aa7728d"
+ "reference": "573c569d20710a902446688a0439b53fef256e3a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/8678ee11ac680d462fabbecb455112a17aa7728d",
- "reference": "8678ee11ac680d462fabbecb455112a17aa7728d",
+ "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/573c569d20710a902446688a0439b53fef256e3a",
+ "reference": "573c569d20710a902446688a0439b53fef256e3a",
"shasum": ""
},
"require": {
@@ -92,12 +225,12 @@
"aws/aws-php-sns-message-validator": "~1.0",
"behat/behat": "~3.0",
"composer/composer": "^2.7.8",
- "dms/phpunit-arraysubset-asserts": "^0.4.0",
+ "dms/phpunit-arraysubset-asserts": "^v0.5.0",
"doctrine/cache": "~1.4",
"ext-dom": "*",
"ext-openssl": "*",
"ext-sockets": "*",
- "phpunit/phpunit": "^9.6",
+ "phpunit/phpunit": "^10.0",
"psr/cache": "^2.0 || ^3.0",
"psr/simple-cache": "^2.0 || ^3.0",
"sebastian/comparator": "^1.2.3 || ^4.0 || ^5.0",
@@ -135,11 +268,11 @@
"authors": [
{
"name": "Amazon Web Services",
- "homepage": "http://aws.amazon.com"
+ "homepage": "https://aws.amazon.com"
}
],
"description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project",
- "homepage": "http://aws.amazon.com/sdkforphp",
+ "homepage": "https://aws.amazon.com/sdk-for-php",
"keywords": [
"amazon",
"aws",
@@ -153,9 +286,9 @@
"support": {
"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.369.7"
+ "source": "https://github.com/aws/aws-sdk-php/tree/3.377.0"
},
- "time": "2026-01-05T19:05:14+00:00"
+ "time": "2026-04-07T18:14:36+00:00"
},
{
"name": "chevere/action",
@@ -690,68 +823,18 @@
},
"time": "2025-11-27T17:22:51+00:00"
},
- {
- "name": "chevere/standard",
- "version": "1.0.1",
- "source": {
- "type": "git",
- "url": "https://github.com/chevere/standard.git",
- "reference": "bf2b876149b42a93f3bca5a81671f31caf963528"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/chevere/standard/zipball/bf2b876149b42a93f3bca5a81671f31caf963528",
- "reference": "bf2b876149b42a93f3bca5a81671f31caf963528",
- "shasum": ""
- },
- "require": {
- "php": "^8.1"
- },
- "require-dev": {
- "phpstan/phpstan": "^1.9",
- "phpunit/phpunit": "^9.5",
- "symplify/easy-coding-standard": "^11.1"
- },
- "type": "library",
- "autoload": {
- "files": [
- "src/functions.php"
- ],
- "psr-4": {
- "Chevere\\Standard\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "Apache-2.0"
- ],
- "authors": [
- {
- "name": "Rodolfo Berrios",
- "email": "rodolfo@chevere.org",
- "homepage": "https://chevere.org"
- }
- ],
- "description": "A chevere standard package",
- "homepage": "https://chevere.org",
- "support": {
- "issues": "https://github.com/chevere/standard/issues",
- "source": "https://github.com/chevere/standard/tree/1.0.1"
- },
- "time": "2024-06-01T16:48:38+00:00"
- },
{
"name": "chevere/throwable-handler",
- "version": "1.0.7",
+ "version": "1.0.10",
"source": {
"type": "git",
"url": "https://github.com/chevere/throwable-handler.git",
- "reference": "352e59ac8998d0249a4dc6665ab6cbd465bce6bd"
+ "reference": "f191d05d83857c24b1485762d9c75fbcefb86312"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/chevere/throwable-handler/zipball/352e59ac8998d0249a4dc6665ab6cbd465bce6bd",
- "reference": "352e59ac8998d0249a4dc6665ab6cbd465bce6bd",
+ "url": "https://api.github.com/repos/chevere/throwable-handler/zipball/f191d05d83857c24b1485762d9c75fbcefb86312",
+ "reference": "f191d05d83857c24b1485762d9c75fbcefb86312",
"shasum": ""
},
"require": {
@@ -789,9 +872,9 @@
"homepage": "https://chevere.org",
"support": {
"issues": "https://github.com/chevere/throwable-handler/issues",
- "source": "https://github.com/chevere/throwable-handler/tree/1.0.7"
+ "source": "https://github.com/chevere/throwable-handler/tree/1.0.10"
},
- "time": "2025-09-12T21:25:18+00:00"
+ "time": "2026-03-08T13:33:43+00:00"
},
{
"name": "chevere/trace",
@@ -843,21 +926,21 @@
},
{
"name": "chevere/var-dump",
- "version": "2.0.7",
+ "version": "2.0.10",
"source": {
"type": "git",
"url": "https://github.com/chevere/var-dump.git",
- "reference": "1d4e2e0e31d1d384f5b4dd71b5962cddf55b43fa"
+ "reference": "5c865b3435e6dbf88deb124b169301ec353d3fff"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/chevere/var-dump/zipball/1d4e2e0e31d1d384f5b4dd71b5962cddf55b43fa",
- "reference": "1d4e2e0e31d1d384f5b4dd71b5962cddf55b43fa",
+ "url": "https://api.github.com/repos/chevere/var-dump/zipball/5c865b3435e6dbf88deb124b169301ec353d3fff",
+ "reference": "5c865b3435e6dbf88deb124b169301ec353d3fff",
"shasum": ""
},
"require": {
+ "chevere/data-structure": "^1.1",
"chevere/message": "^1.0.0",
- "chevere/parameter": "^1.0|^1.1|^1.2",
"chevere/writer": "^1.0.3",
"kevinlebrun/colors.php": "^1.0",
"php": "^8.1"
@@ -896,28 +979,28 @@
],
"support": {
"issues": "https://github.com/chevere/var-dump/issues",
- "source": "https://github.com/chevere/var-dump/tree/2.0.7"
+ "source": "https://github.com/chevere/var-dump/tree/2.0.10"
},
- "time": "2025-11-19T20:06:40+00:00"
+ "time": "2026-03-06T14:41:19+00:00"
},
{
"name": "chevere/var-support",
- "version": "1.0.1",
+ "version": "1.0.2",
"source": {
"type": "git",
"url": "https://github.com/chevere/var-support.git",
- "reference": "f5f9f9b45d1c9815b7041506683cec3e1dff087a"
+ "reference": "cf109264801a9985f195f1176ef84ff91cc621df"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/chevere/var-support/zipball/f5f9f9b45d1c9815b7041506683cec3e1dff087a",
- "reference": "f5f9f9b45d1c9815b7041506683cec3e1dff087a",
+ "url": "https://api.github.com/repos/chevere/var-support/zipball/cf109264801a9985f195f1176ef84ff91cc621df",
+ "reference": "cf109264801a9985f195f1176ef84ff91cc621df",
"shasum": ""
},
"require": {
"chevere/message": "^1.0.0",
"php": "^8.1",
- "symfony/var-exporter": "^6.1|^7.0"
+ "symfony/var-exporter": "^6.1|^7.0|^8.0"
},
"require-dev": {
"phpstan/phpstan": "^1.9",
@@ -948,9 +1031,9 @@
"homepage": "https://chevere.org",
"support": {
"issues": "https://github.com/chevere/var-support/issues",
- "source": "https://github.com/chevere/var-support/tree/1.0.1"
+ "source": "https://github.com/chevere/var-support/tree/1.0.2"
},
- "time": "2024-01-08T13:57:44+00:00"
+ "time": "2026-03-18T16:34:00+00:00"
},
{
"name": "chevere/writer",
@@ -1082,16 +1165,16 @@
},
{
"name": "chillerlan/php-settings-container",
- "version": "3.2.1",
+ "version": "3.3.0",
"source": {
"type": "git",
"url": "https://github.com/chillerlan/php-settings-container.git",
- "reference": "95ed3e9676a1d47cab2e3174d19b43f5dbf52681"
+ "reference": "a0a487cbf5344f721eb504bf0f59bada40c381b7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/chillerlan/php-settings-container/zipball/95ed3e9676a1d47cab2e3174d19b43f5dbf52681",
- "reference": "95ed3e9676a1d47cab2e3174d19b43f5dbf52681",
+ "url": "https://api.github.com/repos/chillerlan/php-settings-container/zipball/a0a487cbf5344f721eb504bf0f59bada40c381b7",
+ "reference": "a0a487cbf5344f721eb504bf0f59bada40c381b7",
"shasum": ""
},
"require": {
@@ -1099,11 +1182,13 @@
"php": "^8.1"
},
"require-dev": {
+ "phan/phan": "^5.5.2",
"phpmd/phpmd": "^2.15",
- "phpstan/phpstan": "^1.11",
- "phpstan/phpstan-deprecation-rules": "^1.2",
+ "phpstan/phpstan": "^2.1.31",
+ "phpstan/phpstan-deprecation-rules": "^2.0.3",
"phpunit/phpunit": "^10.5",
- "squizlabs/php_codesniffer": "^3.10"
+ "slevomat/coding-standard": "^8.22",
+ "squizlabs/php_codesniffer": "^4.0"
},
"type": "library",
"autoload": {
@@ -1128,7 +1213,8 @@
"Settings",
"configuration",
"container",
- "helper"
+ "helper",
+ "property hook"
],
"support": {
"issues": "https://github.com/chillerlan/php-settings-container/issues",
@@ -1144,20 +1230,20 @@
"type": "ko_fi"
}
],
- "time": "2024-07-16T11:13:48+00:00"
+ "time": "2026-03-20T21:10:52+00:00"
},
{
"name": "composer/ca-bundle",
- "version": "1.5.10",
+ "version": "1.5.11",
"source": {
"type": "git",
"url": "https://github.com/composer/ca-bundle.git",
- "reference": "961a5e4056dd2e4a2eedcac7576075947c28bf63"
+ "reference": "68ff39175e8e94a4bb1d259407ce51a6a60f09e6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/ca-bundle/zipball/961a5e4056dd2e4a2eedcac7576075947c28bf63",
- "reference": "961a5e4056dd2e4a2eedcac7576075947c28bf63",
+ "url": "https://api.github.com/repos/composer/ca-bundle/zipball/68ff39175e8e94a4bb1d259407ce51a6a60f09e6",
+ "reference": "68ff39175e8e94a4bb1d259407ce51a6a60f09e6",
"shasum": ""
},
"require": {
@@ -1204,7 +1290,7 @@
"support": {
"irc": "irc://irc.freenode.org/composer",
"issues": "https://github.com/composer/ca-bundle/issues",
- "source": "https://github.com/composer/ca-bundle/tree/1.5.10"
+ "source": "https://github.com/composer/ca-bundle/tree/1.5.11"
},
"funding": [
{
@@ -1216,7 +1302,84 @@
"type": "github"
}
],
- "time": "2025-12-08T15:06:51+00:00"
+ "time": "2026-03-30T09:16:10+00:00"
+ },
+ {
+ "name": "doctrine/lexer",
+ "version": "3.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/lexer.git",
+ "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd",
+ "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^12",
+ "phpstan/phpstan": "^1.10",
+ "phpunit/phpunit": "^10.5",
+ "psalm/plugin-phpunit": "^0.18.3",
+ "vimeo/psalm": "^5.21"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Common\\Lexer\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.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",
+ "keywords": [
+ "annotations",
+ "docblock",
+ "lexer",
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/lexer/issues",
+ "source": "https://github.com/doctrine/lexer/tree/3.0.1"
+ },
+ "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%2Flexer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-02-05T11:56:58+00:00"
},
{
"name": "donatj/phpuseragentparser",
@@ -1292,6 +1455,73 @@
],
"time": "2025-09-10T21:58:40+00:00"
},
+ {
+ "name": "egulias/email-validator",
+ "version": "4.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/egulias/EmailValidator.git",
+ "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa",
+ "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/lexer": "^2.0 || ^3.0",
+ "php": ">=8.1",
+ "symfony/polyfill-intl-idn": "^1.26"
+ },
+ "require-dev": {
+ "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": "evenement/evenement",
"version": "v3.0.2",
@@ -1341,16 +1571,16 @@
},
{
"name": "firebase/php-jwt",
- "version": "v6.11.1",
+ "version": "v7.0.5",
"source": {
"type": "git",
"url": "https://github.com/firebase/php-jwt.git",
- "reference": "d1e91ecf8c598d073d0995afa8cd5c75c6e19e66"
+ "reference": "47ad26bab5e7c70ae8a6f08ed25ff83631121380"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/firebase/php-jwt/zipball/d1e91ecf8c598d073d0995afa8cd5c75c6e19e66",
- "reference": "d1e91ecf8c598d073d0995afa8cd5c75c6e19e66",
+ "url": "https://api.github.com/repos/firebase/php-jwt/zipball/47ad26bab5e7c70ae8a6f08ed25ff83631121380",
+ "reference": "47ad26bab5e7c70ae8a6f08ed25ff83631121380",
"shasum": ""
},
"require": {
@@ -1358,6 +1588,7 @@
},
"require-dev": {
"guzzlehttp/guzzle": "^7.4",
+ "phpfastcache/phpfastcache": "^9.2",
"phpspec/prophecy-phpunit": "^2.0",
"phpunit/phpunit": "^9.5",
"psr/cache": "^2.0||^3.0",
@@ -1398,9 +1629,9 @@
],
"support": {
"issues": "https://github.com/firebase/php-jwt/issues",
- "source": "https://github.com/firebase/php-jwt/tree/v6.11.1"
+ "source": "https://github.com/firebase/php-jwt/tree/v7.0.5"
},
- "time": "2025-04-09T20:32:01+00:00"
+ "time": "2026-04-01T20:38:03+00:00"
},
{
"name": "fylax/forceutf8",
@@ -1668,16 +1899,16 @@
},
{
"name": "guzzlehttp/psr7",
- "version": "2.8.0",
+ "version": "2.9.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
- "reference": "21dc724a0583619cd1652f673303492272778051"
+ "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051",
- "reference": "21dc724a0583619cd1652f673303492272778051",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/7d0ed42f28e42d61352a7a79de682e5e67fec884",
+ "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884",
"shasum": ""
},
"require": {
@@ -1693,6 +1924,7 @@
"require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2",
"http-interop/http-factory-tests": "0.9.0",
+ "jshttp/mime-db": "1.54.0.1",
"phpunit/phpunit": "^8.5.44 || ^9.6.25"
},
"suggest": {
@@ -1764,7 +1996,7 @@
],
"support": {
"issues": "https://github.com/guzzle/psr7/issues",
- "source": "https://github.com/guzzle/psr7/tree/2.8.0"
+ "source": "https://github.com/guzzle/psr7/tree/2.9.0"
},
"funding": [
{
@@ -1780,7 +2012,7 @@
"type": "tidelift"
}
],
- "time": "2025-08-23T21:21:41+00:00"
+ "time": "2026-03-10T16:41:02+00:00"
},
{
"name": "intervention/image",
@@ -2045,33 +2277,32 @@
},
{
"name": "lychee-org/php-exif",
- "version": "v1.0.2",
+ "version": "1.3.0",
"source": {
"type": "git",
"url": "https://github.com/LycheeOrg/php-exif.git",
- "reference": "12c4976d2dea44fc4eb3b9dd33428b95ba7461c0"
+ "reference": "4e4fad2f2617c94e35df26a099d9b04a49cdc4b4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/LycheeOrg/php-exif/zipball/12c4976d2dea44fc4eb3b9dd33428b95ba7461c0",
- "reference": "12c4976d2dea44fc4eb3b9dd33428b95ba7461c0",
+ "url": "https://api.github.com/repos/LycheeOrg/php-exif/zipball/4e4fad2f2617c94e35df26a099d9b04a49cdc4b4",
+ "reference": "4e4fad2f2617c94e35df26a099d9b04a49cdc4b4",
"shasum": ""
},
"require": {
"ext-fileinfo": "*",
- "fylax/forceutf8": "^3.0.1",
- "php": "^8.1",
- "php-ffmpeg/php-ffmpeg": "^1.0",
- "thecodingmachine/safe": "^2.2"
+ "fylax/forceutf8": "^3.0.3",
+ "php": "^8.2 || ^8.3 || ^8.4 || ^8.5",
+ "php-ffmpeg/php-ffmpeg": "^1.4",
+ "thecodingmachine/safe": "^2.0 || ^3.0"
},
"require-dev": {
- "friendsofphp/php-cs-fixer": "^3.3",
- "infection/infection": "^0.26.13",
- "lychee-org/phpstan-lychee": "^1.0.1",
- "php-parallel-lint/php-parallel-lint": "^1.2",
- "phpmd/phpmd": "^2.9",
+ "friendsofphp/php-cs-fixer": "^3.51",
+ "lychee-org/phpstan-lychee": "^2.0.1|^1.0.0",
+ "php-parallel-lint/php-parallel-lint": "^1.3.2",
+ "phpmd/phpmd": "^2.15",
"phpunit/phpunit": "^9.5.10",
- "squizlabs/php_codesniffer": "^3.5",
+ "squizlabs/php_codesniffer": "^3.9",
"thecodingmachine/phpstan-safe-rule": "^1.2"
},
"suggest": {
@@ -2092,10 +2323,15 @@
"MIT"
],
"authors": [
+ {
+ "name": "LycheeOrg",
+ "homepage": "https://lycheeorg.dev/",
+ "role": "Maintainers"
+ },
{
"name": "Tom Van Herreweghe",
"homepage": "http://theanalogguy.be",
- "role": "Developer"
+ "role": "Creator"
}
],
"description": "Object-Oriented EXIF parsing",
@@ -2112,45 +2348,45 @@
],
"support": {
"issues": "https://github.com/LycheeOrg/php-exif/issues",
- "source": "https://github.com/LycheeOrg/php-exif/tree/v1.0.2"
+ "source": "https://github.com/LycheeOrg/php-exif/tree/1.3.0"
},
- "time": "2023-04-11T11:03:27+00:00"
+ "time": "2026-01-31T14:00:30+00:00"
},
{
"name": "matthiasmullie/scrapbook",
- "version": "1.4.9",
+ "version": "1.5.4",
"source": {
"type": "git",
"url": "https://github.com/matthiasmullie/scrapbook.git",
- "reference": "da4178c1882136a8931ffd791df2b84a5aa74219"
+ "reference": "6ca64d54d7106deffbb98cb9c6a6f5fdb13ce1f1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/matthiasmullie/scrapbook/zipball/da4178c1882136a8931ffd791df2b84a5aa74219",
- "reference": "da4178c1882136a8931ffd791df2b84a5aa74219",
+ "url": "https://api.github.com/repos/matthiasmullie/scrapbook/zipball/6ca64d54d7106deffbb98cb9c6a6f5fdb13ce1f1",
+ "reference": "6ca64d54d7106deffbb98cb9c6a6f5fdb13ce1f1",
"shasum": ""
},
"require": {
- "php": ">=5.3.0",
- "psr/cache": "^1.0||~2.0",
- "psr/simple-cache": "^1.0||~2.0"
+ "php": ">=8.0.0",
+ "psr/cache": "^2.0||^3.0",
+ "psr/simple-cache": "^2.0||^3.0"
},
"provide": {
- "psr/cache-implementation": "^1.0||~2.0",
- "psr/simple-cache-implementation": "^1.0||~2.0"
+ "psr/cache-implementation": "^1.0||^2.0||^3.0",
+ "psr/simple-cache-implementation": "^1.0||^2.0||^3.0"
},
"require-dev": {
"ext-pcntl": "*",
- "friendsofphp/php-cs-fixer": ">=2.0",
- "phpunit/phpunit": ">=4.8"
+ "friendsofphp/php-cs-fixer": ">=3.0",
+ "phpunit/phpunit": ">=10.0"
},
"suggest": {
- "couchbase/couchbase": ">=2.0",
- "ext-apc": ">=3.1.1",
- "ext-couchbase": ">=2.0.0",
+ "couchbase/couchbase": ">=3.0",
+ "ext-apcu": ">=4.0.0",
+ "ext-couchbase": ">=3.0.0",
"ext-memcached": ">=2.0.0",
"ext-pdo": ">=0.1.0",
- "ext-redis": ">=2.2.0 || 0.0.0.0",
+ "ext-redis": ">=2.2.0||0.0.0.0",
"league/flysystem": ">=1.0"
},
"type": "library",
@@ -2171,7 +2407,7 @@
"role": "Developer"
}
],
- "description": "Scrapbook is a PHP cache library, with adapters for e.g. Memcached, Redis, Couchbase, APC(u), SQL and additional capabilities (e.g. transactions, stampede protection) built on top.",
+ "description": "Scrapbook is a PHP cache library, with adapters for e.g. Memcached, Redis, Couchbase, APCu, SQL and additional capabilities (e.g. transactions, stampede protection) built on top.",
"homepage": "https://scrapbook.cash",
"keywords": [
"Buffer",
@@ -2205,7 +2441,7 @@
],
"support": {
"issues": "https://github.com/matthiasmullie/scrapbook/issues",
- "source": "https://github.com/matthiasmullie/scrapbook/tree/1.4.9"
+ "source": "https://github.com/matthiasmullie/scrapbook/tree/1.5.4"
},
"funding": [
{
@@ -2213,7 +2449,7 @@
"type": "github"
}
],
- "time": "2022-11-10T09:28:49+00:00"
+ "time": "2024-12-20T11:47:12+00:00"
},
{
"name": "mlocati/ip-lib",
@@ -2761,25 +2997,25 @@
},
{
"name": "php-ffmpeg/php-ffmpeg",
- "version": "v1.3.2",
+ "version": "v1.4.0",
"source": {
"type": "git",
"url": "https://github.com/PHP-FFMpeg/PHP-FFMpeg.git",
- "reference": "8e74bdc07ad200da7a6cfb21ec2652875e4368e0"
+ "reference": "41fa00949ea2758cd34f076a8030df7198d57759"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PHP-FFMpeg/PHP-FFMpeg/zipball/8e74bdc07ad200da7a6cfb21ec2652875e4368e0",
- "reference": "8e74bdc07ad200da7a6cfb21ec2652875e4368e0",
+ "url": "https://api.github.com/repos/PHP-FFMpeg/PHP-FFMpeg/zipball/41fa00949ea2758cd34f076a8030df7198d57759",
+ "reference": "41fa00949ea2758cd34f076a8030df7198d57759",
"shasum": ""
},
"require": {
"evenement/evenement": "^3.0",
- "php": "^8.0 || ^8.1 || ^8.2 || ^8.3 || ^8.4",
+ "php": "^8.0 || ^8.1 || ^8.2 || ^8.3 || ^8.4 || ^8.5",
"psr/log": "^1.0 || ^2.0 || ^3.0",
"spatie/temporary-directory": "^2.0",
- "symfony/cache": "^5.4 || ^6.0 || ^7.0",
- "symfony/process": "^5.4 || ^6.0 || ^7.0"
+ "symfony/cache": "^5.4 || ^6.0 || ^7.0 || ^8.0",
+ "symfony/process": "^5.4 || ^6.0 || ^7.0 || ^8.0"
},
"require-dev": {
"mockery/mockery": "^1.5",
@@ -2844,90 +3080,9 @@
],
"support": {
"issues": "https://github.com/PHP-FFMpeg/PHP-FFMpeg/issues",
- "source": "https://github.com/PHP-FFMpeg/PHP-FFMpeg/tree/v1.3.2"
+ "source": "https://github.com/PHP-FFMpeg/PHP-FFMpeg/tree/v1.4.0"
},
- "time": "2025-04-01T20:36:46+00:00"
- },
- {
- "name": "phpmailer/phpmailer",
- "version": "v6.12.0",
- "source": {
- "type": "git",
- "url": "https://github.com/PHPMailer/PHPMailer.git",
- "reference": "d1ac35d784bf9f5e61b424901d5a014967f15b12"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/d1ac35d784bf9f5e61b424901d5a014967f15b12",
- "reference": "d1ac35d784bf9f5e61b424901d5a014967f15b12",
- "shasum": ""
- },
- "require": {
- "ext-ctype": "*",
- "ext-filter": "*",
- "ext-hash": "*",
- "php": ">=5.5.0"
- },
- "require-dev": {
- "dealerdirect/phpcodesniffer-composer-installer": "^1.0",
- "doctrine/annotations": "^1.2.6 || ^1.13.3",
- "php-parallel-lint/php-console-highlighter": "^1.0.0",
- "php-parallel-lint/php-parallel-lint": "^1.3.2",
- "phpcompatibility/php-compatibility": "^9.3.5",
- "roave/security-advisories": "dev-latest",
- "squizlabs/php_codesniffer": "^3.7.2",
- "yoast/phpunit-polyfills": "^1.0.4"
- },
- "suggest": {
- "decomplexity/SendOauth2": "Adapter for using XOAUTH2 authentication",
- "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses",
- "ext-openssl": "Needed for secure SMTP sending and DKIM signing",
- "greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication",
- "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication",
- "league/oauth2-google": "Needed for Google XOAUTH2 authentication",
- "psr/log": "For optional PSR-3 debug logging",
- "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)",
- "thenetworg/oauth2-azure": "Needed for Microsoft XOAUTH2 authentication"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "PHPMailer\\PHPMailer\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "LGPL-2.1-only"
- ],
- "authors": [
- {
- "name": "Marcus Bointon",
- "email": "phpmailer@synchromedia.co.uk"
- },
- {
- "name": "Jim Jagielski",
- "email": "jimjag@gmail.com"
- },
- {
- "name": "Andy Prevost",
- "email": "codeworxtech@users.sourceforge.net"
- },
- {
- "name": "Brent R. Matzelle"
- }
- ],
- "description": "PHPMailer is a full-featured email creation and transfer class for PHP",
- "support": {
- "issues": "https://github.com/PHPMailer/PHPMailer/issues",
- "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.12.0"
- },
- "funding": [
- {
- "url": "https://github.com/Synchro",
- "type": "github"
- }
- ],
- "time": "2025-10-15T16:49:08+00:00"
+ "time": "2026-01-19T21:15:14+00:00"
},
{
"name": "phpseclib/bcmath_compat",
@@ -2993,16 +3148,16 @@
},
{
"name": "phpseclib/phpseclib",
- "version": "3.0.48",
+ "version": "3.0.50",
"source": {
"type": "git",
"url": "https://github.com/phpseclib/phpseclib.git",
- "reference": "64065a5679c50acb886e82c07aa139b0f757bb89"
+ "reference": "aa6ad8321ed103dc3624fb600a25b66ebf78ec7b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/64065a5679c50acb886e82c07aa139b0f757bb89",
- "reference": "64065a5679c50acb886e82c07aa139b0f757bb89",
+ "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/aa6ad8321ed103dc3624fb600a25b66ebf78ec7b",
+ "reference": "aa6ad8321ed103dc3624fb600a25b66ebf78ec7b",
"shasum": ""
},
"require": {
@@ -3083,7 +3238,7 @@
],
"support": {
"issues": "https://github.com/phpseclib/phpseclib/issues",
- "source": "https://github.com/phpseclib/phpseclib/tree/3.0.48"
+ "source": "https://github.com/phpseclib/phpseclib/tree/3.0.50"
},
"funding": [
{
@@ -3099,7 +3254,7 @@
"type": "tidelift"
}
],
- "time": "2025-12-15T11:51:42+00:00"
+ "time": "2026-03-19T02:57:58+00:00"
},
{
"name": "pragmarx/google2fa",
@@ -3222,20 +3377,20 @@
},
{
"name": "psr/cache",
- "version": "1.0.1",
+ "version": "3.0.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/cache.git",
- "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8"
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8",
- "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8",
+ "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
"shasum": ""
},
"require": {
- "php": ">=5.3.0"
+ "php": ">=8.0.0"
},
"type": "library",
"extra": {
@@ -3255,7 +3410,7 @@
"authors": [
{
"name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
+ "homepage": "https://www.php-fig.org/"
}
],
"description": "Common interface for caching libraries",
@@ -3265,9 +3420,57 @@
"psr-6"
],
"support": {
- "source": "https://github.com/php-fig/cache/tree/master"
+ "source": "https://github.com/php-fig/cache/tree/3.0.0"
},
- "time": "2016-08-06T20:24:11+00:00"
+ "time": "2021-02-03T23:26:27+00:00"
+ },
+ {
+ "name": "psr/clock",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/clock.git",
+ "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d",
+ "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Psr\\Clock\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "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": "psr/container",
@@ -3322,6 +3525,56 @@
},
"time": "2021-11-05T16:47:00+00:00"
},
+ {
+ "name": "psr/event-dispatcher",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/event-dispatcher.git",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\EventDispatcher\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Standard interfaces for event handling.",
+ "keywords": [
+ "events",
+ "psr",
+ "psr-14"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/event-dispatcher/issues",
+ "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
+ },
+ "time": "2019-01-08T18:20:26+00:00"
+ },
{
"name": "psr/http-client",
"version": "1.0.3",
@@ -3647,16 +3900,16 @@
},
{
"name": "psr/simple-cache",
- "version": "2.0.0",
+ "version": "3.0.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/simple-cache.git",
- "reference": "8707bf3cea6f710bf6ef05491234e3ab06f6432a"
+ "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/8707bf3cea6f710bf6ef05491234e3ab06f6432a",
- "reference": "8707bf3cea6f710bf6ef05491234e3ab06f6432a",
+ "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865",
+ "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865",
"shasum": ""
},
"require": {
@@ -3665,7 +3918,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0.x-dev"
+ "dev-master": "3.0.x-dev"
}
},
"autoload": {
@@ -3692,22 +3945,22 @@
"simple-cache"
],
"support": {
- "source": "https://github.com/php-fig/simple-cache/tree/2.0.0"
+ "source": "https://github.com/php-fig/simple-cache/tree/3.0.0"
},
- "time": "2021-10-29T13:22:09+00:00"
+ "time": "2021-10-29T13:26:27+00:00"
},
{
"name": "psy/psysh",
- "version": "v0.11.22",
+ "version": "v0.11.23",
"source": {
"type": "git",
"url": "https://github.com/bobthecow/psysh.git",
- "reference": "128fa1b608be651999ed9789c95e6e2a31b5802b"
+ "reference": "e9ac4fae08b0bc7fb4f8391b220daa1dc55f03bf"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/bobthecow/psysh/zipball/128fa1b608be651999ed9789c95e6e2a31b5802b",
- "reference": "128fa1b608be651999ed9789c95e6e2a31b5802b",
+ "url": "https://api.github.com/repos/bobthecow/psysh/zipball/e9ac4fae08b0bc7fb4f8391b220daa1dc55f03bf",
+ "reference": "e9ac4fae08b0bc7fb4f8391b220daa1dc55f03bf",
"shasum": ""
},
"require": {
@@ -3772,9 +4025,9 @@
],
"support": {
"issues": "https://github.com/bobthecow/psysh/issues",
- "source": "https://github.com/bobthecow/psysh/tree/v0.11.22"
+ "source": "https://github.com/bobthecow/psysh/tree/v0.11.23"
},
- "time": "2023-10-14T21:56:36+00:00"
+ "time": "2026-01-30T05:01:10+00:00"
},
{
"name": "ralouphie/getallheaders",
@@ -3883,16 +4136,16 @@
},
{
"name": "spatie/temporary-directory",
- "version": "2.3.0",
+ "version": "2.3.1",
"source": {
"type": "git",
"url": "https://github.com/spatie/temporary-directory.git",
- "reference": "580eddfe9a0a41a902cac6eeb8f066b42e65a32b"
+ "reference": "662e481d6ec07ef29fd05010433428851a42cd07"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/temporary-directory/zipball/580eddfe9a0a41a902cac6eeb8f066b42e65a32b",
- "reference": "580eddfe9a0a41a902cac6eeb8f066b42e65a32b",
+ "url": "https://api.github.com/repos/spatie/temporary-directory/zipball/662e481d6ec07ef29fd05010433428851a42cd07",
+ "reference": "662e481d6ec07ef29fd05010433428851a42cd07",
"shasum": ""
},
"require": {
@@ -3928,7 +4181,7 @@
],
"support": {
"issues": "https://github.com/spatie/temporary-directory/issues",
- "source": "https://github.com/spatie/temporary-directory/tree/2.3.0"
+ "source": "https://github.com/spatie/temporary-directory/tree/2.3.1"
},
"funding": [
{
@@ -3940,62 +4193,348 @@
"type": "github"
}
],
- "time": "2025-01-13T13:04:43+00:00"
+ "time": "2026-01-12T07:42:22+00:00"
},
{
- "name": "symfony/cache",
- "version": "v5.4.46",
+ "name": "symfony/aha-send-mailer",
+ "version": "v7.4.4",
"source": {
"type": "git",
- "url": "https://github.com/symfony/cache.git",
- "reference": "0fe08ee32cec2748fbfea10c52d3ee02049e0f6b"
+ "url": "https://github.com/symfony/aha-send-mailer.git",
+ "reference": "dd146909b3e32663a874b8c7c2fcc86145b04ee9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/cache/zipball/0fe08ee32cec2748fbfea10c52d3ee02049e0f6b",
- "reference": "0fe08ee32cec2748fbfea10c52d3ee02049e0f6b",
+ "url": "https://api.github.com/repos/symfony/aha-send-mailer/zipball/dd146909b3e32663a874b8c7c2fcc86145b04ee9",
+ "reference": "dd146909b3e32663a874b8c7c2fcc86145b04ee9",
"shasum": ""
},
"require": {
- "php": ">=7.2.5",
- "psr/cache": "^1.0|^2.0",
- "psr/log": "^1.1|^2|^3",
- "symfony/cache-contracts": "^1.1.7|^2",
- "symfony/deprecation-contracts": "^2.1|^3",
- "symfony/polyfill-php73": "^1.9",
- "symfony/polyfill-php80": "^1.16",
- "symfony/service-contracts": "^1.1|^2|^3",
- "symfony/var-exporter": "^4.4|^5.0|^6.0"
+ "php": ">=8.2",
+ "psr/event-dispatcher": "^1",
+ "symfony/mailer": "^7.3|^8.0"
+ },
+ "require-dev": {
+ "symfony/http-client": "^6.4|^7.0|^8.0",
+ "symfony/webhook": "^6.4|^7.0|^8.0"
+ },
+ "type": "symfony-mailer-bridge",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Mailer\\Bridge\\AhaSend\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Farhad Hedayatifard",
+ "email": "farhad@ahasend.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony AhaSend Mailer Bridge",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/aha-send-mailer/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"
+ }
+ ],
+ "time": "2026-01-08T08:25:11+00:00"
+ },
+ {
+ "name": "symfony/amazon-mailer",
+ "version": "v7.4.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/amazon-mailer.git",
+ "reference": "6fedfa970a1b5b2c93fd32c598df7db7d03070b4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/amazon-mailer/zipball/6fedfa970a1b5b2c93fd32c598df7db7d03070b4",
+ "reference": "6fedfa970a1b5b2c93fd32c598df7db7d03070b4",
+ "shasum": ""
+ },
+ "require": {
+ "async-aws/ses": "^1.8",
+ "php": ">=8.2",
+ "symfony/mailer": "^7.2|^8.0"
+ },
+ "require-dev": {
+ "symfony/http-client": "^6.4|^7.0|^8.0"
+ },
+ "type": "symfony-mailer-bridge",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Mailer\\Bridge\\Amazon\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Amazon Mailer Bridge",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/amazon-mailer/tree/v7.4.6"
+ },
+ "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": "2026-02-11T15:05:50+00:00"
+ },
+ {
+ "name": "symfony/azure-mailer",
+ "version": "v7.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/azure-mailer.git",
+ "reference": "c9a3e6ce0ca35798a9fc8ae62dd7d00fa9d9399b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/azure-mailer/zipball/c9a3e6ce0ca35798a9fc8ae62dd7d00fa9d9399b",
+ "reference": "c9a3e6ce0ca35798a9fc8ae62dd7d00fa9d9399b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/mailer": "^7.2|^8.0"
+ },
+ "require-dev": {
+ "symfony/http-client": "^6.4|^7.0|^8.0"
+ },
+ "type": "symfony-mailer-bridge",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Mailer\\Bridge\\Azure\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Rafael Villa Verde",
+ "homepage": "https://github.com/hafael"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Microsoft Azure Mailer Bridge",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/azure-mailer/tree/v7.4.0"
+ },
+ "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-08-04T07:05:15+00:00"
+ },
+ {
+ "name": "symfony/brevo-mailer",
+ "version": "v7.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/brevo-mailer.git",
+ "reference": "f1ef26ffe147e9185531030fc1503ed7b63fa0ef"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/brevo-mailer/zipball/f1ef26ffe147e9185531030fc1503ed7b63fa0ef",
+ "reference": "f1ef26ffe147e9185531030fc1503ed7b63fa0ef",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/mailer": "^7.2|^8.0"
},
"conflict": {
- "doctrine/dbal": "<2.13.1",
- "symfony/dependency-injection": "<4.4",
- "symfony/http-kernel": "<4.4",
- "symfony/var-dumper": "<4.4"
+ "symfony/mime": "<6.2"
+ },
+ "require-dev": {
+ "symfony/http-client": "^6.3|^7.0|^8.0",
+ "symfony/webhook": "^6.3|^7.0|^8.0"
+ },
+ "type": "symfony-mailer-bridge",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Mailer\\Bridge\\Brevo\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Pierre Tanguy",
+ "homepage": "https://github.com/petanguy"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Brevo Mailer Bridge",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/brevo-mailer/tree/v7.4.0"
+ },
+ "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-08-04T08:00:56+00:00"
+ },
+ {
+ "name": "symfony/cache",
+ "version": "v7.4.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/cache.git",
+ "reference": "467464da294734b0fb17e853e5712abc8470f819"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/cache/zipball/467464da294734b0fb17e853e5712abc8470f819",
+ "reference": "467464da294734b0fb17e853e5712abc8470f819",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "psr/cache": "^2.0|^3.0",
+ "psr/log": "^1.1|^2|^3",
+ "symfony/cache-contracts": "^3.6",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/var-exporter": "^6.4|^7.0|^8.0"
+ },
+ "conflict": {
+ "doctrine/dbal": "<3.6",
+ "ext-redis": "<6.1",
+ "ext-relay": "<0.12.1",
+ "symfony/dependency-injection": "<6.4",
+ "symfony/http-kernel": "<6.4",
+ "symfony/var-dumper": "<6.4"
},
"provide": {
- "psr/cache-implementation": "1.0|2.0",
- "psr/simple-cache-implementation": "1.0|2.0",
- "symfony/cache-implementation": "1.0|2.0"
+ "psr/cache-implementation": "2.0|3.0",
+ "psr/simple-cache-implementation": "1.0|2.0|3.0",
+ "symfony/cache-implementation": "1.1|2.0|3.0"
},
"require-dev": {
"cache/integration-tests": "dev-master",
- "doctrine/cache": "^1.6|^2.0",
- "doctrine/dbal": "^2.13.1|^3|^4",
+ "doctrine/dbal": "^3.6|^4",
"predis/predis": "^1.1|^2.0",
- "psr/simple-cache": "^1.0|^2.0",
- "symfony/config": "^4.4|^5.0|^6.0",
- "symfony/dependency-injection": "^4.4|^5.0|^6.0",
- "symfony/filesystem": "^4.4|^5.0|^6.0",
- "symfony/http-kernel": "^4.4|^5.0|^6.0",
- "symfony/messenger": "^4.4|^5.0|^6.0",
- "symfony/var-dumper": "^4.4|^5.0|^6.0"
+ "psr/simple-cache": "^1.0|^2.0|^3.0",
+ "symfony/clock": "^6.4|^7.0|^8.0",
+ "symfony/config": "^6.4|^7.0|^8.0",
+ "symfony/dependency-injection": "^6.4|^7.0|^8.0",
+ "symfony/filesystem": "^6.4|^7.0|^8.0",
+ "symfony/http-kernel": "^6.4|^7.0|^8.0",
+ "symfony/messenger": "^6.4|^7.0|^8.0",
+ "symfony/var-dumper": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Symfony\\Component\\Cache\\": ""
},
+ "classmap": [
+ "Traits/ValueWrapper.php"
+ ],
"exclude-from-classmap": [
"/Tests/"
]
@@ -4021,7 +4560,7 @@
"psr6"
],
"support": {
- "source": "https://github.com/symfony/cache/tree/v5.4.46"
+ "source": "https://github.com/symfony/cache/tree/v7.4.8"
},
"funding": [
{
@@ -4032,33 +4571,34 @@
"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-11-04T11:43:55+00:00"
+ "time": "2026-03-30T15:15:47+00:00"
},
{
"name": "symfony/cache-contracts",
- "version": "v2.5.4",
+ "version": "v3.6.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/cache-contracts.git",
- "reference": "517c3a3619dadfa6952c4651767fcadffb4df65e"
+ "reference": "5d68a57d66910405e5c0b63d6f0af941e66fc868"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/517c3a3619dadfa6952c4651767fcadffb4df65e",
- "reference": "517c3a3619dadfa6952c4651767fcadffb4df65e",
+ "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/5d68a57d66910405e5c0b63d6f0af941e66fc868",
+ "reference": "5d68a57d66910405e5c0b63d6f0af941e66fc868",
"shasum": ""
},
"require": {
- "php": ">=7.2.5",
- "psr/cache": "^1.0|^2.0|^3.0"
- },
- "suggest": {
- "symfony/cache-implementation": ""
+ "php": ">=8.1",
+ "psr/cache": "^3.0"
},
"type": "library",
"extra": {
@@ -4067,7 +4607,7 @@
"name": "symfony/contracts"
},
"branch-alias": {
- "dev-main": "2.5-dev"
+ "dev-main": "3.6-dev"
}
},
"autoload": {
@@ -4100,7 +4640,7 @@
"standards"
],
"support": {
- "source": "https://github.com/symfony/cache-contracts/tree/v2.5.4"
+ "source": "https://github.com/symfony/cache-contracts/tree/v3.6.0"
},
"funding": [
{
@@ -4116,20 +4656,98 @@
"type": "tidelift"
}
],
- "time": "2024-09-25T14:11:13+00:00"
+ "time": "2025-03-13T15:25:07+00:00"
},
{
- "name": "symfony/console",
- "version": "v6.4.31",
+ "name": "symfony/clock",
+ "version": "v7.4.8",
"source": {
"type": "git",
- "url": "https://github.com/symfony/console.git",
- "reference": "f9f8a889f54c264f9abac3fc0f7a371ffca51997"
+ "url": "https://github.com/symfony/clock.git",
+ "reference": "674fa3b98e21531dd040e613479f5f6fa8f32111"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/f9f8a889f54c264f9abac3fc0f7a371ffca51997",
- "reference": "f9f8a889f54c264f9abac3fc0f7a371ffca51997",
+ "url": "https://api.github.com/repos/symfony/clock/zipball/674fa3b98e21531dd040e613479f5f6fa8f32111",
+ "reference": "674fa3b98e21531dd040e613479f5f6fa8f32111",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "psr/clock": "^1.0",
+ "symfony/polyfill-php83": "^1.28"
+ },
+ "provide": {
+ "psr/clock-implementation": "1.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/now.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\Clock\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Decouples applications from the system clock",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "clock",
+ "psr20",
+ "time"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/clock/tree/v7.4.8"
+ },
+ "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": "2026-03-24T13:12:05+00:00"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v6.4.36",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "9f481cfb580db8bcecc9b2d4c63f3e13df022ad5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/9f481cfb580db8bcecc9b2d4c63f3e13df022ad5",
+ "reference": "9f481cfb580db8bcecc9b2d4c63f3e13df022ad5",
"shasum": ""
},
"require": {
@@ -4194,7 +4812,7 @@
"terminal"
],
"support": {
- "source": "https://github.com/symfony/console/tree/v6.4.31"
+ "source": "https://github.com/symfony/console/tree/v6.4.36"
},
"funding": [
{
@@ -4214,7 +4832,7 @@
"type": "tidelift"
}
],
- "time": "2025-12-22T08:30:34+00:00"
+ "time": "2026-03-27T15:30:51+00:00"
},
{
"name": "symfony/deprecation-contracts",
@@ -4284,26 +4902,187 @@
"time": "2024-09-25T14:21:43+00:00"
},
{
- "name": "symfony/filesystem",
- "version": "v6.4.30",
+ "name": "symfony/event-dispatcher",
+ "version": "v7.4.8",
"source": {
"type": "git",
- "url": "https://github.com/symfony/filesystem.git",
- "reference": "441c6b69f7222aadae7cbf5df588496d5ee37789"
+ "url": "https://github.com/symfony/event-dispatcher.git",
+ "reference": "f57b899fa736fd71121168ef268f23c206083f0a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/filesystem/zipball/441c6b69f7222aadae7cbf5df588496d5ee37789",
- "reference": "441c6b69f7222aadae7cbf5df588496d5ee37789",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f57b899fa736fd71121168ef268f23c206083f0a",
+ "reference": "f57b899fa736fd71121168ef268f23c206083f0a",
+ "shasum": ""
+ },
+ "require": {
+ "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": {
+ "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": {
+ "Symfony\\Component\\EventDispatcher\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.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",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/event-dispatcher/tree/v7.4.8"
+ },
+ "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": "2026-03-30T13:54:39+00:00"
+ },
+ {
+ "name": "symfony/event-dispatcher-contracts",
+ "version": "v3.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher-contracts.git",
+ "reference": "59eb412e93815df44f05f342958efa9f46b1e586"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586",
+ "reference": "59eb412e93815df44f05f342958efa9f46b1e586",
"shasum": ""
},
"require": {
"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": {
+ "psr-4": {
+ "Symfony\\Contracts\\EventDispatcher\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to dispatching event",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.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-25T14:21:43+00:00"
+ },
+ {
+ "name": "symfony/filesystem",
+ "version": "v7.4.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/filesystem.git",
+ "reference": "58b9790d12f9670b7f53a1c1738febd3108970a5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/58b9790d12f9670b7f53a1c1738febd3108970a5",
+ "reference": "58b9790d12f9670b7f53a1c1738febd3108970a5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
"symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-mbstring": "~1.8"
},
"require-dev": {
- "symfony/process": "^5.4|^6.4|^7.0"
+ "symfony/process": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -4331,7 +5110,7 @@
"description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/filesystem/tree/v6.4.30"
+ "source": "https://github.com/symfony/filesystem/tree/v7.4.8"
},
"funding": [
{
@@ -4351,7 +5130,1027 @@
"type": "tidelift"
}
],
- "time": "2025-11-26T14:43:45+00:00"
+ "time": "2026-03-24T13:12:05+00:00"
+ },
+ {
+ "name": "symfony/http-client",
+ "version": "v7.4.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-client.git",
+ "reference": "01933e626c3de76bea1e22641e205e78f6a34342"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-client/zipball/01933e626c3de76bea1e22641e205e78f6a34342",
+ "reference": "01933e626c3de76bea1e22641e205e78f6a34342",
+ "shasum": ""
+ },
+ "require": {
+ "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": {
+ "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",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\HttpClient\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "http"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/http-client/tree/v7.4.8"
+ },
+ "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": "2026-03-30T12:55:43+00:00"
+ },
+ {
+ "name": "symfony/http-client-contracts",
+ "version": "v3.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-client-contracts.git",
+ "reference": "75d7043853a42837e68111812f4d964b01e5101c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/75d7043853a42837e68111812f4d964b01e5101c",
+ "reference": "75d7043853a42837e68111812f4d964b01e5101c",
+ "shasum": ""
+ },
+ "require": {
+ "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": {
+ "Symfony\\Contracts\\HttpClient\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Test/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to HTTP clients",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/http-client-contracts/tree/v3.6.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": "2025-04-29T11:18:49+00:00"
+ },
+ {
+ "name": "symfony/infobip-mailer",
+ "version": "v7.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/infobip-mailer.git",
+ "reference": "eb1253a830f35bb642a52084bbe87cfbde95261f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/infobip-mailer/zipball/eb1253a830f35bb642a52084bbe87cfbde95261f",
+ "reference": "eb1253a830f35bb642a52084bbe87cfbde95261f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/mailer": "^7.2|^8.0",
+ "symfony/mime": "^6.4|^7.0|^8.0"
+ },
+ "conflict": {
+ "symfony/mime": "<6.4"
+ },
+ "require-dev": {
+ "symfony/http-client": "^6.4|^7.0|^8.0"
+ },
+ "type": "symfony-mailer-bridge",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Mailer\\Bridge\\Infobip\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jean-Baptiste Delhommeau",
+ "email": "jeanbadel@gmail.com"
+ },
+ {
+ "name": "Benoit Galati",
+ "email": "benoit.galati@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Infobip Mailer Bridge",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/infobip-mailer/tree/v7.4.0"
+ },
+ "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-08-09T22:28:14+00:00"
+ },
+ {
+ "name": "symfony/mail-pace-mailer",
+ "version": "v7.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/mail-pace-mailer.git",
+ "reference": "f37364729794808f644ec03fc84335dce9fd3573"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/mail-pace-mailer/zipball/f37364729794808f644ec03fc84335dce9fd3573",
+ "reference": "f37364729794808f644ec03fc84335dce9fd3573",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "psr/event-dispatcher": "^1",
+ "symfony/mailer": "^7.2|^8.0"
+ },
+ "require-dev": {
+ "symfony/http-client": "^6.4|^7.0|^8.0"
+ },
+ "type": "symfony-mailer-bridge",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Mailer\\Bridge\\MailPace\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ },
+ {
+ "name": "Paul Oms",
+ "homepage": "https://mailpace.com"
+ }
+ ],
+ "description": "Symfony MailPace Mailer Bridge",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/mail-pace-mailer/tree/v7.4.0"
+ },
+ "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-08-04T07:05:15+00:00"
+ },
+ {
+ "name": "symfony/mailchimp-mailer",
+ "version": "v7.4.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/mailchimp-mailer.git",
+ "reference": "d3d861e9ceeeadcd7b9874f41bd217e9537517a6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/mailchimp-mailer/zipball/d3d861e9ceeeadcd7b9874f41bd217e9537517a6",
+ "reference": "d3d861e9ceeeadcd7b9874f41bd217e9537517a6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/mailer": "^7.2|^8.0"
+ },
+ "conflict": {
+ "symfony/webhook": "<7.2"
+ },
+ "require-dev": {
+ "symfony/http-client": "^6.4|^7.0|^8.0",
+ "symfony/webhook": "^7.2|^8.0"
+ },
+ "type": "symfony-mailer-bridge",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Mailer\\Bridge\\Mailchimp\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Mailchimp Mailer Bridge",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/mailchimp-mailer/tree/v7.4.6"
+ },
+ "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": "2026-02-23T13:47:45+00:00"
+ },
+ {
+ "name": "symfony/mailer",
+ "version": "v7.4.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/mailer.git",
+ "reference": "f6ea532250b476bfc1b56699b388a1bdbf168f62"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/mailer/zipball/f6ea532250b476bfc1b56699b388a1bdbf168f62",
+ "reference": "f6ea532250b476bfc1b56699b388a1bdbf168f62",
+ "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|^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\\Mailer\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Helps sending emails",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/mailer/tree/v7.4.8"
+ },
+ "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": "2026-03-24T13:12:05+00:00"
+ },
+ {
+ "name": "symfony/mailer-send-mailer",
+ "version": "v7.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/mailer-send-mailer.git",
+ "reference": "579a3a41316e4adf69a3e140b840d68f478f95cc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/mailer-send-mailer/zipball/579a3a41316e4adf69a3e140b840d68f478f95cc",
+ "reference": "579a3a41316e4adf69a3e140b840d68f478f95cc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/mailer": "^7.2|^8.0"
+ },
+ "require-dev": {
+ "symfony/http-client": "^6.4|^7.0|^8.0",
+ "symfony/webhook": "^6.3|^7.0|^8.0"
+ },
+ "type": "symfony-mailer-bridge",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Mailer\\Bridge\\MailerSend\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ramunas Pabreza",
+ "email": "doobas@gmail.com"
+ },
+ {
+ "name": "Tautvydas Tijunaitis",
+ "email": "fosron@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony MailerSend Mailer Bridge",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/mailer-send-mailer/tree/v7.4.0"
+ },
+ "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-08-04T07:05:15+00:00"
+ },
+ {
+ "name": "symfony/mailgun-mailer",
+ "version": "v7.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/mailgun-mailer.git",
+ "reference": "ffbcdbf93ed0700f083a6307acfb8f78dd3f091b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/mailgun-mailer/zipball/ffbcdbf93ed0700f083a6307acfb8f78dd3f091b",
+ "reference": "ffbcdbf93ed0700f083a6307acfb8f78dd3f091b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/mailer": "^7.2|^8.0"
+ },
+ "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": {
+ "psr-4": {
+ "Symfony\\Component\\Mailer\\Bridge\\Mailgun\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Mailgun Mailer Bridge",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/mailgun-mailer/tree/v7.4.0"
+ },
+ "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-08-04T07:05:15+00:00"
+ },
+ {
+ "name": "symfony/mailjet-mailer",
+ "version": "v7.4.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/mailjet-mailer.git",
+ "reference": "e41b20b2bcb3bfc263395afc47b9df5911ceaa8f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/mailjet-mailer/zipball/e41b20b2bcb3bfc263395afc47b9df5911ceaa8f",
+ "reference": "e41b20b2bcb3bfc263395afc47b9df5911ceaa8f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/mailer": "^7.3|^8.0"
+ },
+ "conflict": {
+ "symfony/mime": "<6.2"
+ },
+ "require-dev": {
+ "symfony/http-client": "^6.4|^7.0|^8.0",
+ "symfony/webhook": "^6.4|^7.0|^8.0"
+ },
+ "type": "symfony-mailer-bridge",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Mailer\\Bridge\\Mailjet\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Mailjet Mailer Bridge",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/mailjet-mailer/tree/v7.4.7"
+ },
+ "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": "2026-03-04T13:54:41+00:00"
+ },
+ {
+ "name": "symfony/mailomat-mailer",
+ "version": "v7.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/mailomat-mailer.git",
+ "reference": "bcadc6483b45c470a7e2c8c957162cb3a83f4300"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/mailomat-mailer/zipball/bcadc6483b45c470a7e2c8c957162cb3a83f4300",
+ "reference": "bcadc6483b45c470a7e2c8c957162cb3a83f4300",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/mailer": "^7.2|^8.0"
+ },
+ "conflict": {
+ "symfony/http-foundation": "<7.1"
+ },
+ "require-dev": {
+ "symfony/http-client": "^6.4|^7.0|^8.0",
+ "symfony/http-foundation": "^7.1|^8.0",
+ "symfony/webhook": "^6.4|^7.0|^8.0"
+ },
+ "type": "symfony-mailer-bridge",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Mailer\\Bridge\\Mailomat\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Patrick Landolt",
+ "email": "patrick.landolt@artack.ch"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Mailomat Mailer Bridge",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/mailomat-mailer/tree/v7.4.0"
+ },
+ "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-08-04T07:05:15+00:00"
+ },
+ {
+ "name": "symfony/mailtrap-mailer",
+ "version": "v7.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/mailtrap-mailer.git",
+ "reference": "40f93b3bf73f5dd486ba31d2e825780d68ad4303"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/mailtrap-mailer/zipball/40f93b3bf73f5dd486ba31d2e825780d68ad4303",
+ "reference": "40f93b3bf73f5dd486ba31d2e825780d68ad4303",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "psr/event-dispatcher": "^1",
+ "symfony/mailer": "^7.2|^8.0"
+ },
+ "conflict": {
+ "symfony/webhook": "<7.2"
+ },
+ "require-dev": {
+ "symfony/http-client": "^6.4|^7.0|^8.0",
+ "symfony/webhook": "^7.2|^8.0"
+ },
+ "type": "symfony-mailer-bridge",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Mailer\\Bridge\\Mailtrap\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Mailtrap Mailer Bridge",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/mailtrap-mailer/tree/v7.4.0"
+ },
+ "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-08-22T08:09:19+00:00"
+ },
+ {
+ "name": "symfony/microsoft-graph-mailer",
+ "version": "v7.4.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/microsoft-graph-mailer.git",
+ "reference": "e9dc42d3c9fb0a3349a4947d51bdbe5b6638aa5c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/microsoft-graph-mailer/zipball/e9dc42d3c9fb0a3349a4947d51bdbe5b6638aa5c",
+ "reference": "e9dc42d3c9fb0a3349a4947d51bdbe5b6638aa5c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/clock": "^7.4|^8.0",
+ "symfony/http-client": "^6.4|^7.0|^8.0",
+ "symfony/mailer": "^7.4|^8.0"
+ },
+ "type": "symfony-mailer-bridge",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Mailer\\Bridge\\MicrosoftGraph\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bob van de Vijver",
+ "homepage": "https://github.com/bobvandevijver"
+ },
+ {
+ "name": "Kevin Nguyen",
+ "homepage": "https://github.com/nguyenk"
+ },
+ {
+ "name": "The Coding Machine",
+ "homepage": "https://github.com/thecodingmachine"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Microsoft Graph Mailer Bridge",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/microsoft-graph-mailer/tree/v7.4.6"
+ },
+ "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": "2026-02-09T12:07:29+00:00"
+ },
+ {
+ "name": "symfony/mime",
+ "version": "v7.4.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/mime.git",
+ "reference": "6df02f99998081032da3407a8d6c4e1dcb5d4379"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/mime/zipball/6df02f99998081032da3407a8d6c4e1dcb5d4379",
+ "reference": "6df02f99998081032da3407a8d6c4e1dcb5d4379",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-intl-idn": "^1.10",
+ "symfony/polyfill-mbstring": "^1.0"
+ },
+ "conflict": {
+ "egulias/email-validator": "~3.0.0",
+ "phpdocumentor/reflection-docblock": "<5.2|>=7",
+ "phpdocumentor/type-resolver": "<1.5.1",
+ "symfony/mailer": "<6.4",
+ "symfony/serializer": "<6.4.3|>7.0,<7.0.3"
+ },
+ "require-dev": {
+ "egulias/email-validator": "^2.1.10|^3.1|^4",
+ "league/html-to-markdown": "^5.0",
+ "phpdocumentor/reflection-docblock": "^5.2|^6.0",
+ "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"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Mime\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Allows manipulating MIME messages",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "mime",
+ "mime-type"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/mime/tree/v7.4.8"
+ },
+ "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": "2026-03-30T14:11:46+00:00"
},
{
"name": "symfony/polyfill-ctype",
@@ -4518,6 +6317,93 @@
],
"time": "2025-06-27T09:58:17+00:00"
},
+ {
+ "name": "symfony/polyfill-intl-idn",
+ "version": "v1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-idn.git",
+ "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3",
+ "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2",
+ "symfony/polyfill-intl-normalizer": "^1.10"
+ },
+ "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\\Polyfill\\Intl\\Idn\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Laurent Bassin",
+ "email": "laurent@bassin.info"
+ },
+ {
+ "name": "Trevor Rowbotham",
+ "email": "trevor.rowbotham@pm.me"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "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/polyfill-intl-idn/tree/v1.33.0"
+ },
+ "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": "2024-09-10T14:38:51+00:00"
+ },
{
"name": "symfony/polyfill-intl-normalizer",
"version": "v1.33.0",
@@ -4689,17 +6575,17 @@
"time": "2024-12-23T08:48:59+00:00"
},
{
- "name": "symfony/polyfill-php73",
+ "name": "symfony/polyfill-php83",
"version": "v1.33.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-php73.git",
- "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb"
+ "url": "https://github.com/symfony/polyfill-php83.git",
+ "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb",
- "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb",
+ "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5",
+ "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5",
"shasum": ""
},
"require": {
@@ -4717,7 +6603,7 @@
"bootstrap.php"
],
"psr-4": {
- "Symfony\\Polyfill\\Php73\\": ""
+ "Symfony\\Polyfill\\Php83\\": ""
},
"classmap": [
"Resources/stubs"
@@ -4737,7 +6623,7 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
+ "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
@@ -4746,7 +6632,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php73/tree/v1.33.0"
+ "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0"
},
"funding": [
{
@@ -4766,41 +6652,36 @@
"type": "tidelift"
}
],
- "time": "2024-09-09T11:45:10+00:00"
+ "time": "2025-07-08T02:45:35+00:00"
},
{
- "name": "symfony/polyfill-php80",
- "version": "v1.33.0",
+ "name": "symfony/postal-mailer",
+ "version": "v7.4.6",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-php80.git",
- "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608"
+ "url": "https://github.com/symfony/postal-mailer.git",
+ "reference": "a2f2d915861fac611323c1f256d9b841dce44c92"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608",
- "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608",
+ "url": "https://api.github.com/repos/symfony/postal-mailer/zipball/a2f2d915861fac611323c1f256d9b841dce44c92",
+ "reference": "a2f2d915861fac611323c1f256d9b841dce44c92",
"shasum": ""
},
"require": {
- "php": ">=7.2"
+ "php": ">=8.2",
+ "symfony/mailer": "^7.2|^8.0"
},
- "type": "library",
- "extra": {
- "thanks": {
- "url": "https://github.com/symfony/polyfill",
- "name": "symfony/polyfill"
- }
+ "require-dev": {
+ "symfony/http-client": "^6.4|^7.0|^8.0"
},
+ "type": "symfony-mailer-bridge",
"autoload": {
- "files": [
- "bootstrap.php"
- ],
"psr-4": {
- "Symfony\\Polyfill\\Php80\\": ""
+ "Symfony\\Component\\Mailer\\Bridge\\Postal\\": ""
},
- "classmap": [
- "Resources/stubs"
+ "exclude-from-classmap": [
+ "/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -4809,28 +6690,18 @@
],
"authors": [
{
- "name": "Ion Bazan",
- "email": "ion.bazan@gmail.com"
- },
- {
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
+ "name": "Jonas Claes",
+ "homepage": "https://github.com/jonasclaes"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+ "description": "Symfony Postal Mailer Bridge",
"homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "polyfill",
- "portable",
- "shim"
- ],
"support": {
- "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0"
+ "source": "https://github.com/symfony/postal-mailer/tree/v7.4.6"
},
"funding": [
{
@@ -4850,24 +6721,98 @@
"type": "tidelift"
}
],
- "time": "2025-01-02T08:10:11+00:00"
+ "time": "2026-02-23T11:56:35+00:00"
+ },
+ {
+ "name": "symfony/postmark-mailer",
+ "version": "v7.4.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/postmark-mailer.git",
+ "reference": "8b573474e89368f1ddb25b43fd86a6dd51343e9b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/postmark-mailer/zipball/8b573474e89368f1ddb25b43fd86a6dd51343e9b",
+ "reference": "8b573474e89368f1ddb25b43fd86a6dd51343e9b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "psr/event-dispatcher": "^1",
+ "symfony/mailer": "^7.2|^8.0"
+ },
+ "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": {
+ "psr-4": {
+ "Symfony\\Component\\Mailer\\Bridge\\Postmark\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Postmark Mailer Bridge",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/postmark-mailer/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"
+ }
+ ],
+ "time": "2026-01-08T08:25:11+00:00"
},
{
"name": "symfony/process",
- "version": "v6.4.31",
+ "version": "v7.4.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
- "reference": "8541b7308fca001320e90bca8a73a28aa5604a6e"
+ "reference": "60f19cd3badc8de688421e21e4305eba50f8089a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/8541b7308fca001320e90bca8a73a28aa5604a6e",
- "reference": "8541b7308fca001320e90bca8a73a28aa5604a6e",
+ "url": "https://api.github.com/repos/symfony/process/zipball/60f19cd3badc8de688421e21e4305eba50f8089a",
+ "reference": "60f19cd3badc8de688421e21e4305eba50f8089a",
"shasum": ""
},
"require": {
- "php": ">=8.1"
+ "php": ">=8.2"
},
"type": "library",
"autoload": {
@@ -4895,7 +6840,7 @@
"description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/process/tree/v6.4.31"
+ "source": "https://github.com/symfony/process/tree/v7.4.8"
},
"funding": [
{
@@ -4915,7 +6860,225 @@
"type": "tidelift"
}
],
- "time": "2025-12-15T19:26:35+00:00"
+ "time": "2026-03-24T13:12:05+00:00"
+ },
+ {
+ "name": "symfony/resend-mailer",
+ "version": "v7.4.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/resend-mailer.git",
+ "reference": "eb7f4d83128eef12fcceccf33e5b4b89f2e2474f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/resend-mailer/zipball/eb7f4d83128eef12fcceccf33e5b4b89f2e2474f",
+ "reference": "eb7f4d83128eef12fcceccf33e5b4b89f2e2474f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/mailer": "^7.2|^8.0"
+ },
+ "conflict": {
+ "symfony/http-foundation": "<7.1"
+ },
+ "require-dev": {
+ "symfony/http-client": "^6.4|^7.0|^8.0",
+ "symfony/http-foundation": "^7.1|^8.0",
+ "symfony/webhook": "^6.4|^7.0|^8.0"
+ },
+ "type": "symfony-mailer-bridge",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Mailer\\Bridge\\Resend\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mathieu Santostefano",
+ "homepage": "https://github.com/welcoMattic"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Resend Mailer Bridge",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/resend-mailer/tree/v7.4.6"
+ },
+ "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": "2026-02-09T14:10:20+00:00"
+ },
+ {
+ "name": "symfony/scaleway-mailer",
+ "version": "v7.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/scaleway-mailer.git",
+ "reference": "bf9b8f6133d74b620b7c2e90b6fa4bd1469832e9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/scaleway-mailer/zipball/bf9b8f6133d74b620b7c2e90b6fa4bd1469832e9",
+ "reference": "bf9b8f6133d74b620b7c2e90b6fa4bd1469832e9",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/mailer": "^7.2|^8.0"
+ },
+ "require-dev": {
+ "symfony/http-client": "^6.4|^7.0|^8.0"
+ },
+ "type": "symfony-mailer-bridge",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Mailer\\Bridge\\Scaleway\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Scaleway Mailer Bridge",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/scaleway-mailer/tree/v7.4.0"
+ },
+ "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-08-04T07:05:15+00:00"
+ },
+ {
+ "name": "symfony/sendgrid-mailer",
+ "version": "v7.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/sendgrid-mailer.git",
+ "reference": "48e81fdbeb443a8094b7d5322d4c1a2023c40a57"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/sendgrid-mailer/zipball/48e81fdbeb443a8094b7d5322d4c1a2023c40a57",
+ "reference": "48e81fdbeb443a8094b7d5322d4c1a2023c40a57",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/mailer": "^7.2|^8.0"
+ },
+ "conflict": {
+ "symfony/http-foundation": "<6.4",
+ "symfony/mime": "<6.4",
+ "symfony/webhook": "<7.2"
+ },
+ "require-dev": {
+ "symfony/http-client": "^6.4|^7.0|^8.0",
+ "symfony/webhook": "^7.2|^8.0"
+ },
+ "type": "symfony-mailer-bridge",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Mailer\\Bridge\\Sendgrid\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Sendgrid Mailer Bridge",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/sendgrid-mailer/tree/v7.4.0"
+ },
+ "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-09-16T14:23:56+00:00"
},
{
"name": "symfony/service-contracts",
@@ -5006,22 +7169,23 @@
},
{
"name": "symfony/string",
- "version": "v6.4.30",
+ "version": "v7.4.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
- "reference": "50590a057841fa6bf69d12eceffce3465b9e32cb"
+ "reference": "114ac57257d75df748eda23dd003878080b8e688"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/50590a057841fa6bf69d12eceffce3465b9e32cb",
- "reference": "50590a057841fa6bf69d12eceffce3465b9e32cb",
+ "url": "https://api.github.com/repos/symfony/string/zipball/114ac57257d75df748eda23dd003878080b8e688",
+ "reference": "114ac57257d75df748eda23dd003878080b8e688",
"shasum": ""
},
"require": {
- "php": ">=8.1",
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3.0",
"symfony/polyfill-ctype": "~1.8",
- "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-grapheme": "~1.33",
"symfony/polyfill-intl-normalizer": "~1.0",
"symfony/polyfill-mbstring": "~1.0"
},
@@ -5029,10 +7193,11 @@
"symfony/translation-contracts": "<2.5"
},
"require-dev": {
- "symfony/http-client": "^5.4|^6.0|^7.0",
- "symfony/intl": "^6.2|^7.0",
+ "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": "^5.4|^6.0|^7.0"
+ "symfony/var-exporter": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -5071,7 +7236,7 @@
"utf8"
],
"support": {
- "source": "https://github.com/symfony/string/tree/v6.4.30"
+ "source": "https://github.com/symfony/string/tree/v7.4.8"
},
"funding": [
{
@@ -5091,20 +7256,94 @@
"type": "tidelift"
}
],
- "time": "2025-11-21T18:03:05+00:00"
+ "time": "2026-03-24T13:12:05+00:00"
},
{
- "name": "symfony/var-dumper",
- "version": "v6.4.26",
+ "name": "symfony/sweego-mailer",
+ "version": "v7.4.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/var-dumper.git",
- "reference": "cfae1497a2f1eaad78dbc0590311c599c7178d4a"
+ "url": "https://github.com/symfony/sweego-mailer.git",
+ "reference": "8ab5f920ce2bb60757ab633cda9c0bac39f502a8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-dumper/zipball/cfae1497a2f1eaad78dbc0590311c599c7178d4a",
- "reference": "cfae1497a2f1eaad78dbc0590311c599c7178d4a",
+ "url": "https://api.github.com/repos/symfony/sweego-mailer/zipball/8ab5f920ce2bb60757ab633cda9c0bac39f502a8",
+ "reference": "8ab5f920ce2bb60757ab633cda9c0bac39f502a8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/mailer": "^7.2|^8.0"
+ },
+ "conflict": {
+ "symfony/http-foundation": "<7.1"
+ },
+ "require-dev": {
+ "symfony/http-client": "^6.4|^7.0|^8.0",
+ "symfony/http-foundation": "^7.1|^8.0",
+ "symfony/webhook": "^6.4|^7.0|^8.0"
+ },
+ "type": "symfony-mailer-bridge",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Mailer\\Bridge\\Sweego\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mathieu Santostefano",
+ "homepage": "https://github.com/welcoMattic"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Sweego Mailer Bridge",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/sweego-mailer/tree/v7.4.0"
+ },
+ "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-21T15:26:00+00:00"
+ },
+ {
+ "name": "symfony/var-dumper",
+ "version": "v6.4.36",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/var-dumper.git",
+ "reference": "7c8ad9ce4faf6c8a99948e70ce02b601a0439782"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/7c8ad9ce4faf6c8a99948e70ce02b601a0439782",
+ "reference": "7c8ad9ce4faf6c8a99948e70ce02b601a0439782",
"shasum": ""
},
"require": {
@@ -5159,7 +7398,7 @@
"dump"
],
"support": {
- "source": "https://github.com/symfony/var-dumper/tree/v6.4.26"
+ "source": "https://github.com/symfony/var-dumper/tree/v6.4.36"
},
"funding": [
{
@@ -5179,30 +7418,30 @@
"type": "tidelift"
}
],
- "time": "2025-09-25T15:37:27+00:00"
+ "time": "2026-03-30T15:36:00+00:00"
},
{
"name": "symfony/var-exporter",
- "version": "v6.4.26",
+ "version": "v7.4.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-exporter.git",
- "reference": "466fcac5fa2e871f83d31173f80e9c2684743bfc"
+ "reference": "398907e89a2a56fe426f7955c6fa943ec0c77225"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-exporter/zipball/466fcac5fa2e871f83d31173f80e9c2684743bfc",
- "reference": "466fcac5fa2e871f83d31173f80e9c2684743bfc",
+ "url": "https://api.github.com/repos/symfony/var-exporter/zipball/398907e89a2a56fe426f7955c6fa943ec0c77225",
+ "reference": "398907e89a2a56fe426f7955c6fa943ec0c77225",
"shasum": ""
},
"require": {
- "php": ">=8.1",
+ "php": ">=8.2",
"symfony/deprecation-contracts": "^2.5|^3"
},
"require-dev": {
- "symfony/property-access": "^6.4|^7.0",
- "symfony/serializer": "^6.4|^7.0",
- "symfony/var-dumper": "^5.4|^6.0|^7.0"
+ "symfony/property-access": "^6.4|^7.0|^8.0",
+ "symfony/serializer": "^6.4|^7.0|^8.0",
+ "symfony/var-dumper": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -5240,7 +7479,7 @@
"serialize"
],
"support": {
- "source": "https://github.com/symfony/var-exporter/tree/v6.4.26"
+ "source": "https://github.com/symfony/var-exporter/tree/v7.4.8"
},
"funding": [
{
@@ -5260,50 +7499,35 @@
"type": "tidelift"
}
],
- "time": "2025-09-11T09:57:09+00:00"
+ "time": "2026-03-24T13:12:05+00:00"
},
{
"name": "thecodingmachine/safe",
- "version": "v2.5.0",
+ "version": "v3.4.0",
"source": {
"type": "git",
"url": "https://github.com/thecodingmachine/safe.git",
- "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0"
+ "reference": "705683a25bacf0d4860c7dea4d7947bfd09eea19"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/3115ecd6b4391662b4931daac4eba6b07a2ac1f0",
- "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0",
+ "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/705683a25bacf0d4860c7dea4d7947bfd09eea19",
+ "reference": "705683a25bacf0d4860c7dea4d7947bfd09eea19",
"shasum": ""
},
"require": {
- "php": "^8.0"
+ "php": "^8.1"
},
"require-dev": {
- "phpstan/phpstan": "^1.5",
- "phpunit/phpunit": "^9.5",
- "squizlabs/php_codesniffer": "^3.2",
- "thecodingmachine/phpstan-strict-rules": "^1.0"
+ "php-parallel-lint/php-parallel-lint": "^1.4",
+ "phpstan/phpstan": "^2",
+ "phpunit/phpunit": "^10",
+ "squizlabs/php_codesniffer": "^3.2"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.2.x-dev"
- }
- },
"autoload": {
"files": [
- "deprecated/apc.php",
- "deprecated/array.php",
- "deprecated/datetime.php",
- "deprecated/libevent.php",
- "deprecated/misc.php",
- "deprecated/password.php",
- "deprecated/mssql.php",
- "deprecated/stats.php",
- "deprecated/strings.php",
"lib/special_cases.php",
- "deprecated/mysqli.php",
"generated/apache.php",
"generated/apcu.php",
"generated/array.php",
@@ -5343,6 +7567,7 @@
"generated/mbstring.php",
"generated/misc.php",
"generated/mysql.php",
+ "generated/mysqli.php",
"generated/network.php",
"generated/oci8.php",
"generated/opcache.php",
@@ -5355,6 +7580,7 @@
"generated/ps.php",
"generated/pspell.php",
"generated/readline.php",
+ "generated/rnp.php",
"generated/rpminfo.php",
"generated/rrd.php",
"generated/sem.php",
@@ -5386,7 +7612,6 @@
"lib/DateTime.php",
"lib/DateTimeImmutable.php",
"lib/Exceptions/",
- "deprecated/Exceptions/",
"generated/Exceptions/"
]
},
@@ -5397,76 +7622,27 @@
"description": "PHP core functions that throw exceptions instead of returning FALSE on error",
"support": {
"issues": "https://github.com/thecodingmachine/safe/issues",
- "source": "https://github.com/thecodingmachine/safe/tree/v2.5.0"
+ "source": "https://github.com/thecodingmachine/safe/tree/v3.4.0"
},
- "time": "2023-04-05T11:54:14+00:00"
- },
- {
- "name": "xrdebug/php",
- "version": "3.0.1",
- "source": {
- "type": "git",
- "url": "https://github.com/xrdebug/php.git",
- "reference": "9df68ba66668b0072abb91859d27407d6772f0fd"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/xrdebug/php/zipball/9df68ba66668b0072abb91859d27407d6772f0fd",
- "reference": "9df68ba66668b0072abb91859d27407d6772f0fd",
- "shasum": ""
- },
- "require": {
- "chevere/filesystem": "^1.0.3",
- "chevere/message": "^1.0.0",
- "chevere/standard": "^1.0.1",
- "chevere/throwable-handler": "^1.0.7",
- "chevere/trace": "^2.0.2",
- "chevere/var-dump": "^2.0.6",
- "ext-curl": "*",
- "ext-json": "*",
- "php": "^8.1",
- "phpseclib/phpseclib": "~3.0"
- },
- "require-dev": {
- "dg/bypass-finals": "^1.4",
- "phpstan/phpstan": "^2.0",
- "phpunit/phpunit": "^9.5",
- "symplify/easy-coding-standard": "^11.1"
- },
- "type": "library",
- "autoload": {
- "files": [
- "src/functions.php"
- ],
- "psr-4": {
- "Chevere\\xrDebug\\PHP\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "Apache-2.0"
- ],
- "authors": [
+ "funding": [
{
- "name": "Rodolfo Berrios",
- "email": "rodolfo@chevere.org",
- "homepage": "https://rodolfoberrios.com"
+ "url": "https://github.com/OskarStark",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/shish",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/silasjoisten",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/staabm",
+ "type": "github"
}
],
- "description": "PHP client library for xrDebug",
- "homepage": "https://github.com/xrdebug/php",
- "keywords": [
- "chevere",
- "debug",
- "debugging",
- "dump",
- "xrdebug"
- ],
- "support": {
- "issues": "https://github.com/xrdebug/php/issues",
- "source": "https://github.com/xrdebug/php/tree/3.0.1"
- },
- "time": "2025-09-12T21:27:45+00:00"
+ "time": "2026-02-04T18:08:13+00:00"
}
],
"packages-dev": [
@@ -5720,11 +7896,11 @@
},
{
"name": "phpstan/phpstan",
- "version": "1.12.32",
+ "version": "1.12.33",
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan/zipball/2770dcdf5078d0b0d53f94317e06affe88419aa8",
- "reference": "2770dcdf5078d0b0d53f94317e06affe88419aa8",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/37982d6fc7cbb746dda7773530cda557cdf119e1",
+ "reference": "37982d6fc7cbb746dda7773530cda557cdf119e1",
"shasum": ""
},
"require": {
@@ -5769,7 +7945,7 @@
"type": "github"
}
],
- "time": "2025-09-30T10:16:31+00:00"
+ "time": "2026-02-28T20:30:03+00:00"
},
{
"name": "phpunit/php-code-coverage",
@@ -6092,16 +8268,16 @@
},
{
"name": "phpunit/phpunit",
- "version": "9.6.31",
+ "version": "9.6.34",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "945d0b7f346a084ce5549e95289962972c4272e5"
+ "reference": "b36f02317466907a230d3aa1d34467041271ef4a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/945d0b7f346a084ce5549e95289962972c4272e5",
- "reference": "945d0b7f346a084ce5549e95289962972c4272e5",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b36f02317466907a230d3aa1d34467041271ef4a",
+ "reference": "b36f02317466907a230d3aa1d34467041271ef4a",
"shasum": ""
},
"require": {
@@ -6123,7 +8299,7 @@
"phpunit/php-timer": "^5.0.3",
"sebastian/cli-parser": "^1.0.2",
"sebastian/code-unit": "^1.0.8",
- "sebastian/comparator": "^4.0.9",
+ "sebastian/comparator": "^4.0.10",
"sebastian/diff": "^4.0.6",
"sebastian/environment": "^5.1.5",
"sebastian/exporter": "^4.0.8",
@@ -6175,7 +8351,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
- "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.31"
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.34"
},
"funding": [
{
@@ -6199,7 +8375,7 @@
"type": "tidelift"
}
],
- "time": "2025-12-06T07:45:52+00:00"
+ "time": "2026-01-27T05:45:00+00:00"
},
{
"name": "sebastian/cli-parser",
@@ -6370,16 +8546,16 @@
},
{
"name": "sebastian/comparator",
- "version": "4.0.9",
+ "version": "4.0.10",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git",
- "reference": "67a2df3a62639eab2cc5906065e9805d4fd5dfc5"
+ "reference": "e4df00b9b3571187db2831ae9aada2c6efbd715d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/67a2df3a62639eab2cc5906065e9805d4fd5dfc5",
- "reference": "67a2df3a62639eab2cc5906065e9805d4fd5dfc5",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/e4df00b9b3571187db2831ae9aada2c6efbd715d",
+ "reference": "e4df00b9b3571187db2831ae9aada2c6efbd715d",
"shasum": ""
},
"require": {
@@ -6432,7 +8608,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/comparator/issues",
- "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.9"
+ "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.10"
},
"funding": [
{
@@ -6452,7 +8628,7 @@
"type": "tidelift"
}
],
- "time": "2025-08-10T06:51:50+00:00"
+ "time": "2026-01-24T09:22:56+00:00"
},
{
"name": "sebastian/complexity",
@@ -7330,11 +9506,11 @@
"prefer-stable": true,
"prefer-lowest": false,
"platform": {
- "php": "^8.1"
+ "php": "^8.2"
},
"platform-dev": {},
"platform-overrides": {
- "php": "8.1.28"
+ "php": "8.2"
},
"plugin-api-version": "2.9.0"
}
diff --git a/app/env-default.php b/app/env-default.php
index 177e459..6ab9c9a 100644
--- a/app/env-default.php
+++ b/app/env-default.php
@@ -90,7 +90,6 @@ return [
'CHEVERETO_HTTPS' => '1',
'CHEVERETO_IMAGE_FORMATS_AVAILABLE' => '["AVIF","JPEG","PNG","BMP","GIF","WEBP"]',
'CHEVERETO_IMAGE_LIBRARY' => 'imagick',
- 'CHEVERETO_JOBS_WORKER_INTERVAL' => '300',
'CHEVERETO_MAX_ADMINS' => '0',
'CHEVERETO_MAX_ALBUMS' => '0',
'CHEVERETO_MAX_CACHE_TTL' => '86400',
@@ -115,6 +114,8 @@ return [
'CHEVERETO_MIN_STORAGES_ACTIVE' => '0',
'CHEVERETO_PROVIDER_NAME' => 'Self-hosted Chevereto',
'CHEVERETO_PROVIDER_URL' => '',
+ 'CHEVERETO_SCHEDULER_INTERVAL' => '300',
+ 'CHEVERETO_SERVICE_NAME' => 'app',
'CHEVERETO_SERVICING' => 'server',
'CHEVERETO_SESSION_SAVE_HANDLER' => 'files',
'CHEVERETO_SESSION_SAVE_PATH' => '/tmp',
@@ -123,6 +124,7 @@ return [
'CHEVERETO_TENANTS_API_ALLOW_LIST' => '',
'CHEVERETO_TENANTS_API_KEY_SECRET' => '',
'CHEVERETO_TENANTS_API_REQUEST_SECRET' => '',
+ 'CHEVERETO_TRIAL' => '0',
'CHEVERETO_XRDEBUG_HOST' => 'localhost',
'CHEVERETO_XRDEBUG_HTTPS' => '0',
'CHEVERETO_XRDEBUG_KEY' => '',
diff --git a/app/legacy/commands/password-reset.php b/app/legacy/commands/password-reset.php
index 5bf31d2..b8a921d 100644
--- a/app/legacy/commands/password-reset.php
+++ b/app/legacy/commands/password-reset.php
@@ -10,16 +10,22 @@
*/
use Chevereto\Legacy\Classes\Login;
+use Chevereto\Legacy\Classes\Settings;
use Chevereto\Legacy\Classes\User;
use function Chevere\Standard\randomString;
-$opts = getopt('C:u:') ?: [];
+$opts = getopt('C:u:x:') ?: [];
$missing = [];
if (! isset($opts['u'])) {
echo '[Error] Missing username' . "\n";
exit(255);
}
-$password = randomString(24);
+$password = $opts['x'] ?? randomString(24);
+if (! preg_match('/' . Settings::USER_PASSWORD_PATTERN . '/', $password)) {
+ echo '[Error] Invalid password' . "\n";
+ exit(255);
+}
+
$user = User::getSingle($opts['u'], 'username');
if ($user === []) {
echo '[Error] User not found' . "\n";
diff --git a/app/src/Legacy/Classes/Mailer.php b/app/legacy/commands/version-installed.php
similarity index 52%
rename from app/src/Legacy/Classes/Mailer.php
rename to app/legacy/commands/version-installed.php
index b204c0a..bbce376 100644
--- a/app/src/Legacy/Classes/Mailer.php
+++ b/app/legacy/commands/version-installed.php
@@ -9,11 +9,11 @@
* file that was distributed with this source code.
*/
-namespace Chevereto\Legacy\Classes;
+use function Chevereto\Legacy\cheveretoVersionInstalled;
-use PHPMailer\PHPMailer\PHPMailer;
-
-class Mailer extends PHPMailer
-{
- public $XMailer = ' ';
+$version = cheveretoVersionInstalled();
+if ($version === '') {
+ echo 'Chevereto is not installed' . PHP_EOL;
+ exit(255);
}
+echo $version . PHP_EOL;
diff --git a/app/legacy/entrypoints/cli.php b/app/legacy/entrypoints/cli.php
index dd45242..616421e 100644
--- a/app/legacy/entrypoints/cli.php
+++ b/app/legacy/entrypoints/cli.php
@@ -41,6 +41,7 @@ $options = [
'setting-update',
'database-migrate',
'version',
+ 'version-installed',
'stats',
'stats-rebuild',
];
diff --git a/app/legacy/install/installer.php b/app/legacy/install/installer.php
index cc67b14..ec9d1cb 100644
--- a/app/legacy/install/installer.php
+++ b/app/legacy/install/installer.php
@@ -59,6 +59,16 @@ if (cheveretoVersionInstalled() !== ''
throw new LogicException(message('Request denied. You must be an admin to be here.'), 403);
}
+if ((env()['CHEVERETO_TENANT'] ?? '') !== '') {
+ if (env()['CHEVERETO_DB_TABLE_PREFIX'] === env()['CHEVERETO_DB_TABLE_ROOT_PREFIX']
+ || env()['CHEVERETO_CACHE_KEY_PREFIX'] === env()['CHEVERETO_CACHE_KEY_ROOT_PREFIX']
+ ) {
+ throw new LogicException(
+ 'Tenant namespace collision detected. Refusing install/update with root prefixes.',
+ 600
+ );
+ }
+}
if (function_exists('opcache_reset')) {
try {
opcache_reset();
@@ -121,7 +131,7 @@ $settings_updates = [
// 'google' => 0, // Deprecated in 4.0.0-beta.11
// 'google_client_id' => '',
// 'google_client_secret' => '',
- 'guest_uploads' => 1,
+ 'guest_uploads' => intval(env()['CHEVERETO_CONTEXT'] !== 'saas'),
'listing_items_per_page' => '24',
'maintenance' => 0,
'captcha' => 0, //recaptcha
@@ -660,6 +670,36 @@ $settings_updates = [
'4.4.0' => null,
'4.4.1' => null,
'4.4.2' => null,
+ '4.5.0' => [
+ 'email_ahasend_api_key' => '',
+ 'email_ses_access_key' => '',
+ 'email_ses_secret_key' => '',
+ 'email_azure_resource_name' => '',
+ 'email_azure_key' => '',
+ 'email_brevo_api_key' => '',
+ 'email_infobip_api_key' => '',
+ 'email_infobip_base_url' => '',
+ 'email_mailgun_api_key' => '',
+ 'email_mailgun_domain' => '',
+ 'email_mailjet_access_key' => '',
+ 'email_mailjet_secret_key' => '',
+ 'email_mailomat_api_key' => '',
+ 'email_mailpace_api_token' => '',
+ 'email_mailersend_api_key' => '',
+ 'email_mailtrap_api_token' => '',
+ 'email_mandrill_api_key' => '',
+ 'email_microsoftgraph_client_id' => '',
+ 'email_microsoftgraph_client_secret' => '',
+ 'email_microsoftgraph_tenant_id' => '',
+ 'email_postal_api_key' => '',
+ 'email_postal_base_url' => '',
+ 'email_postmark_api_token' => '',
+ 'email_resend_api_key' => '',
+ 'email_scaleway_project_id' => '',
+ 'email_scaleway_api_key' => '',
+ 'email_sendgrid_api_key' => '',
+ 'email_sweego_api_key' => '',
+ ],
];
/**
diff --git a/app/legacy/load/app.php b/app/legacy/load/app.php
index 8e5341a..a1deb22 100644
--- a/app/legacy/load/app.php
+++ b/app/legacy/load/app.php
@@ -9,5 +9,5 @@
* file that was distributed with this source code.
*/
-const APP_VERSION = '4.4.2';
-const APP_VERSION_AKA = 'vivaracho';
+const APP_VERSION = '4.5.0';
+const APP_VERSION_AKA = 'elevado';
diff --git a/app/legacy/load/register-handlers.php b/app/legacy/load/register-handlers.php
index 638ef73..bb16d0f 100644
--- a/app/legacy/load/register-handlers.php
+++ b/app/legacy/load/register-handlers.php
@@ -93,21 +93,49 @@ set_exception_handler(function (Throwable $throwable) {
$internalHandler = $publicHandler->withIsDebug(true);
$doDebug = in_array($debugLevel, [2, 3], true) || isDebug();
if ($doDebug === false) {
- $publicHandler = $publicHandler
- ->withIsDebug($doDebug)
- ->withPutExtra(
- 'Why am I seeing this?',
+ $incidentId = $publicHandler->id();
+ $providerName = getenv('CHEVERETO_PROVIDER_NAME') ?: '';
+ $providerUrl = getenv('CHEVERETO_PROVIDER_URL') ?: '#';
+ if (getenv('CHEVERETO_CONTEXT') === 'saas') {
+ $title = 'Service temporarily unavailable';
+ $message = "We're already on it! Our team has been automatically notified and is working to resolve this issue.";
+ $ownerGuide = strtr(
<<Our team is already investigating this incident. For immediate assistance, contact %providerLink% support with incident ID %id%.
+ HTML,
+ [
+ '%providerLink%' => <<{$providerName}
+ HTML,
+ '%id%' => $incidentId,
+ ]
+ );
+ } else {
+ $title = 'Something went wrong';
+ $message = 'Please try again later. If the error persists you may need to contact the website owner.';
+ $ownerGuide = <<This error has been logged with ID {$incidentId}. To diagnose the issue:
+
+ Check your server error logs for this ID
+ Review the debugging guide in the documentation
+ Need help? Check our support alternatives
+
+ HTML;
+ }
+ $publicHandler = $publicHandler
+ ->withTitle($title)
+ ->withIsDebug($doDebug)
+ ->withMessage($message)
+ ->withPutExtra(
+ 'What happened?',
+ <<A technical error has occurred. The incident has been logged for investigation.
HTML
)
->withPutExtra(
- 'Administrator guide',
+ 'Are you the owner of this website?',
<<
- Refer to the Chevereto documentation to understand how to debug this error.
- Need help? Visit Chevereto support to open a ticket.
-
+ {$ownerGuide}
HTML
);
diff --git a/app/legacy/load/web.php b/app/legacy/load/web.php
index ba6801c..ab735c0 100644
--- a/app/legacy/load/web.php
+++ b/app/legacy/load/web.php
@@ -10,9 +10,11 @@
*/
use Chevere\Http\Exceptions\ControllerException;
+use Chevere\Http\Exceptions\MethodNotAllowedException;
use Chevere\Parameter\Interfaces\TypeInterface;
use Chevere\Parameter\Type;
use Chevere\Router\Container;
+use Chevere\Router\Exceptions\NotFoundException;
use Chevere\Writer\NullWriter;
use Chevereto\Config\Config;
use Chevereto\Legacy\Classes\Cache;
@@ -125,11 +127,32 @@ if ($isTenantsApiRouting) {
foreach ($headers as $name => $value) {
$serverRequest = $serverRequest->withHeader($name, $value);
}
- $router = router(require dirname(__DIR__, 2) . '/routes/tenants-api-v4.php');
+ $routerPath = dirname(__DIR__, 2) . '/routes/';
+ $routes = [
+ require $routerPath . 'tenants-api-v4.php',
+ ];
+ if (in_array(server()['SERVER_NAME'], ['localhost', '127.0.0.1', '::1', 'app'])) {
+ $routes[] = require $routerPath . 'tenants-internal-api-v4.php';
+ }
+ $router = router(...$routes);
$container = $container->withAutoInject(
$router->dependencies(),
);
- $routed = $router->getRouted($serverRequest, $psr17Factory, container: $container);
+
+ try {
+ $routed = $router->getRouted($serverRequest, $psr17Factory, container: $container);
+ } catch (NotFoundException|MethodNotAllowedException $e) {
+ http_response_code($e->getCode());
+ header('Content-Type: application/json');
+ echo json_encode([
+ 'error' => [
+ 'code' => $e->getCode(),
+ 'message' => $e->getMessage(),
+ 'list' => explode("\n", $e->getMessage()),
+ ],
+ ], JSON_PRETTY_PRINT);
+ exit();
+ }
if ($routed->hasThrowable()
&& ! ($routed->throwable() instanceof ControllerException)
) {
diff --git a/app/legacy/routes/dashboard.php b/app/legacy/routes/dashboard.php
index 1ca099f..9bab7b2 100644
--- a/app/legacy/routes/dashboard.php
+++ b/app/legacy/routes/dashboard.php
@@ -21,7 +21,6 @@ use Chevereto\Legacy\Classes\Image;
use Chevereto\Legacy\Classes\L10n;
use Chevereto\Legacy\Classes\Listing;
use Chevereto\Legacy\Classes\Login;
-use Chevereto\Legacy\Classes\Mailer;
use Chevereto\Legacy\Classes\Page;
use Chevereto\Legacy\Classes\ProjectArachnid;
use Chevereto\Legacy\Classes\Settings;
@@ -34,7 +33,8 @@ use Chevereto\Legacy\G\Handler;
use FFMpeg\FFMpeg;
use FFMpeg\FFProbe;
use Intervention\Image\ImageManagerStatic;
-use PHPMailer\PHPMailer\SMTP;
+use Symfony\Component\Mailer\Transport;
+use Symfony\Component\Mailer\Transport\Smtp\SmtpTransport;
use function Chevere\Standard\randomString;
use function Chevereto\Encryption\hasEncryption;
use function Chevereto\Legacy\badgePaid;
@@ -73,9 +73,11 @@ use function Chevereto\Legacy\getSystemNotices;
use function Chevereto\Legacy\getVariable;
use function Chevereto\Legacy\headersNoCache;
use function Chevereto\Legacy\strip_tags_content;
+use function Chevereto\Legacy\trialAwareLabel;
use function Chevereto\Legacy\updateCheveretoNews;
use function Chevereto\Legacy\upload_to_content_images;
use function Chevereto\Vars\env;
+use function Chevereto\Vars\envTrialAware;
use function Chevereto\Vars\files;
use function Chevereto\Vars\get;
use function Chevereto\Vars\post;
@@ -916,13 +918,13 @@ return function (Handler $handler) {
$settings_pages['title'] = _s('Add page');
$settings_pages['doing'] = 'add';
$pagesCount = Page::countAll();
- $maxPages = (int) env()['CHEVERETO_MAX_PAGES'];
+ $maxPages = (int) envTrialAware()['CHEVERETO_MAX_PAGES'];
if ($maxPages !== 0) {
if ($pagesCount >= $maxPages) {
$is_error = true;
$error_title = _s('Quota limit reached');
$error_message = _s(
- 'Maximum number of pages allowed reached (limit %s).',
+ 'Maximum number of pages allowed reached (limit %s).' . trialAwareLabel(),
$maxPages
);
$handler::setVar('error_title', $error_title);
@@ -1168,7 +1170,28 @@ return function (Handler $handler) {
// 'page_file_path_absolute' => $POST['page_file_path_absolute'],
]);
}
- $mailApis = ['smtp'];
+ $mailApis = [
+ 'smtp',
+ 'ahasend',
+ 'ses',
+ 'azure',
+ 'brevo',
+ 'infobip',
+ 'mailgun',
+ 'mailjet',
+ 'mailomat',
+ 'mailpace',
+ 'mailersend',
+ 'mailtrap',
+ 'mandrill',
+ 'microsoftgraph',
+ 'postal',
+ 'postmark',
+ 'resend',
+ 'scaleway',
+ 'sendgrid',
+ 'sweego',
+ ];
if (env()['CHEVERETO_SERVICING'] !== 'docker') {
$mailApis[] = 'mail';
}
@@ -1262,14 +1285,6 @@ return function (Handler $handler) {
'validate' => isset($POST['email_mode']) && in_array($POST['email_mode'], $mailApis, true),
'error_msg' => _s('Invalid email mode'),
],
- 'email_smtp_server_port' => [
- 'validate' => isset($POST['email_smtp_server_port']) && $POST['email_smtp_server_port'] > 0 && $POST['email_smtp_server_port'] < 65536,
- 'error_msg' => _s('Invalid SMTP port'),
- ],
- 'email_smtp_server_security' => [
- 'validate' => isset($POST['email_smtp_server_security']) && in_array($POST['email_smtp_server_security'], ['tls', 'ssl', 'unsecured'], true),
- 'error_msg' => _s('Invalid SMTP security'),
- ],
'website_mode' => [
'validate' => isset($POST['website_mode']) && in_array($POST['website_mode'], ['community', 'personal'], true),
'error_msg' => _s('Invalid website mode'),
@@ -1635,52 +1650,116 @@ return function (Handler $handler) {
}
}
- if (isset($POST['email_mode']) && $POST['email_mode'] === 'smtp') {
- $email_smtp_validate = [
- 'email_smtp_server' => _s('Invalid SMTP server'),
- // 'email_smtp_server_username' => _s('Invalid SMTP username'),
+ $emailMode = $POST['email_mode'] ?? '';
+ $emailApiRequiredFields = [
+ 'smtp' => ['email_smtp_server', 'email_smtp_server_port', 'email_smtp_server_security'],
+ 'ahasend' => ['email_ahasend_api_key'],
+ 'ses' => ['email_ses_access_key', 'email_ses_secret_key'],
+ 'azure' => ['email_azure_resource_name', 'email_azure_key'],
+ 'brevo' => ['email_brevo_api_key'],
+ 'infobip' => ['email_infobip_api_key', 'email_infobip_base_url'],
+ 'mailersend' => ['email_mailersend_api_key'],
+ 'mailgun' => ['email_mailgun_api_key', 'email_mailgun_domain'],
+ 'mailjet' => ['email_mailjet_access_key', 'email_mailjet_secret_key'],
+ 'mailomat' => ['email_mailomat_api_key'],
+ 'mailpace' => ['email_mailpace_api_token'],
+ 'mailtrap' => ['email_mailtrap_api_token'],
+ 'mandrill' => ['email_mandrill_api_key'],
+ 'microsoftgraph' => ['email_microsoftgraph_client_id', 'email_microsoftgraph_client_secret', 'email_microsoftgraph_tenant_id'],
+ 'postal' => ['email_postal_api_key', 'email_postal_base_url'],
+ 'postmark' => ['email_postmark_api_token'],
+ 'resend' => ['email_resend_api_key'],
+ 'scaleway' => ['email_scaleway_project_id', 'email_scaleway_api_key'],
+ 'sendgrid' => ['email_sendgrid_api_key'],
+ 'sweego' => ['email_sweego_api_key'],
+ ];
+ if ((env()['CHEVERETO_SERVICING'] !== 'server' && $emailMode === 'mail')
+ || (env()['CHEVERETO_CONTEXT'] === 'saas' && in_array($emailMode, ['smtp', 'mail'], true))
+ ) {
+ $validations['email_mode'] = [
+ 'validate' => false,
+ 'error_msg' => _s('The %s API is not available in this context', $emailMode),
];
- foreach ($email_smtp_validate as $k => $v) {
- $validations[$k] = [
- 'validate' => (bool) $POST[$k],
- 'error_msg' => $v,
+ }
+ if ($validations === [] && isset($emailApiRequiredFields[$emailMode])) {
+ foreach ($emailApiRequiredFields[$emailMode] as $field) {
+ $validations[$field] = [
+ 'validate' => ! empty($POST[$field]),
+ 'error_msg' => _s('Invalid value'),
];
}
-
- $email_validate = [
- 'email_smtp_server',
- 'email_smtp_server_port',
- // 'email_smtp_server_username',
- // 'email_smtp_server_password',
- 'email_smtp_server_security',
- ];
- $email_error = false;
- foreach ($email_validate as $k) {
- if (! $validations[$k]['validate']) {
- $email_error = true;
- }
+ $emailFieldsValid = array_reduce(
+ $emailApiRequiredFields[$emailMode],
+ fn (bool $carry, string $field) => $carry && ($validations[$field]['validate'] ?? false),
+ true
+ );
+ if ($emailMode === 'smtp') {
+ $validations['email_smtp_server'] = [
+ 'validate' => (bool) ($POST['email_smtp_server'] ?? ''),
+ 'error_msg' => _s('Invalid SMTP server'),
+ ];
+ $validations['email_smtp_server_port'] = [
+ 'validate' => isset($POST['email_smtp_server_port']) && $POST['email_smtp_server_port'] > 0 && $POST['email_smtp_server_port'] < 65536,
+ 'error_msg' => _s('Invalid SMTP port'),
+ ];
+ $validations['email_smtp_server_security'] = [
+ 'validate' => isset($POST['email_smtp_server_security']) && in_array($POST['email_smtp_server_security'], ['tls', 'ssl', 'unsecured'], true),
+ 'error_msg' => _s('Invalid SMTP security'),
+ ];
+ $emailFieldsValid = $validations['email_smtp_server']['validate']
+ && $validations['email_smtp_server_port']['validate']
+ && $validations['email_smtp_server_security']['validate'];
}
- if (! $email_error) {
+ if ($emailFieldsValid) {
try {
- $mail = new Mailer(true);
- $mail->Username = $POST['email_smtp_server_username'] ?? '';
- $mail->Password = $POST['email_smtp_server_password'] ?? '';
- $mail->SMTPAuth = $mail->Username !== '' || $mail->Password !== '';
- $mail->SMTPSecure = in_array($POST['email_smtp_server_security'], ['ssl', 'tls'])
- ? $POST['email_smtp_server_security']
- : '';
- $mail->SMTPAutoTLS = in_array($POST['email_smtp_server_security'], ['ssl', 'tls']);
- $mail->Host = (string) $POST['email_smtp_server'];
- $mail->Port = (int) $POST['email_smtp_server_port'];
- $mail->SMTPDebug = SMTP::DEBUG_SERVER;
- $GLOBALS['SMTPDebug'] = '';
- $mail->Debugoutput = function ($str) {
- $GLOBALS['SMTPDebug'] .= "{$str}\n";
+ $dsn = match ($emailMode) {
+ 'smtp' => (function () use ($POST): string {
+ $username = urlencode($POST['email_smtp_server_username'] ?? '');
+ $password = urlencode($POST['email_smtp_server_password'] ?? '');
+ $host = (string) $POST['email_smtp_server'];
+ $port = (int) $POST['email_smtp_server_port'];
+ $security = $POST['email_smtp_server_security'];
+ $scheme = $security === 'ssl' ? 'smtps' : 'smtp';
+ $auth = ($username !== '' || $password !== '') ? "{$username}:{$password}@" : '';
+ $dsn = "{$scheme}://{$auth}{$host}:{$port}";
+ if ($security === 'tls') {
+ $dsn .= '?encryption=tls';
+ } elseif (! in_array($security, ['ssl', 'tls'], true)) {
+ $dsn .= '?verify_peer=false';
+ }
+
+ return $dsn;
+ })(),
+ 'ahasend' => 'ahasend+api://' . urlencode($POST['email_ahasend_api_key']) . '@default',
+ 'ses' => 'ses+api://' . urlencode($POST['email_ses_access_key']) . ':' . urlencode($POST['email_ses_secret_key']) . '@default',
+ 'azure' => 'azure+api://' . urlencode($POST['email_azure_resource_name']) . ':' . urlencode($POST['email_azure_key']) . '@default',
+ 'brevo' => 'brevo+api://' . urlencode($POST['email_brevo_api_key']) . '@default',
+ 'infobip' => 'infobip+api://' . urlencode($POST['email_infobip_api_key']) . '@' . urlencode($POST['email_infobip_base_url']),
+ 'mailersend' => 'mailersend+api://' . urlencode($POST['email_mailersend_api_key']) . '@default',
+ 'mailgun' => 'mailgun+api://' . urlencode($POST['email_mailgun_api_key']) . ':' . urlencode($POST['email_mailgun_domain']) . '@default',
+ 'mailjet' => 'mailjet+api://' . urlencode($POST['email_mailjet_access_key']) . ':' . urlencode($POST['email_mailjet_secret_key']) . '@default',
+ 'mailomat' => 'mailomat+api://' . urlencode($POST['email_mailomat_api_key']) . '@default',
+ 'mailpace' => 'mailpace+api://' . urlencode($POST['email_mailpace_api_token']) . '@default',
+ 'mailtrap' => 'mailtrap+api://' . urlencode($POST['email_mailtrap_api_token']) . '@default',
+ 'mandrill' => 'mandrill+api://' . urlencode($POST['email_mandrill_api_key']) . '@default',
+ 'microsoftgraph' => 'microsoftgraph+api://' . urlencode($POST['email_microsoftgraph_client_id']) . ':' . urlencode($POST['email_microsoftgraph_client_secret']) . '@default?tenantId=' . urlencode($POST['email_microsoftgraph_tenant_id']),
+ 'postal' => 'postal+api://' . urlencode($POST['email_postal_api_key']) . '@' . urlencode($POST['email_postal_base_url']),
+ 'postmark' => 'postmark+api://' . urlencode($POST['email_postmark_api_token']) . '@default',
+ 'resend' => 'resend+api://' . urlencode($POST['email_resend_api_key']) . '@default',
+ 'scaleway' => 'scaleway+api://' . urlencode($POST['email_scaleway_project_id']) . ':' . urlencode($POST['email_scaleway_api_key']) . '@default',
+ 'sendgrid' => 'sendgrid+api://' . urlencode($POST['email_sendgrid_api_key']) . '@default',
+ 'sweego' => 'sweego+api://' . urlencode($POST['email_sweego_api_key']) . '@default',
};
- $GLOBALS['SMTPDebug'] = "SMTP Debug>>\n" . $GLOBALS['SMTPDebug'];
- $mail->SmtpConnect();
- } catch (Exception $e) {
- $GLOBALS['SMTPDebug'] = "SMTP Exception>>\n" . ($mail->ErrorInfo ?: $e->getMessage());
+ $transport = Transport::fromDsn($dsn);
+ if ($transport instanceof SmtpTransport) {
+ $GLOBALS['SMTPDebug'] = '';
+ $transport->start();
+ $GLOBALS['SMTPDebug'] = "SMTP Debug>>\nConnected successfully";
+ } else {
+ $GLOBALS['SMTPDebug'] = "Transport configured: {$emailMode}";
+ }
+ } catch (Throwable $e) {
+ $GLOBALS['SMTPDebug'] = "Error>>\n" . $e->getMessage();
}
}
}
diff --git a/app/legacy/routes/image.php b/app/legacy/routes/image.php
index 8a79bcc..1641a86 100644
--- a/app/legacy/routes/image.php
+++ b/app/legacy/routes/image.php
@@ -292,6 +292,7 @@ return function (Handler $handler) {
$meta_description = $image['description'];
} else {
$image_tr = [
+ '%s' => _s(mb_ucfirst($image['type'])),
'%i' => $image[$image['title'] === null ? 'filename' : 'title'],
'%a' => $image['album']['name'] ?? '',
'%w' => getSetting('website_name'),
@@ -301,11 +302,11 @@ return function (Handler $handler) {
|| (
! ((bool) ($image['user']['is_private'] ?? false)) && isset($image['album']['name'])
)) {
- $meta_description = _s('Image %i in %a album', $image_tr);
+ $meta_description = _s('%s %i in %a album', $image_tr);
} elseif (isset($image['category']['id'])) {
- $meta_description = _s('Image %i in %c category', $image_tr);
+ $meta_description = _s('%s %i in %c category', $image_tr);
} else {
- $meta_description = _s('Image %i hosted in %w', $image_tr);
+ $meta_description = _s('%s %i hosted in %w', $image_tr);
}
}
$handler::setVar('meta_description', $meta_description ?? '');
diff --git a/app/routes/tenants-api-v4.php b/app/routes/tenants-api-v4.php
index 5dacd30..b20bbd3 100644
--- a/app/routes/tenants-api-v4.php
+++ b/app/routes/tenants-api-v4.php
@@ -16,10 +16,12 @@ use Chevereto\Http\Controllers\Api\V4\TenantPatch;
use Chevereto\Http\Controllers\Api\V4\TenantPlanDelete;
use Chevereto\Http\Controllers\Api\V4\TenantPlanGet;
use Chevereto\Http\Controllers\Api\V4\TenantPlanPatch;
+use Chevereto\Http\Controllers\Api\V4\TenantsAuthVerifyPost;
use Chevereto\Http\Controllers\Api\V4\TenantsGet;
use Chevereto\Http\Controllers\Api\V4\TenantsPlansGet;
use Chevereto\Http\Controllers\Api\V4\TenantsPlansPost;
use Chevereto\Http\Controllers\Api\V4\TenantsPost;
+use Chevereto\Http\Controllers\Api\V4\TenantUserPasswordResetPatch;
use Chevereto\Http\Middlewares\RestrictIpAccess;
use Chevereto\Http\Middlewares\SignedRequest;
use Chevereto\Http\Middlewares\TenantsApiKeyAuthorization;
@@ -28,6 +30,10 @@ use function Chevere\Router\routes;
use function Chevereto\Vars\env;
return routes(
+ route(
+ '/_/api/4/auth/verify',
+ POST: TenantsAuthVerifyPost::class,
+ ),
route(
'/_/api/4/tenants',
POST: TenantsPost::class,
@@ -43,6 +49,10 @@ return routes(
'/_/api/4/tenants/{id}/install',
POST: TenantInstallPost::class,
),
+ route(
+ '/_/api/4/tenants/{id}/user-password-reset',
+ PATCH: TenantUserPasswordResetPatch::class,
+ ),
route(
'/_/api/4/tenants-plans',
POST: TenantsPlansPost::class,
diff --git a/app/routes/tenants-internal-api-v4.php b/app/routes/tenants-internal-api-v4.php
new file mode 100644
index 0000000..32f03bd
--- /dev/null
+++ b/app/routes/tenants-internal-api-v4.php
@@ -0,0 +1,29 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+use Chevereto\Http\Controllers\Api\V4\TenantsConfigTraefikGet;
+use Chevereto\Http\Middlewares\RestrictIpAccess;
+use Chevereto\Http\Middlewares\TenantsApiKeyAuthorization;
+use function Chevere\Router\route;
+use function Chevere\Router\routes;
+
+return routes(
+ route(
+ '/_/api/4/config/traefik',
+ GET: TenantsConfigTraefikGet::class,
+ ),
+)
+ ->withAppendMiddleware(
+ RestrictIpAccess::with(
+ allowList: '127.0.0.1,::1,172.16.0.0/12,192.168.65.0/24',
+ ),
+ TenantsApiKeyAuthorization::class,
+ );
diff --git a/app/schemas/mysql-8/_/tenants_stats.sql b/app/schemas/mysql-8/_/tenants_stats.sql
index 192ebe3..237f70f 100644
--- a/app/schemas/mysql-8/_/tenants_stats.sql
+++ b/app/schemas/mysql-8/_/tenants_stats.sql
@@ -17,6 +17,7 @@ CREATE TABLE `%table_root_prefix%tenants_stats` (
`pages` INT UNSIGNED NOT NULL DEFAULT '0',
`storages` INT UNSIGNED NOT NULL DEFAULT '0',
`categories` INT UNSIGNED NOT NULL DEFAULT '0',
+ `login_providers` INT UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`tenant_id`),
KEY `updated_at` (`updated_at`),
FOREIGN KEY (tenant_id) REFERENCES `%table_root_prefix%tenants` (id) ON DELETE CASCADE
diff --git a/app/src/Http/Controllers/Api/V4/TenantPlanPatch.php b/app/src/Http/Controllers/Api/V4/TenantPlanPatch.php
index 14c1c38..38a4638 100644
--- a/app/src/Http/Controllers/Api/V4/TenantPlanPatch.php
+++ b/app/src/Http/Controllers/Api/V4/TenantPlanPatch.php
@@ -33,6 +33,7 @@ class TenantPlanPatch extends Controller
public function __invoke(string $id): void
{
try {
+ $this->tenants->getPlan($id);
$this->tenants->editPlan(
planId: $id,
limits: $this->bodyParsed()->optional('limits')?->array(),
diff --git a/app/src/Http/Controllers/Api/V4/TenantUserPasswordResetPatch.php b/app/src/Http/Controllers/Api/V4/TenantUserPasswordResetPatch.php
new file mode 100644
index 0000000..8243f7d
--- /dev/null
+++ b/app/src/Http/Controllers/Api/V4/TenantUserPasswordResetPatch.php
@@ -0,0 +1,95 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Chevereto\Http\Controllers\Api\V4;
+
+use Chevere\Http\Attributes\Response;
+use Chevere\Http\Controller;
+use Chevere\Http\Exceptions\ControllerException;
+use Chevere\Http\Status;
+use Chevere\Parameter\Interfaces\ParameterInterface;
+use Chevere\Writer\StreamWriter;
+use Chevereto\Exceptions\NotFoundException;
+use Chevereto\PCRE;
+use Chevereto\Tenants\Tenants;
+use function Chevere\Parameter\arrayp;
+use function Chevere\Parameter\string;
+use function Chevere\Standard\randomString;
+use function Chevere\Writer\streamTemp;
+use function Chevereto\Legacy\G\str_replace_last;
+use function Chevereto\Legacy\runAppCommand;
+use function Chevereto\Vars\env;
+
+#[Response(
+ new Status(201, fail: 404, conflict: 409),
+)]
+class TenantUserPasswordResetPatch extends Controller
+{
+ public function __construct(
+ private Tenants $tenants,
+ ) {
+ }
+
+ public function __invoke(string $id): string
+ {
+ try {
+ $tenant = $this->tenants->getTenant(tenantId: $id);
+ } catch (NotFoundException) {
+ throw new ControllerException(
+ 'Tenant not found',
+ 404
+ );
+ }
+ $password = $this->bodyParsed()->optional('password')?->string()
+ ?? randomString(16);
+ $logger = new StreamWriter(streamTemp());
+ $exit = runAppCommand(
+ command: [
+ '-C', 'password-reset',
+ '-u', $this->bodyParsed()->required('username')->string(),
+ '-x', $password,
+ ],
+ env: array_merge(env(), [
+ 'CHEVERETO_TENANT' => $tenant->id,
+ 'CHEVERETO_CACHE_KEY_PREFIX' => str_replace_last(
+ '_:',
+ '',
+ env()['CHEVERETO_CACHE_KEY_PREFIX']
+ ),
+ 'CHEVERETO_DB_TABLE_PREFIX' => str_replace_last(
+ '_',
+ '',
+ env()['CHEVERETO_DB_TABLE_PREFIX']
+ ),
+ ]),
+ isVerbose: true,
+ logger: $logger
+ );
+ xr($exit);
+ if ($exit === 0) {
+ return $password;
+ }
+
+ throw new ControllerException(
+ 'Password reset failed',
+ 500
+ );
+ }
+
+ public static function acceptBody(): ParameterInterface
+ {
+ return arrayp(
+ username: string(PCRE::USER_USERNAME->value),
+ )->withOptional(
+ password: string(PCRE::USER_PASSWORD->value)
+ );
+ }
+}
diff --git a/app/src/Http/Controllers/Api/V4/TenantsAuthVerifyPost.php b/app/src/Http/Controllers/Api/V4/TenantsAuthVerifyPost.php
new file mode 100644
index 0000000..6867cb7
--- /dev/null
+++ b/app/src/Http/Controllers/Api/V4/TenantsAuthVerifyPost.php
@@ -0,0 +1,28 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Chevereto\Http\Controllers\Api\V4;
+
+use Chevere\Http\Attributes\Response;
+use Chevere\Http\Controller;
+use Chevere\Http\Header;
+use Chevere\Http\Status;
+
+#[Response(
+ new Status(200),
+ new Header('Content-Type', 'application/json'),
+)]
+class TenantsAuthVerifyPost extends Controller
+{
+ public function __invoke(): void
+ {
+ }
+}
diff --git a/app/src/Http/Controllers/Api/V4/TenantsConfigTraefikGet.php b/app/src/Http/Controllers/Api/V4/TenantsConfigTraefikGet.php
new file mode 100644
index 0000000..ccd9597
--- /dev/null
+++ b/app/src/Http/Controllers/Api/V4/TenantsConfigTraefikGet.php
@@ -0,0 +1,43 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Chevereto\Http\Controllers\Api\V4;
+
+use Chevere\Http\Attributes\Response;
+use Chevere\Http\Controller;
+use Chevere\Http\Header;
+use Chevere\Http\Status;
+use Chevereto\Tenants\Tenants;
+use Chevereto\Tenants\TenantsConfig;
+use function Chevereto\Vars\env;
+
+#[Response(
+ new Status(200),
+ new Header('Content-Type', 'application/json'),
+)]
+class TenantsConfigTraefikGet extends Controller
+{
+ public function __construct(
+ private Tenants $tenants,
+ private TenantsConfig $tenantsConfig,
+ ) {
+ }
+
+ public function __invoke(): array
+ {
+ return $this->tenantsConfig->getConfig(
+ tenants: $this->tenants,
+ service: env()['CHEVERETO_SERVICE_NAME'],
+ port: 80,
+ middleware: ['cf-only']
+ );
+ }
+}
diff --git a/app/src/Legacy/Classes/DB.php b/app/src/Legacy/Classes/DB.php
index a1a5739..83a24e8 100644
--- a/app/src/Legacy/Classes/DB.php
+++ b/app/src/Legacy/Classes/DB.php
@@ -118,7 +118,9 @@ class DB
];
$this->pdo_options = $this->pdo_default_attrs + $this->pdoAttrs;
$this->pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
- $this->pdo_options[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET time_zone = '+00:00', NAMES 'utf8mb4'";
+ $attrInitOption = class_exists('Pdo\\Mysql') ? \Pdo\Mysql::ATTR_INIT_COMMAND : PDO::MYSQL_ATTR_INIT_COMMAND;
+ $this->pdo_options[] = "SET time_zone = '+00:00', NAMES 'utf8mb4'";
+ $this->pdo_options[$attrInitOption] = "SET time_zone = '+00:00', NAMES 'utf8mb4'";
self::$dbh = new PDO($pdo_connect, $this->user, $this->pass, $this->pdo_options);
self::$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
self::$instance = $this;
diff --git a/app/src/Legacy/Classes/Settings.php b/app/src/Legacy/Classes/Settings.php
index 0c01bf7..ce860a9 100644
--- a/app/src/Legacy/Classes/Settings.php
+++ b/app/src/Legacy/Classes/Settings.php
@@ -32,6 +32,34 @@ class Settings
'email_smtp_server_password',
'email_smtp_server_port',
'email_smtp_server_username',
+ 'email_ahasend_api_key',
+ 'email_ses_access_key',
+ 'email_ses_secret_key',
+ 'email_azure_resource_name',
+ 'email_azure_key',
+ 'email_brevo_api_key',
+ 'email_infobip_api_key',
+ 'email_infobip_base_url',
+ 'email_mailgun_api_key',
+ 'email_mailgun_domain',
+ 'email_mailjet_access_key',
+ 'email_mailjet_secret_key',
+ 'email_mailomat_api_key',
+ 'email_mailpace_api_token',
+ 'email_mailersend_api_key',
+ 'email_mailtrap_api_token',
+ 'email_mandrill_api_key',
+ 'email_microsoftgraph_client_id',
+ 'email_microsoftgraph_client_secret',
+ 'email_microsoftgraph_tenant_id',
+ 'email_postal_api_key',
+ 'email_postal_base_url',
+ 'email_postmark_api_token',
+ 'email_resend_api_key',
+ 'email_scaleway_project_id',
+ 'email_scaleway_api_key',
+ 'email_sendgrid_api_key',
+ 'email_sweego_api_key',
'captcha_secret',
'disqus_secret_key',
'akismet_api_key',
@@ -312,6 +340,13 @@ class Settings
'upload_image_path' => 'images',
],
],
+ 'CHEVERETO_ENABLE_GUESTS' => ['0',
+ [
+ 'enable_api_guest' => false,
+ 'guest_uploads' => false,
+ 'guest_albums' => false,
+ ],
+ ],
];
public const STOCK = [
@@ -421,6 +456,34 @@ class Settings
'theme_palette_user_select' => true,
'enable_api_user' => true,
'enable_api_guest' => false,
+ 'email_ahasend_api_key' => '',
+ 'email_ses_access_key' => '',
+ 'email_ses_secret_key' => '',
+ 'email_azure_resource_name' => '',
+ 'email_azure_key' => '',
+ 'email_brevo_api_key' => '',
+ 'email_infobip_api_key' => '',
+ 'email_infobip_base_url' => '',
+ 'email_mailgun_api_key' => '',
+ 'email_mailgun_domain' => '',
+ 'email_mailjet_access_key' => '',
+ 'email_mailjet_secret_key' => '',
+ 'email_mailomat_api_key' => '',
+ 'email_mailpace_api_token' => '',
+ 'email_mailersend_api_key' => '',
+ 'email_mailtrap_api_token' => '',
+ 'email_mandrill_api_key' => '',
+ 'email_microsoftgraph_client_id' => '',
+ 'email_microsoftgraph_client_secret' => '',
+ 'email_microsoftgraph_tenant_id' => '',
+ 'email_postal_api_key' => '',
+ 'email_postal_base_url' => '',
+ 'email_postmark_api_token' => '',
+ 'email_resend_api_key' => '',
+ 'email_scaleway_project_id' => '',
+ 'email_scaleway_api_key' => '',
+ 'email_sendgrid_api_key' => '',
+ 'email_sweego_api_key' => '',
];
public const USERNAME_MIN_LENGTH = 3;
@@ -804,7 +867,6 @@ class Settings
foreach ($binds as $bindK => $bindV) {
$db->bind($bindK, $bindV);
}
-
$return = $db->exec();
if ($return) {
self::cache();
diff --git a/app/src/Legacy/Classes/Stat.php b/app/src/Legacy/Classes/Stat.php
index d3923f0..861b9b3 100644
--- a/app/src/Legacy/Classes/Stat.php
+++ b/app/src/Legacy/Classes/Stat.php
@@ -17,7 +17,9 @@ use LogicException;
use OverflowException;
use function Chevere\Message\message;
use function Chevereto\Legacy\G\datetimegmt;
+use function Chevereto\Legacy\trialAwareLabel;
use function Chevereto\Vars\env;
+use function Chevereto\Vars\envTrialAware;
class Stat
{
@@ -127,7 +129,7 @@ class Stat
600
);
}
- $maxLimit = (int) (env()[$env] ?? 0);
+ $maxLimit = (int) (envTrialAware()[$env] ?? 0);
if ($maxLimit === 0) {
return;
}
@@ -135,7 +137,7 @@ class Stat
if (($count + $add) > $maxLimit) {
throw new OverflowException(
message(
- 'Maximum %t% reached (limit %s%).',
+ 'Maximum %t% reached (limit %s%).' . trialAwareLabel(),
t: $env,
s: strval($maxLimit),
),
@@ -449,6 +451,7 @@ class Stat
'file_likes' => 's.stat_image_likes',
'album_likes' => 's.stat_album_likes',
'storage_used' => 's.stat_disk_used',
+ 'login_providers' => 'u.login_providers',
'admins' => 'u.admins',
'managers' => 'u.managers',
'pages' => 'u.pages',
@@ -469,9 +472,7 @@ class Stat
$selectColumns = implode(',', $pairs);
$select = match ($asJsonColumn) {
true => << << 0) {
$currentTotalTags = Stat::getTotals()['tags'] ?? 0;
if ($currentTotalTags >= $maxTags) {
diff --git a/app/src/Legacy/Classes/User.php b/app/src/Legacy/Classes/User.php
index db24a84..9526a47 100644
--- a/app/src/Legacy/Classes/User.php
+++ b/app/src/Legacy/Classes/User.php
@@ -37,7 +37,9 @@ use function Chevereto\Legacy\getSetting;
use function Chevereto\Legacy\headersNoCache;
use function Chevereto\Legacy\linkify_redirector;
use function Chevereto\Legacy\system_notification_email;
+use function Chevereto\Legacy\trialAwareLabel;
use function Chevereto\Vars\env;
+use function Chevereto\Vars\envTrialAware;
class User
{
@@ -134,37 +136,40 @@ class User
} else {
$userAlbums = [];
$user_stream = self::getStreamAlbum($var);
- if ($user_stream === null || $user_stream['user_album_count'] === 0) {
+ if ($user_stream === null) {
return [];
}
+ $userAlbumsCount = $user_stream['user_album_count'];
unset($user_stream['user_album_count']);
$userAlbums['stream'] = $user_stream;
$map = [];
$children = [];
- $columns = [
- 'album_id',
- 'album_name',
- 'album_privacy',
- 'album_parent_id',
- 'album_image_count',
- 'album_cover_id',
- ];
- $columnsString = implode(', ', $columns);
- $tableAlbums = DB::getTable('albums');
- $db = DB::getInstance();
- $db->query(
- <<bind(':limit', intval(env()['CHEVERETO_MAX_USER_ALBUMS_LIST']));
- $db->bind(':image_user_id', $id);
- $user_albums_db = $db->fetchAll();
- if ($user_albums_db) {
- $userAlbums += $user_albums_db;
+ if ($userAlbumsCount > 0) {
+ $columns = [
+ 'album_id',
+ 'album_name',
+ 'album_privacy',
+ 'album_parent_id',
+ 'album_image_count',
+ 'album_cover_id',
+ ];
+ $columnsString = implode(', ', $columns);
+ $tableAlbums = DB::getTable('albums');
+ $db = DB::getInstance();
+ $db->query(
+ <<bind(':limit', intval(env()['CHEVERETO_MAX_USER_ALBUMS_LIST']));
+ $db->bind(':image_user_id', $id);
+ $user_albums_db = $db->fetchAll();
+ if ($user_albums_db) {
+ $userAlbums += $user_albums_db;
+ }
}
foreach ($userAlbums as $k => &$v) {
$album_id = isset($v['album_id'])
@@ -343,7 +348,7 @@ class User
if (! array_key_exists($role, $roles)) {
throw new Exception('Invalid role', 600);
}
- $maxLimit = (int) env()[$roleHandle] ?? 0;
+ $maxLimit = (int) envTrialAware()[$roleHandle] ?? 0;
if ($maxLimit === 0) {
return;
}
@@ -358,7 +363,7 @@ class User
if (($count + 1) > $maxLimit) {
throw new OverflowException(
message(
- 'Maximum %u% for role %r% reached (limit %c%)',
+ 'Maximum %u% for role %r% reached (limit %c%)' . trialAwareLabel(),
u: _n('user', 'users', 20),
c: strval($maxLimit),
r: mb_strtolower($roleLabel),
diff --git a/app/src/Legacy/functions.php b/app/src/Legacy/functions.php
index 1c8e4a0..eb1a8c2 100644
--- a/app/src/Legacy/functions.php
+++ b/app/src/Legacy/functions.php
@@ -31,7 +31,6 @@ use Chevereto\Legacy\Classes\KeyValue;
use Chevereto\Legacy\Classes\KeyValueNull;
use Chevereto\Legacy\Classes\L10n;
use Chevereto\Legacy\Classes\Login;
-use Chevereto\Legacy\Classes\Mailer;
use Chevereto\Legacy\Classes\Settings;
use Chevereto\Legacy\Classes\StorageApis;
use Chevereto\Legacy\Classes\Upload;
@@ -56,9 +55,12 @@ use LogicException;
use OutOfBoundsException;
use OverflowException;
use PDO;
-use PHPMailer\PHPMailer\SMTP;
use Redis;
use RuntimeException;
+use Symfony\Component\Mailer\Mailer;
+use Symfony\Component\Mailer\Transport;
+use Symfony\Component\Mime\Address;
+use Symfony\Component\Mime\Email;
use Symfony\Component\Process\Process;
use Throwable;
use function Chevere\Filesystem\filePhpForPath;
@@ -94,6 +96,7 @@ use function Chevereto\Legacy\G\starts_with;
use function Chevereto\Legacy\G\unlinkIfExists;
use function Chevereto\Vars\cookie;
use function Chevereto\Vars\env;
+use function Chevereto\Vars\envTrialAware;
use function Chevereto\Vars\post;
use function Chevereto\Vars\server;
use function Chevereto\Vars\session;
@@ -195,55 +198,76 @@ function send_mail($to, $subject, $body): bool
if (! filter_var($to, FILTER_VALIDATE_EMAIL)) {
throw new Exception('Invalid to email', 100);
}
- $writer = new StreamWriter(streamFor('php://temp', 'r+'));
$body = trim($body);
- $mail = new Mailer();
- $mail->SMTPDebug = SMTP::DEBUG_SERVER;
- $mail->Debugoutput = function ($str, $level) use ($writer) {
- $writer->write("{$str} \n");
- };
- $alt_body = $mail->html2text($body);
- $mail->CharSet = 'UTF-8';
- if (getSetting('email_mode') === 'smtp') {
- $mail->isSMTP();
- $mail->Username = getSetting('email_smtp_server_username') ?? '';
- $mail->Password = getSetting('email_smtp_server_password') ?? '';
- $mail->SMTPAuth = $mail->Username !== '' || $mail->Password !== '';
- $mail->SMTPSecure = in_array(getSetting('email_smtp_server_security'), ['ssl', 'tls'], true)
- ? getSetting('email_smtp_server_security')
- : '';
- $mail->SMTPAutoTLS = in_array(getSetting('email_smtp_server_security'), ['ssl', 'tls'], true);
- $mail->Port = getSetting('email_smtp_server_port');
- $mail->Host = getSetting('email_smtp_server');
- }
- $mail->Timeout = 30;
- $mail->Subject = $subject;
- if ($body !== $alt_body) {
- $mail->IsHTML(true);
- $mail->Body = $mail->normalizeBreaks($body);
- $mail->AltBody = $mail->normalizeBreaks($alt_body);
- } else {
- $mail->Body = $body;
- }
- $mail->addAddress($to);
+ $alt_body = strip_tags($body);
+ $email = new Email();
+ $email->subject($subject);
+ $email->to($to);
+ $email->from(new Address($from[0], $from[1]));
if ($reply_to && is_array($reply_to)) {
foreach ($reply_to as $v) {
- $mail->addReplyTo($v);
+ $email->addReplyTo($v);
}
}
- $mail->setFrom($from[0], $from[1]);
- if ($mail->Send()) {
- return true;
+ if ($body !== $alt_body) {
+ $email->html($body);
+ $email->text($alt_body);
+ } else {
+ $email->text($body);
}
- $mailerWrap = "\n----------- MAILER DEBUG -----------\n\n";
- $error = str_replace('-', '>', $mailerWrap)
- . $writer->__toString()
- . str_replace('-', '<', $mailerWrap);
- writers()->error()
- ->write($error);
- xr(mailer: $error, to: $to, subject: $subject, body: $body);
+ $emailMode = getSetting('email_mode') ?? 'mail';
+ $dsn = match ($emailMode) {
+ 'smtp' => (function (): string {
+ $username = urlencode(getSetting('email_smtp_server_username') ?? '');
+ $password = urlencode(getSetting('email_smtp_server_password') ?? '');
+ $host = getSetting('email_smtp_server') ?? 'localhost';
+ $port = getSetting('email_smtp_server_port') ?? 25;
+ $security = getSetting('email_smtp_server_security');
+ $scheme = $security === 'ssl' ? 'smtps' : 'smtp';
+ $auth = ($username !== '' || $password !== '') ? "{$username}:{$password}@" : '';
+ $dsn = "{$scheme}://{$auth}{$host}:{$port}";
+ if ($security === 'tls') {
+ $dsn .= '?encryption=tls';
+ } elseif (! in_array($security, ['ssl', 'tls'], true)) {
+ $dsn .= '?verify_peer=false';
+ }
- throw new Exception($mail->ErrorInfo, 606);
+ return $dsn;
+ })(),
+ 'ahasend' => 'ahasend+api://' . urlencode(getSetting('email_ahasend_api_key') ?? '') . '@default',
+ 'ses' => 'ses+api://' . urlencode(getSetting('email_ses_access_key') ?? '') . ':' . urlencode(getSetting('email_ses_secret_key') ?? '') . '@default',
+ 'azure' => 'azure+api://' . urlencode(getSetting('email_azure_resource_name') ?? '') . ':' . urlencode(getSetting('email_azure_key') ?? '') . '@default',
+ 'brevo' => 'brevo+api://' . urlencode(getSetting('email_brevo_api_key') ?? '') . '@default',
+ 'infobip' => 'infobip+api://' . urlencode(getSetting('email_infobip_api_key') ?? '') . '@' . urlencode(getSetting('email_infobip_base_url') ?? 'default'),
+ 'mailgun' => 'mailgun+api://' . urlencode(getSetting('email_mailgun_api_key') ?? '') . ':' . urlencode(getSetting('email_mailgun_domain') ?? '') . '@default',
+ 'mailjet' => 'mailjet+api://' . urlencode(getSetting('email_mailjet_access_key') ?? '') . ':' . urlencode(getSetting('email_mailjet_secret_key') ?? '') . '@default',
+ 'mailomat' => 'mailomat+api://' . urlencode(getSetting('email_mailomat_api_key') ?? '') . '@default',
+ 'mailpace' => 'mailpace+api://' . urlencode(getSetting('email_mailpace_api_token') ?? '') . '@default',
+ 'mailersend' => 'mailersend+api://' . urlencode(getSetting('email_mailersend_api_key') ?? '') . '@default',
+ 'mailtrap' => 'mailtrap+api://' . urlencode(getSetting('email_mailtrap_api_token') ?? '') . '@default',
+ 'mandrill' => 'mandrill+api://' . urlencode(getSetting('email_mandrill_api_key') ?? '') . '@default',
+ 'microsoftgraph' => 'microsoftgraph+api://' . urlencode(getSetting('email_microsoftgraph_client_id') ?? '') . ':' . urlencode(getSetting('email_microsoftgraph_client_secret') ?? '') . '@default?tenantId=' . urlencode(getSetting('email_microsoftgraph_tenant_id') ?? ''),
+ 'postal' => 'postal+api://' . urlencode(getSetting('email_postal_api_key') ?? '') . '@' . urlencode(getSetting('email_postal_base_url') ?? 'default'),
+ 'postmark' => 'postmark+api://' . urlencode(getSetting('email_postmark_api_token') ?? '') . '@default',
+ 'resend' => 'resend+api://' . urlencode(getSetting('email_resend_api_key') ?? '') . '@default',
+ 'scaleway' => 'scaleway+api://' . urlencode(getSetting('email_scaleway_project_id') ?? '') . ':' . urlencode(getSetting('email_scaleway_api_key') ?? '') . '@default',
+ 'sendgrid' => 'sendgrid+api://' . urlencode(getSetting('email_sendgrid_api_key') ?? '') . '@default',
+ 'sweego' => 'sweego+api://' . urlencode(getSetting('email_sweego_api_key') ?? '') . '@default',
+ default => 'sendmail://default',
+ };
+
+ try {
+ $transport = Transport::fromDsn($dsn);
+ $mailer = new Mailer($transport);
+ $mailer->send($email);
+ } catch (\Throwable $e) {
+ writers()->error()->write($e->getMessage());
+ xr(mailer: $e->getMessage(), to: $to, subject: $subject, body: $body);
+
+ throw new Exception($e->getMessage(), 606);
+ }
+
+ return true;
}
function get_chevereto_version(bool $full = true): string
@@ -1179,12 +1203,27 @@ function loaderHandler(
?? '';
$envVar['CHEVERETO_TENANT_HANDLE'] = '';
$envVar['CHEVERETO_DB_TABLE_ROOT_PREFIX'] = $envVar['CHEVERETO_DB_TABLE_PREFIX'];
- if ($envVar['CHEVERETO_ENABLE_TENANTS'] === '1') {
+ $envVar['CHEVERETO_CACHE_KEY_ROOT_PREFIX'] = $envVar['CHEVERETO_CACHE_KEY_PREFIX'];
+ // try {
+ // $xrArguments = [
+ // 'isEnabled' => true,
+ // 'isHttps' => false,
+ // 'host' => 'host.docker.internal',
+ // 'port' => 27420,
+ // ];
+
+ // new XrInstance(new Xr(...$xrArguments));
+ // } catch (Throwable) {
+ // // Silent failover
+ // }
+ $isTenantsApi = false;
+ if ($envVar['CHEVERETO_ENABLE_TENANTS'] === '1' || $envVar['CHEVERETO_TENANT'] !== '') {
$redis = new Redis();
$redis->connect($envVar['CHEVERETO_CACHE_HOST'], (int) $envVar['CHEVERETO_CACHE_PORT']);
if ($envVar['CHEVERETO_CACHE_PASSWORD'] !== '') {
$redis->auth($envVar['CHEVERETO_CACHE_PASSWORD']);
}
+ $redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP);
$lookupNamespace = $envVar['CHEVERETO_CACHE_KEY_PREFIX'] . '_:';
if (PHP_SAPI === 'cli') {
$websiteId = $envVar['CHEVERETO_TENANT'];
@@ -1195,13 +1234,19 @@ function loaderHandler(
PLAIN;
exit(255);
}
- $websiteOptions = $redis->get($lookupNamespace . 'tenant:' . $websiteId);
- $websiteOptions = unserialize($websiteOptions);
- $hostname = $websiteOptions['hostname'];
+ /** @var array $websiteOptions */
+ $websiteOptions = $redis->get($lookupNamespace . 'tenant:' . $websiteId) ?: [];
+ $hostname = $websiteOptions['hostname'] ?? '';
} else {
$hostname = $_server['SERVER_NAME'];
+ if (($envVar['CHEVERETO_SERVICING'] ?? '') === 'docker'
+ && $hostname === 'host.docker.internal'
+ ) {
+ $hostname = $envVar['CHEVERETO_HOSTNAME'];
+ }
$isRootHostname = hash_equals($envVar['CHEVERETO_HOSTNAME'], $hostname);
- $isTenantsApi = $isRootHostname
+ $isLocalhost = in_array($hostname, ['localhost', '127.0.0.1', '::1', $envVar['CHEVERETO_SERVICE_NAME']], true);
+ $isTenantsApi = ($isRootHostname || $isLocalhost)
&& str_starts_with(
$_server['REQUEST_URI'],
$envVar['CHEVERETO_HOSTNAME_PATH']
@@ -1220,17 +1265,15 @@ function loaderHandler(
} else {
$websiteId = $redis->get($lookupNamespace . 'hostname:' . $hostname);
if ($websiteId === false) {
- if ($isRootHostname) {
- redirect($envVar['CHEVERETO_PROVIDER'] ?? 'https://chevereto.com');
- }
+ http_response_code(404);
echo <<get($lookupNamespace . 'tenant:' . $websiteId);
- $websiteOptions = unserialize($websiteOptions);
+ /** @var array $websiteOptions */
+ $websiteOptions = $redis->get($lookupNamespace . 'tenant:' . $websiteId) ?: [];
}
}
if ($websiteOptions === []) {
@@ -1268,8 +1311,8 @@ function loaderHandler(
$envVar['CHEVERETO_TENANT_HANDLE'] = "{$websiteId}_";
$envVar['CHEVERETO_HOSTNAME'] = $hostname;
if ($websiteId !== '') {
- $envVar['CHEVERETO_CACHE_KEY_PREFIX'] .= "{$websiteId}:"; // chv:ABC:
- $envVar['CHEVERETO_DB_TABLE_PREFIX'] .= "{$websiteId}_"; // chv_ABC_
+ $envVar['CHEVERETO_CACHE_KEY_PREFIX'] .= "{$websiteId}:"; // chv:ABC: (tenant)
+ $envVar['CHEVERETO_DB_TABLE_PREFIX'] .= "{$websiteId}_"; // chv_ABC_ (tenant)
} else {
$envVar['CHEVERETO_CACHE_KEY_PREFIX'] .= '_:'; // chv:_: (global)
$envVar['CHEVERETO_DB_TABLE_PREFIX'] .= '_'; // chv__ (global)
@@ -1423,6 +1466,7 @@ function loaderHandler(
if (env()['CHEVERETO_CACHE_PASSWORD'] !== '') {
$redis->auth(env()['CHEVERETO_CACHE_PASSWORD']);
}
+ $redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP);
$keyValue = new KeyValue(
$redis,
env()['CHEVERETO_CACHE_KEY_PREFIX'],
@@ -1435,7 +1479,13 @@ function loaderHandler(
);
}
new Cache($keyValue);
- if ($_session === []
+ $isAPI = str_starts_with(
+ server()['REQUEST_URI'] ?? '',
+ env()['CHEVERETO_HOSTNAME_PATH']
+ . '/api/',
+ );
+ if (! ($isAPI || $isTenantsApi)
+ && $_session === []
&& session_status() === PHP_SESSION_NONE
&& ACCESS === 'web'
) {
@@ -1489,7 +1539,8 @@ function loaderHandler(
);
}
define('HTTP_APP_PROTOCOL', Config::host()->isHttps() ? 'https' : 'http');
- $httpPort = ! in_array(server()['SERVER_PORT'] ?? '80', ['80', '443'], false)
+ // TODO: Enable ENV to force using the port?
+ $httpPort = ! in_array(server()['SERVER_PORT'] ?? '80', ['80', '8080', '443'], false)
? ':' . server()['SERVER_PORT']
: '';
define('URL_APP_PUBLIC', HTTP_APP_PROTOCOL . '://' . Config::host()->hostname() . $httpPort . Config::host()->hostnamePath());
@@ -1851,6 +1902,14 @@ function getCounts(string ...$table): array
return DB::queryFetchSingle($query);
}
+function trialAwareLabel(): string
+{
+ return match ('1') {
+ env()['CHEVERETO_TRIAL'] => ' [trial]',
+ default => '',
+ };
+}
+
function assertMaxCount(string $table): void
{
$tablesToEnv = [
@@ -1867,7 +1926,7 @@ function assertMaxCount(string $table): void
code: 400
);
}
- $maxLimit = (int) (env()[$tablesToEnv[$table]] ?? 0);
+ $maxLimit = (int) (envTrialAware()[$tablesToEnv[$table]] ?? 0);
if ($maxLimit === 0) {
return;
}
@@ -1875,7 +1934,7 @@ function assertMaxCount(string $table): void
if (($count + 1) > $maxLimit) {
throw new OverflowException(
message(
- 'Maximum number of %t% reached (limit %s%).',
+ 'Maximum number of %t% reached (limit %s%).' . trialAwareLabel(),
t: $table,
s: strval($maxLimit),
),
@@ -1959,20 +2018,41 @@ function hashString(string $string): string
function getPoweredByRemarks(): array
{
+ $responsible = match (env()['CHEVERETO_CONTEXT']) {
+ 'saas' => _s('operator'),
+ default => _s('owner'),
+ };
$termsLink = 'Terms of Service ';
- $softwareLicenseLink = 'Chevereto License ';
- if (env()['CHEVERETO_EDITION'] === 'free') {
- $softwareLicenseLink = 'AGPL-3.0 license ';
+ $softwareLicenseLink = match (env()['CHEVERETO_EDITION']) {
+ 'free' => 'AGPL-3.0 license ',
+ default => 'Chevereto License ',
+ };
+ $websiteName = getSetting('website_name');
+ if (strtolower($websiteName) === 'chevereto') {
+ $websiteName = 'This website';
}
- $providerLink = '' . env()['CHEVERETO_PROVIDER_NAME'] . ' ';
+ $provider = match (env()['CHEVERETO_CONTEXT']) {
+ 'saas' => [
+ 'url' => env()['CHEVERETO_PROVIDER_URL'],
+ 'label' => env()['CHEVERETO_PROVIDER_NAME'],
+ ],
+ default => [
+ 'url' => get_public_url(),
+ 'label' => $websiteName,
+ ],
+ };
+ $providerLink = message(
+ '{{ label }} ',
+ ...$provider
+ );
$about = _s('This service is based on Chevereto %edition edition software licensed under the %license.', [
'%edition' => ucfirst(env()['CHEVERETO_EDITION']),
'%license' => $softwareLicenseLink,
]);
$liability = _s("This website is hosted in a service layer not provided by Chevereto Software, which hereby declare to do not have any control nor access to the management layer of this website and it won't be responsible for this service neither the damages that this service may cause.");
- $content = _s('File uploads are stored and served from storage facilities provided by %s and managed by The Service Operator.', $providerLink);
+ $content = _s('File uploads are stored and served from storage facilities provided and managed by the %s of this website.', $responsible);
if (env()['CHEVERETO_CONTEXT'] === 'saas') {
$about = _s('This service operates using Chevereto %edition edition software licensed under the %license.', [
'%edition' => ucfirst(env()['CHEVERETO_EDITION']),
@@ -1989,7 +2069,7 @@ function getPoweredByRemarks(): array
$liability = _s('This website is hosted on a service layer provided by %s. Chevereto Software is not responsible for the operation of this service, nor for any damages that may result from its use.', $providerLink);
}
if (env()['CHEVERETO_ENABLE_LOCAL_STORAGE'] === '0') {
- $content = _s('File uploads are stored and served using external storage providers configured by The Service Operator.')
+ $content = _s('File uploads are stored and served using external storage providers configured by the %s of this website.', $responsible)
. ' '
. _s('%s only hosts the database and application service layer.', $providerLink)
. ' '
@@ -2029,8 +2109,7 @@ function runAppCommand(
}
$logger->write(
<<cacheRootPrefix = env()['CHEVERETO_CACHE_KEY_ROOT_PREFIX']; // chv:
$this->cachePrefix = env()['CHEVERETO_CACHE_KEY_PREFIX']; // chv::
$this->tableRootPrefix = env()['CHEVERETO_DB_TABLE_ROOT_PREFIX']; // chv__
}
@@ -226,7 +230,7 @@ class Tenants
$tenantKey = $this->getCacheKey('tenant', $tenantId);
$tenantCache = $this->redis->get($tenantKey);
if ($tenantCache && $tenant === null) {
- $tenant = unserialize($tenantCache);
+ $tenant = $tenantCache;
}
$hostname = $tenant['hostname'] ?? null;
if ($hostname !== null) {
@@ -250,6 +254,24 @@ class Tenants
PLAIN
);
}
+ $tenantCachePattern = $this->cacheRootPrefix . $tenantId . ':*';
+ $iterator = null;
+ while ($iterator !== 0) {
+ $scan = $this->redis->scan($iterator, "{$tenantCachePattern}");
+ foreach ($scan as $key) {
+ $result = (bool) $this->redis->del($key);
+ $status = 'DELETE';
+ if ($result === false && ! $this->redis->get($key)) {
+ $status = ' 404';
+ }
+ $this->logger->write(
+ << {$key}
+
+ PLAIN
+ );
+ }
+ }
if ($dropTables) {
$likePattern = "{$this->tableRootPrefix}{$tenantId}_%";
$this->db->query(
@@ -371,7 +393,8 @@ class Tenants
'managers', s.managers,
'pages', s.pages,
'storages', s.storages,
- 'categories', s.categories
+ 'categories', s.categories,
+ 'login_providers', s.login_providers
) AS stats
FROM `{$tableTenantsStats}` AS s
WHERE s.tenant_id = t.id
@@ -464,12 +487,14 @@ class Tenants
$this->mergeTenantCacheable($tenant);
$cached = $this->redis->get($tenantKey);
if ($cached) {
- /** @var array $current */
- $current = unserialize($cached);
- $currentHostname = $current['hostname'];
- if ($currentHostname !== $tenant['hostname']) {
- $currentKey = $this->getCacheKey('hostname', $tenant['hostname']);
- $this->redis->del($currentKey);
+ try {
+ /** @var array $cached */
+ $cachedHostname = $cached['hostname'];
+ if ($cachedHostname !== $tenant['hostname']) {
+ $cachedKey = $this->getCacheKey('hostname', $cachedHostname);
+ $this->redis->del($cachedKey);
+ }
+ } catch (ErrorException) {
}
}
$this->cacheTenantArray($tenant);
@@ -700,8 +725,6 @@ class Tenants
$tableTenants = $this->db::getTable('tenants');
$tableTenantsPlans = $this->db::getTable('tenants_plans');
$tableTenantsStats = $this->db::getTable('tenants_stats');
- $tablePrefixTenant = $this->tableRootPrefix . $tenantId . '_';
- $statQuery = Stat::getStatQuery($tablePrefixTenant);
$this->db->query(
<<redis->mset(
[
$hostnameKey => $tenant['id'],
- $tenantKey => serialize($tenant),
+ $tenantKey => $tenant,
]
);
}
diff --git a/app/src/Tenants/TenantsConfig.php b/app/src/Tenants/TenantsConfig.php
new file mode 100644
index 0000000..5dd5618
--- /dev/null
+++ b/app/src/Tenants/TenantsConfig.php
@@ -0,0 +1,146 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Chevereto\Tenants;
+
+use Redis;
+use stdClass;
+use Throwable;
+
+/**
+ * Generates Traefik dynamic configuration for all tenants.
+ */
+final class TenantsConfig
+{
+ public const CF_RANGES = [
+ '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',
+ '2400:cb00::/32',
+ '2606:4700::/32',
+ '2803:f800::/32',
+ '2405:b500::/32',
+ '2405:8100::/32',
+ '2a06:98c0::/29',
+ '2c0f:f248::/32',
+ ];
+
+ public function __construct(
+ public readonly Redis $redis,
+ ) {
+ }
+
+ public function getConfig(
+ Tenants $tenants,
+ string $service,
+ int $port,
+ array $middleware
+ ): array {
+ $middlewares = [];
+ if (in_array('cf-only', $middleware)) {
+ $middlewares['cf-only'] = [
+ 'ipAllowList' => [
+ 'sourceRange' => $this->getCFRanges(),
+ ],
+ ];
+ }
+ $rows = $tenants->getTenantsRows();
+ $routers = [];
+ foreach ($rows as $row) {
+ $row = array_merge($row, [
+ 'limits' => [],
+ 'env' => [],
+ ]);
+ $tenant = Tenant::fromRow($row);
+ $routers[$tenant->id] = $this->getTenantRouter(
+ $tenant,
+ $service,
+ array_keys($middlewares)
+ );
+ }
+
+ return [
+ 'http' => [
+ 'routers' => $routers,
+ 'services' => [
+ $service => [
+ 'loadBalancer' => [
+ 'servers' => [
+ [
+ 'url' => sprintf(
+ 'http://%s:%d',
+ $service,
+ $port
+ ),
+ ],
+ ],
+ 'passHostHeader' => true,
+ ],
+ ],
+ ],
+ 'middlewares' => $middlewares,
+ ],
+ ];
+ }
+
+ public function getTenantRouter(Tenant $tenant, string $service, array $middlewares): array
+ {
+ return [
+ 'rule' => "Host(`{$tenant->hostname}`)",
+ 'service' => $service,
+ 'entryPoints' => ['websecure'],
+ 'tls' => new stdClass(),
+ 'middlewares' => $middlewares,
+ ];
+ }
+
+ public function getCFRanges(): array
+ {
+ $cacheKey = 'cf:ip-ranges';
+ $cached = $this->redis->get($cacheKey);
+ if ($cached !== false) {
+ return json_decode($cached, true);
+ }
+
+ try {
+ $v4 = file_get_contents('https://www.cloudflare.com/ips-v4');
+ $v6 = file_get_contents('https://www.cloudflare.com/ips-v6');
+ $ranges = array_values(
+ array_filter(
+ array_map(
+ 'trim',
+ array_merge(
+ explode("\n", $v4),
+ explode("\n", $v6),
+ )
+ )
+ )
+ );
+ } catch (Throwable) {
+ return self::CF_RANGES;
+ }
+ $this->redis->setex($cacheKey, 3600, json_encode($ranges));
+
+ return $ranges;
+ }
+}
diff --git a/app/src/Vars/functions.php b/app/src/Vars/functions.php
index 393733f..28706da 100644
--- a/app/src/Vars/functions.php
+++ b/app/src/Vars/functions.php
@@ -28,6 +28,55 @@ function env(): array
return $cache;
}
+/**
+ * Returns the ENV array but limited when CHEVERETO_TRIAL='1' by
+ * * `CHEVERETO_TRIAL_MAX_*` (numeric limits) and
+ * * `CHEVERETO_TRIAL_ENABLE_*` (boolean flags).
+ *
+ * The trial variables may only be used to *decrease* the value of the
+ * corresponding default. In other words, if the trial value is more
+ * permissive than the default, the default value will always be returned.
+ * This keeps the SaaS trial from accidentally granting greater privileges
+ * than the shipped product.
+ */
+function envTrialAware(): array
+{
+ if (env()['CHEVERETO_TRIAL'] !== '1') {
+ return env();
+ }
+ static $cache;
+ if (! isset($cache)) {
+ $cache = [];
+ /** @var string $value */
+ foreach (env() as $key => $value) {
+ $defaultValue = $value;
+ if (str_starts_with($key, 'CHEVERETO_MAX_')) {
+ $trialMax = 'CHEVERETO_TRIAL_MAX_' . substr($key, strlen('CHEVERETO_MAX_'));
+ /** @var string $trialValue */
+ $trialValue = array_key_exists($trialMax, env())
+ ? env()[$trialMax]
+ : '0';
+ $cache[$key] = intval($trialValue) > intval($defaultValue)
+ ? $defaultValue
+ : $trialValue;
+ } elseif (str_starts_with($key, 'CHEVERETO_ENABLE_')) {
+ $trialEnable = 'CHEVERETO_TRIAL_ENABLE_' . substr($key, strlen('CHEVERETO_ENABLE_'));
+ /** @var string $trialValue */
+ $trialValue = array_key_exists($trialEnable, env())
+ ? env()[$trialEnable]
+ : '0';
+ $cache[$key] = intval($trialValue) > intval($defaultValue)
+ ? $defaultValue
+ : $trialValue;
+ } else {
+ $cache[$key] = $value;
+ }
+ }
+ }
+
+ return $cache;
+}
+
function request(): array
{
static $cache;
diff --git a/content/images/system/default/home_cover.jpg b/content/images/system/default/home_cover.jpg
index 489f54b..8356d6d 100644
Binary files a/content/images/system/default/home_cover.jpg and b/content/images/system/default/home_cover.jpg differ
diff --git a/content/legacy/themes/Peafowl/lib/peafowl.css b/content/legacy/themes/Peafowl/lib/peafowl.css
index 349c916..a73e46c 100644
--- a/content/legacy/themes/Peafowl/lib/peafowl.css
+++ b/content/legacy/themes/Peafowl/lib/peafowl.css
@@ -3353,6 +3353,11 @@ body.landing .top-btn-text {
padding: 10px 0;
}
+.panel-thumb-list a {
+ display: block;
+ line-height: 0;
+}
+
.panel-thumb-list img {
display: block;
width: 47px;
@@ -4527,6 +4532,7 @@ a.top-user-avatar {
.header-content .user-image img,
.header .user-image img {
border-radius: 50%;
+ -o-object-fit: cover;
object-fit: cover;
}
diff --git a/content/legacy/themes/Peafowl/lib/peafowl.min.css b/content/legacy/themes/Peafowl/lib/peafowl.min.css
index ab791b1..7262c14 100644
--- a/content/legacy/themes/Peafowl/lib/peafowl.min.css
+++ b/content/legacy/themes/Peafowl/lib/peafowl.min.css
@@ -1 +1 @@
-:root{--colorBlue:rgb(0, 110, 219);--colorBlueHover:rgb(0, 119, 237);--colorGreen:#2ecc71;--colorGreenHover:#27ae60;--colorOrange:#e67e22;--colorOrangeHover:#d35400;--colorPurple:#9b59b6;--colorPurpleHover:#8e44ad;--colorRed:#e74c3c;--colorRedHover:#c0392b;--colorYellow:#f1c40f;--colorYellowHover:#f39c12}:root{color-scheme:light;--colorSuccess:var(--colorGreen);--colorFail:var(--colorRed);--alertAccent:#f1c40f;--alertBackground:#fff5b3;--alertText:#161c1d;--backgroundDarkAlpha:rgb(0 0 0 / 80%);--backgroundLightAlpha:rgb(255 255 255 / 90%);--bodyBackground:#FFF;--bodyEmpty:#e2e8e9;--bodySeparator:#e2e8e9;--bodyText:#161c1d;--bodyTextDisabled:#c5d1d3;--bodyTextSubtle:#6c7779;--buttonAccentBackground:var(--colorAccent);--buttonAccentHoverBackground:var(--colorAccentStrong);--buttonAccentHoverText:var(--buttonAccentText);--buttonAccentText:#FFF;--buttonDefaultBackground:#d9e1e2;--buttonDefaultBorder:var(--buttonDefaultBackground);--buttonDefaultHoverBackground:#c0def2;--buttonDefaultHoverBorder:var(--buttonDefaultHoverBackground);--buttonDefaultHoverText:var(--buttonAccentBackground);--buttonDefaultText:#161c1d;--colorAccent:var(--colorBlue);--colorAccentStrong:var(--colorBlueHover);--inputBackground:#ecf0f1;--inputPlaceholderText:#8aa2a8;--inputText:#161c1d;--linkText:rgb(0, 102, 204);--menuBackground:hsla(0, 5.9%, 98.9%, .7);--menuItemHoverBackground:var(--colorAccent);--menuItemHoverText:#FFF;--menuItemText:#161c1d;--menuSeparator:rgba(11, 14, 15, 0.1);--menuBorder:var(--menuSeparator);--menuText:#161c1d;--modalBackground:var(--bodyBackground);--modalText:#161c1d;--topBarBackground:rgb(255 255 255);--topSubBarBackground:var(--topBarBackground);--topBarText:#161c1d;--viewerBackground:#323232;--listItemText:#FFF}*{-ms-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none}.btn,.btn-container,.input-search,.link,.list-item,.no-select,.pop-btn-text,.top-btn-text,.user-select-none{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.animate{transition:all .2s ease-in-out}.animate--slow{transition-duration:.4s}[type=search]{-moz-appearance:textfield;-webkit-appearance:textfield;appearance:textfield}::-webkit-input-placeholder{color:var(--inputPlaceholderText);line-height:140%}:-moz-placeholder{color:var(--inputPlaceholderText);opacity:1}::-moz-placeholder{color:var(--inputPlaceholderText);opacity:1}:-ms-input-placeholder{color:var(--inputPlaceholderText)}:focus::-webkit-input-placeholder{color:var(--inputPlaceholderText)}:focus:-moz-placeholder{color:var(--inputPlaceholderText)}:focus::-moz-placeholder{color:var(--inputPlaceholderText)}focus:-ms-input-placeholder{color:var(--inputPlaceholderText)}::-moz-focus-inner{border:0;padding:0;margin:0}::-ms-clear{display:none}body{min-height:100vh;min-height:100dvh;min-height:-webkit-fill-available;-webkit-font-smoothing:subpixel-antialiased}[type=submit]:focus,button:focus{outline:0}html{height:100%;height:-webkit-fill-available}body,html{min-height:100vh;min-height:100dvh;font-family:Helvetica,Arial,sans-serif;color:var(--bodyText);font-size:16px;background:var(--bodyBackground);-webkit-text-size-adjust:100%}kbd{font-family:inherit}.pointer-events-none{pointer-events:none}#menu-fullscreen,#pop-box-mask.fullscreen{height:100%}#menu-fullscreen,.pop-box{transition:transform 350ms cubic-bezier(.4,0,0,1),opacity 350ms cubic-bezier(.4,0,0,1)}#menu-fullscreen>ul{position:relative;z-index:1000;background:var(--topBarBackground);color:var(--topBarText)}body.no-margin-top{margin-top:0;padding-top:0}.content-width{width:100%;-webkit-margin-end:auto;margin-inline-end:auto;-webkit-margin-start:auto;margin-inline-start:auto;position:relative;-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:10px;padding-inline-end:10px}a{color:var(--linkText);text-decoration:none;cursor:pointer;outline:0}a[rel=external]::after{font-weight:900;font-family:"Font Awesome 5 Free";-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;-webkit-margin-start:.25em;margin-inline-start:.25em;content:"\f35d";font-size:90%}a[role=button]:hover{text-decoration:none}a:focus,a:hover{text-decoration:underline}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1}.ui-selectable-helper{background:var(--colorAccent);border:2px dashed var(--topBarBackground);position:absolute;z-index:500;opacity:.6}.image-container{transition:transform 180ms cubic-bezier(.25,1,.5,1)}.selected .image-container,.ui-selecting .image-container{transform:scale(.5)}.selected .list-item-play-gif,.ui-selecting .list-item-play-gif{transform:scale(.75)}.selected .image-container img,.selected .image-container svg,.ui-selecting .image-container img,.ui-selecting .image-container svg{border-radius:.5em;transform:translateZ(0)}.hidden{display:none!important}.visible{display:block!important}.fab.soft-hidden,.far.soft-hidden,.fas.soft-hidden,.soft-hidden{display:none}.soft-visible{display:block}.hidden-visibility{visibility:hidden;position:absolute;top:0}.touch-scroll{overflow:auto;-webkit-overflow-scrolling:touch}.or-separator{border-top:1px solid var(--bodySeparator);text-align:center;margin:10px 0 10px 0}.or-separator span{font-size:.93em;font-weight:400;color:var(--bodySeparator);text-transform:uppercase;text-align:center;background:var(--bodyBackground);display:inline-block;position:relative;padding:0 10px;top:-10px}.highlight{color:var(--alertText);background:var(--alertBackground)}.highlight:empty{display:none}.line-through{text-decoration:line-through}.line-separator{width:100%;height:1px;background:var(--bodySeparator);display:block;margin:20px 0;border:0}.number-figures,a.number-figures{font-size:1.21em;line-height:1.21em;color:inherit;text-decoration:none;-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:10px;padding-inline-end:10px;-webkit-margin-start:0;margin-inline-start:0;-webkit-border-start:1px solid var(--bodySeparator);border-inline-start:1px solid var(--bodySeparator);text-align:center}.number-figures:first-child{-webkit-padding-start:0;padding-inline-start:0;-webkit-border-start:none;border-inline-start:none}.number-figures:last-child{-webkit-padding-end:0;padding-inline-end:0}.number-figures b{font-weight:inherit}.number-figures .icon-heart4{position:relative;top:1px}.number-figures span:not(.icon){color:var(--bodyTextSubtle);text-transform:uppercase;font-size:.6em}a.number-figures:hover,a.number-figures:hover *{color:var(--linkText)}.loading-indicator,.loading-text{display:inline-block;line-height:inherit;vertical-align:top}.loading-text{-webkit-margin-start:5px;margin-inline-start:5px}.btn-alt{color:var(--bodyTextSubtle);font-size:13px;font-size:.93rem;margin:0 5px;display:inline!important}.btn-alt a:first-letter{text-transform:capitalize}.phone .btn-alt{margin:5px 0 0}.btn-alt a{-webkit-margin-start:5px;margin-inline-start:5px;cursor:pointer}a.link{font-size:13px;font-size:.93rem;text-decoration:none;font-weight:400}.pop-box-menu a.link--delete,[data-action=delete],a.link--delete{color:#e74c3c}html:not(.phone) .pop-box-menu a.link--delete:hover{background-color:#e74c3c}a.link--approve{color:#2ecc71}a.link span.icon,a.link:hover span.icon{text-decoration:none}a.link:hover span{text-decoration:underline}.disabled,.disabled a{color:var(--bodyTextDisabled)}.disabled a{text-decoration:none;cursor:default}.optional{font-size:.6em;color:var(--bodyTextSubtle);font-weight:400}.text-shadow{text-shadow:2px 2px 3px rgba(0,0,0,.75);-webkit-filter:dropshadow(color=#000000, offx=2, offy=2);filter:dropshadow(color=#000000, offx=2, offy=2)}.box-shadow{box-shadow:2px 2px 3px 0 rgba(0,0,0,.45)}.silent-links a,a.silent-links{color:inherit}.close-box .icon-circle{color:var(--bodyText);position:relative}.close-box .icon-close-box{color:#fff;position:absolute;inset-inline-start:0;top:0}.transparent-canvas{background-image:url(data:image/gif;base64,R0lGODlhEAAQAIAAAP///9/f3yH5BAAHAP8ALAAAAAAQABAAAAIfjG+gq4jM3IFLJgpswNly/XkcBpIiVaInlLJr9FZWAQA7);background-repeat:repeat}.transparent-canvas.dark{background-image:url(data:image/gif;base64,R0lGODlhEAAQAIAAAOfn58rKyiH5BAAHAP8ALAAAAAAQABAAAAIfjG+gq4jM3IFLJgpswNly/XkcBpIiVaInlLJr9FZWAQA7)}input,select,textarea{font-family:inherit;font-size:1rem;display:inline-block}html:not(.safari) select,input,textarea{border-radius:3px;color:var(--inputText);border:1px solid transparent;background:var(--inputBackground)}input:-webkit-autofill,select:-webkit-autofill,textarea:-webkit-autofill{-webkit-text-fill-color:var(--inputText)!important}.input-focus,html:not(.safari) select:focus,input.search:focus,input:focus,textarea:focus{border-color:var(--colorAccent)}input:-webkit-autofill,input:-webkit-autofill:focus,input:-webkit-autofill:hover,select:-webkit-autofill,select:-webkit-autofill:focus,select:-webkit-autofill:hover{-webkit-text-fill-color:inherit;-webkit-box-shadow:inset 0 0 0 9999px transparent;-webkit-transition:background-color 5000s ease-in-out 0s;transition:background-color 5000s ease-in-out 0s}select{font:inherit;outline:0}.text-input,textarea{outline:0}input[type=checkbox],input[type=radio]{border-radius:0;border:none;position:relative;vertical-align:baseline}.input-line-height,.text-input,input[type=text]{height:36px}.input-line-height{line-height:36px}.text-input,input[type=text]:not(.text-input),textarea{padding:7px 10px;width:100%}.ie7 .text-input,.ie7 input[type=text],.ie7 textarea{padding:10px;width:328px;height:14px}.ie8 .text-input,.ie8 input[type=text],.ie8 textarea,.ie9 .text-input,.ie9 input[type=text],.ie9 textarea{height:auto}.input,.input-label{position:relative;overflow:visible;scroll-snap-align:start}.input{margin:10px 0;font-size:1em}.input.first-child,.input:first-child{margin-top:0}.input-label{margin:20px 0}.input-label.first-child,.input:first-child{margin-top:0}.input-label h3,.input-label label,.input-label-label{font-weight:600;padding-bottom:5px;display:inline-block;font-size:1em}.input-label h3{display:block}.input-label h3 a,.input-label label a{font-weight:400}.input-label label .caption,.input-label label .optional{font-weight:400;font-size:.92em}.input-label .btn-alt{position:absolute;inset-inline-start:100%;top:23px;line-height:36px;-webkit-margin-start:10px;margin-inline-start:10px;-webkit-margin-end:0;margin-inline-end:0}.phone .input-label .btn-alt{position:static;-webkit-margin-start:0;margin-inline-start:0}.checkbox-label,.input-label{position:relative;font-size:.93em}.input .icon-input-submit{background:0 0;font-size:1.82em;color:#d9d9d9;position:absolute;inset-inline-end:.21em;top:.21em;cursor:pointer;line-height:1}.input .icon-input-submit.focus,.input .icon-input-submit:focus,.input .icon-input-submit:hover{color:var(--colorAccent)}.ie7 .input .icon-input-submit{top:2px}.ui-autocomplete{max-height:130px;overflow-y:auto;overflow-x:hidden}* html .ui-autocomplete{height:125px}.autocomplete-list{min-width:50%;position:absolute;z-index:1;inset-inline-start:0;-webkit-margin-before:0;margin-block-start:0;border:1px solid var(--bodySeparator);border-radius:var(--borderRadius);background:var(--bodyBackground);box-shadow:0 4px 14px rgba(0,0,0,.25);--borderRadius:3px}.autocomplete-list:empty{display:none}.autocomplete-list li{color:inherit;padding:4px 16px;display:block;cursor:pointer;border-bottom:1px solid var(--bodySeparator)}.autocomplete-list li:first-child{border-top-left-radius:var(--borderRadius);border-top-right-radius:var(--borderRadius)}.autocomplete-list li:last-child{border-bottom:0;border-bottom-right-radius:var(--borderRadius);border-bottom-left-radius:var(--borderRadius)}.autocomplete-list li.--focus,.autocomplete-list li:hover{background:var(--buttonAccentBackground);color:var(--buttonAccentText)}.hide-empty:empty{display:none}.input-column{width:350px}.input-warning{color:var(--bodyTextSubtle);inset-inline-end:0;top:0}.input-below{margin-top:5px;display:block;position:static}.red-warning{color:#d74634}.input-password input[type=password][id=new-password]{-webkit-padding-end:65px;padding-inline-end:65px}.input-password .input-password-strength{position:absolute;inset-inline-end:11px;top:50%;margin-top:5px}.fancy-fieldset .input-password{display:flex;align-items:center}.fancy-fieldset .input-password-strength{inset-inline-end:0;top:auto;margin-top:0}.input-password-strength{background:var(--bodyEmpty)}.input-password-strength,.input-password-strength span{display:block;width:50px;height:8px}.input-password-strength span{width:0%;background-color:transparent}.input-password-strength [data-veredict=very-weak]{background-color:#e74c3c}.input-password-strength [data-veredict=weak]{background-color:#e67e22}.input-password-strength [data-veredict=average],.input-password-strength [data-veredict=strong],.input-password-strength [data-veredict=stronger]{background-color:#2ecc71}.checkbox-label{font-size:1em;display:block;margin:5px 0;position:relative}.checkbox-label:last-child{margin-bottom:0}.checkbox-label input{position:absolute;padding:0;margin:0;-webkit-margin-start:-20px;margin-inline-start:-20px}.btn-alt.checkbox-label input{position:static;vertical-align:text-top;-webkit-margin-end:4px;margin-inline-end:4px}.phone .btn-alt.checkbox-label{display:block!important;margin:10px 0}.checkbox-label label{-webkit-padding-start:20px;padding-inline-start:20px;font-weight:400;margin:0;padding-bottom:0}.fancy-box .checkbox-label label{display:flex;align-items:flex-start}.input-search{position:relative}input.search{font-size:1em;border-radius:200px;padding:0 25px 0 32px;-webkit-padding-end:3.0666em;padding-inline-end:3.0666em;-webkit-padding-start:2.3571em;padding-inline-start:2.3571em;line-height:100%;height:26px;height:1.86em;width:100%;border:1px solid transparent;top:0;inset-inline-start:0;outline:0;vertical-align:text-bottom}input.search::-webkit-input-placeholder{font-size:1em}input.search:-moz-placeholder{font-size:1em}input.search::-moz-placeholder{font-size:1em}input.search:-ms-input-placeholder{font-size:1em}input.search.one-icon-padding,input.search.two-icon-padding{-webkit-padding-end:2em;padding-inline-end:2em}input.search.two-icon-padding{-webkit-padding-start:2.2em;padding-inline-start:2.2em}.top-bar input.search{-webkit-padding-start:calc(1.625rem + 7px);padding-inline-start:calc(1.625rem + 7px);position:relative;-webkit-padding-end:34px;padding-inline-end:34px;background:0 0;border:0;box-shadow:none!important}.top-bar input{color:var(--topBarText)}.ie7 input.search,.ie8 input.search,.ie9 input.search{-webkit-padding-end:10px;padding-inline-end:10px;line-height:26px;height:26px}.ie7 input.search{padding:0;width:200px}.input-search span{position:absolute;cursor:pointer}.input-search .icon--search{color:var(--inputText);left:.85714286rem;top:50%;transform:translateY(-50%)}.top-bar .input-search .icon--search{font-size:1.28571429rem;line-height:50px;width:1.625rem;left:0;text-align:center}.input-search .icon--search,.top-btn-text .icon--search{font-size:1em;width:1em}.input-search .icon--close,.input-search .icon--settings{color:var(--inputText);padding:.5em;top:0;font-size:1em}.input-search .icon--close:hover,.input-search .icon--settings:hover{color:var(--colorAccent)}.input-search .icon--close{-webkit-padding-end:.75em;padding-inline-end:.75em;margin-right:-.5em}#menu-fullscreen .input-search .icon--settings,.input-search .icon--settings{inset-inline-end:22px}#menu-fullscreen .input-search .icon--close,.input-search .icon--close{inset-inline-end:4px}.ie7 .input-search .icon--close,.ie8 .input-search .icon--close,.ie9 .input-search .icon--close{display:none}select{-webkit-padding-start:7px!important;padding-inline-start:7px!important}.ie7 select{width:100%!important;padding:0!important;height:auto!important}select option{padding:4px 10px;margin:0}textarea{resize:both;height:80px}.input-upload{position:relative}.user-settings-avatar{min-height:160px;height:auto}.user-settings-avatar-container{position:relative}.user-settings-avatar-container,.user-settings-avatar-container .user-image{font-size:160px;width:1em;height:1em}.user-settings-avatar .loading-placeholder{position:absolute;inset-inline-start:0;top:0;background:var(--bodyEmpty)}.phone .user-settings-avatar-container{margin:0 auto 10px!important}.input-upload .btn-container{margin:0 0 5px 0}.input-upload .btn-alt{-webkit-margin-start:0;margin-inline-start:0}.arrow-down{border-width:4px 4px 0 4px;border-color:#333 transparent transparent transparent;border-color:#333 transparent transparent transparent;content:""}.arrow-down{border-style:solid;display:inline-block;height:0;width:0;vertical-align:middle}.sign-services li{display:inline-block;margin:0 4px 4px 0}.sign-service{font-size:.93em;padding:0 8px;line-height:30px;height:29px}.sign-service .btn-icon{font-size:inherit;width:auto}.sign-services-compact .btn-text{display:none}.link-service,.sign-service{color:#fff;display:inline-block;text-decoration:none!important}.link-service span,.sign-service{border-radius:3px}.link-service{font-weight:400;height:28px;position:relative}.link-service span{display:block;line-height:28px;text-align:center!important}.link-service .btn-icon{width:28px;height:28px;-webkit-margin-end:4px;margin-inline-end:4px;position:absolute;inset-inline-start:0;top:0}.link-service span.sign-text{padding:0 20px;-webkit-margin-start:32px;margin-inline-start:32px}.btn-social .btn-icon,.sign-service .icon{color:#fff;position:relative;display:inline-block}.buttons{display:flex;flex-wrap:wrap;gap:5px;justify-content:flex-start}.buttons.text-align-right{justify-content:flex-end}.phone .buttons{justify-content:center}.buttons .btn{display:inline-block;text-align:center}.btn-container{margin-top:20px;margin-bottom:20px;position:relative}.btn{height:36px;line-height:36px;height:2.57142857rem;line-height:2.57142857rem;font-family:inherit;font-size:1em;font-weight:400;padding:0 10px;border-radius:3px;cursor:pointer;display:inline-block;text-decoration:none;border:1px solid transparent;white-space:nowrap}.btn>*{pointer-events:none}.btn,.btn:active,.btn:focus,.btn:hover{text-decoration:none}.btn.default:active,.btn:active{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-icon{display:inline-block;text-align:center;width:1.4em}.btn-text{-webkit-margin-start:4px;margin-inline-start:4px}.btn-text:empty{display:none}.btn-big{font-size:16px;font-size:1.143rem;height:38px;line-height:38px;-webkit-padding-start:1em;padding-inline-start:1em;-webkit-padding-end:1em;padding-inline-end:1em}.btn-small{font-size:13px;height:30px;line-height:30px;font-size:.92rem;height:2.14285714rem;line-height:2.14285714rem}.btn-input{font-weight:600;font-size:.93em;-webkit-padding-start:20px;padding-inline-start:20px;-webkit-padding-end:20px;padding-inline-end:20px}.btn-32{width:32px;height:32px;text-align:center;display:inline-block}.btn-32 .btn-icon{font-size:18px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%)}.btn-capsule{border-radius:100px;border-color:rgba(255,255,255,.1);background-color:rgba(0,0,0,.5);-webkit-backdrop-filter:blur(17.5px) saturate(1.8);backdrop-filter:blur(17.5px) saturate(1.8);background-image:none;height:auto;color:#fff;text-shadow:none;font-size:.93em;height:2.15em;line-height:2.15em;font-weight:400;padding:0 1.15em;box-shadow:none;-webkit-filter:none;filter:none}.btn-capsule:hover{background-color:rgba(0,0,0,.7);border-color:rgba(255,255,255,.3)}.no-rgba .btn-capsule{border-color:#666;background-color:none;zoom:1}.btn-capsule:active{box-shadow:none}.btn-capsule .btn-icon{font-size:.93em}.btn.accent{color:var(--buttonAccentText);border:1px solid transparent;background:var(--buttonAccentBackground)}.btn.accent:not(.outline):hover{color:var(--buttonAccentHoverText);background:var(--buttonAccentHoverBackground)}.btn.accent.outline{color:var(--buttonAccentBackground);border-color:var(--buttonAccentBackground);box-shadow:none}.btn.accent.outline:hover{color:var(--buttonAccentHoverBackground);border-color:var(--buttonAccentHoverBackground)}.btn.default{color:var(--buttonDefaultText);border-color:var(--buttonDefaultBorder);background:var(--buttonDefaultBackground)}.btn.default--hover:not(.outline),.btn.default:not(.outline):hover{color:var(--buttonDefaultHoverText);background:var(--buttonDefaultHoverBackground);border-color:var(--buttonDefaultHoverBorder)}.btn.default.outline{color:var(--buttonDefaultBackground);border-color:var(--buttonDefaultBackground);box-shadow:none}.btn.default.outline:hover{color:var(--buttonDefaultHoverBackground);border-color:var(--buttonDefaultHoverBackground)}.btn.disabled,.btn.disabled:hover{color:var(--bodyTextSubtle);background-color:var(--buttonDefaultBackground);background-image:none;box-shadow:none;cursor:default}.btn.disabled.outline,.btn.disabled.outline:hover{color:var(--bodyTextSubtle);border-color:var(--bodyTextSubtle)}.btn.plain,.btn.plain:hover{background:0 0;text-shadow:none;border-color:transparent;box-shadow:none;padding:0;color:inherit}.btn.plain:active{box-shadow:none}.btn.active{background-image:none;background-color:var(--colorAccent);border-color:var(--colorAccent);-webkit-filter:none;filter:none}.btn.grey,.btn.grey.off:hover{background-color:#eee}.btn.grey:hover{background-color:#e9e9e9}.btn.grey.outline{color:#eee}.btn.orange,.btn.orange.off:hover{border-color:#fe771d;background-color:#fe771d}.btn.orange:hover{background-color:#fe6b0a}.btn.orange.outline{color:#fe771d}.btn.purple,.btn.purple.off:hover{border-color:#8e44ad;background-color:#8e44ad}.btn.purple:hover{background-color:#8e44ad}.btn.purple.outline{color:#8e44ad}.btn.blue,.btn.blue.off:hover{border-color:var(--colorBlue);background-color:var(--colorBlue)}.btn.blue:hover{background-color:#2879b0}.btn.blue.outline{color:var(--colorBlue)}.btn.green,.btn.green.off:hover{background-color:var(--colorGreen)}.btn.green:not(.outline):hover{background-color:var(--colorGreenHover)}.btn.green.outline{color:var(--colorGreen);border-color:var(--colorGreenHover)}.btn.red,.btn.red.off:hover{border-color:var(--colorRed);background-color:var(--colorRed)}.btn.red:not(.outline):hover{background-color:var(--colorRedHover)}.btn.red.outline{color:var(--colorRed)}.btn.red.outline:hover{color:var(--colorRedHover);border-color:var(--colorRedHover)}.btn.white,.btn.white.off:hover{border-color:#fff;background-color:#fff}.btn.white:hover{background-color:#fff}.btn.white.outline{color:#fff}.btn.black,.btn.black.off:hover{border-color:#3a3a3a;background-color:#3a3a3a}.btn.black:hover{background-color:#343434}.btn.black.outline{color:#3a3a3a}.btn.active,.btn.black,.btn.blue,.btn.green,.btn.orange,.btn.red{color:#fff;border:1px solid transparent}.btn.grey,.btn.white{color:#161c1d}.btn.off{cursor:default}.btn.off:active{box-shadow:none}.btn-social{color:var(--buttonDefaultText);background:var(--buttonDefaultBackground);background-image:none;box-shadow:none;border:1px solid transparent}.btn-social.btn-at .btn-icon,.btn-social.btn-share .btn-icon{color:var(--buttonDefaultText)}.btn-social,.btn-social:hover{text-decoration:none;text-shadow:none}.btn-x-twitter,.link-x-twitter span{background:#000}.btn-twitter,.link-twitter span{background:#55acee}.btn-facebook,.link-facebook span{background:#3b5998}.btn-google,.btn-google-plus,.link-google span,.link-google-plus span{background:#d74836}.btn-mail{background:#ccc;color:var(--bodyText)}.btn-mail span{color:var(--bodyText)}.btn-tumblr{background:#35465c}.btn-pinterest{background:#bd081c}.btn-stumbleupon{background:#eb4924}.btn-blogger{background:#f57d00}.btn-whatsapp{background:#43d854}.btn-telegram{background:#08c}.btn-weixin{background:#7bb32e}.btn-weibo{background:#df2029}.btn-qzone{background:#ffce00}.btn-qq{background:#121214}.btn-reddit{background:#ff4500}.btn-reddit .btn-icon{color:#fff}.btn-vk,.link-vk span{background:#45668e}.btn.outline,.btn.outline:hover{background:0 0;border:1px solid;box-shadow:none}.pop-btn,.top-btn-el,a[data-modal]{-webkit-tap-highlight-color:transparent}.pop-btn *,.top-btn-el *{-webkit-tap-highlight-color:rgba(0,0,0,.2)}.pop-btn,.top-btn-el{display:inline-block;position:relative;cursor:pointer}.pop-box-inner{cursor:default;display:block;-webkit-overflow-scrolling:touch;overflow:auto}.pop-box-inner form{margin-top:-20px;margin-bottom:-20px}.btn.pop-btn .pop-box{line-height:100%}.pop-btn-text{color:var(--linkText);cursor:pointer}.ie7 .pop-btn-text,.ie8 .pop-btn-text{-webkit-padding-end:0;padding-inline-end:0}.pop-btn-text .arrow-down{vertical-align:middle;-webkit-margin-start:5px;margin-inline-start:5px;border-top-color:var(--linkText)}.pop-btn.disabled{cursor:default}.pop-btn.disabled .pop-btn-text{color:var(--bodyTextDisabled);cursor:default}.pop-btn.disabled .arrow-down{border-top-color:var(--bodyTextDisabled)}.pop-box{color:var(--menuText);background:var(--menuBackground);-webkit-backdrop-filter:blur(27.5px) saturate(1.8);backdrop-filter:blur(27.5px) saturate(1.8);display:none;font-size:1em;z-index:200;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid var(--menuBorder)}.phablet .pop-box,.phone .pop-box{font-size:inherit;border-color:transparent}.pop-box .or-separator{border-top-color:var(--menuSeparator);margin-left:10px;margin-right:10px}.phablet .pop-box .or-separator,.phone .pop-box .or-separator{border-top-color:var(--topBarText);opacity:.25}@media (min-width:992px){.pop-box{position:absolute;top:20px;min-height:20px;min-width:190px;box-shadow:0 4px 14px rgba(0,0,0,.25);border-radius:6px;box-sizing:content-box;--columnGutter:5px;--columnWidth:190px;--columnWidthOuter:calc(var(--columnWidth) + var(--columnGutter))}.header--height .pop-box{min-width:240px}.pop-box,.pop-box.left-anchor{inset-inline-start:0}.pop-box.anchor-center{inset-inline-start:50%!important}.pop-box.anchor-right{inset-inline-start:auto;inset-inline-end:0}.pop-box.pbcols2{width:calc(2 * var(--columnWidthOuter) + var(--columnGutter))}.pop-box.pbcols3{width:calc(3 * var(--columnWidthOuter) + var(--columnGutter))}.pop-box.pbcols4{width:calc(4 * var(--columnWidthOuter) + var(--columnGutter))}.pop-box.pbcols5{width:calc(5 * var(--columnWidthOuter) + var(--columnGutter))}.pop-box.pbcols2 li,.pop-box.pbcols3 li,.pop-box.pbcols4 li,.pop-box.pbcols5 li{border-radius:6px}.pop-box-menucols ul{padding:10px 0;overflow:auto}.pop-box-menucols li{width:var(--columnWidth);float:left;margin:0 0 0 5px}[dir=rtl] .pop-box-menucols li{float:right}.pop-box-menucols li:first-child a,.pop-box-menucols li:last-child a{border-radius:0}}.pop-box-menu{font-size:13px;font-size:.92857143rem;-ms-scroll-snap-type:y mandatory;scroll-snap-type:y mandatory}.phablet .pop-box-menu,.phone .pop-box-menu{font-size:inherit}.pop-box-label{color:inherit;margin:10px;text-transform:uppercase;font-weight:700;font-size:85%;cursor:default}.pop-box-block{padding:0 10px}.pop-box-block .current::before{font-weight:900;font-family:"Font Awesome 5 Free";-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;-webkit-margin-end:.25em;margin-inline-end:.25em;content:"\f205";font-size:90%}.pop-box-menu .menu-item,.pop-box-menu a{display:block;padding:6px 10px;text-decoration:none;font-weight:400;line-height:143%;color:var(--menuItemText)}.pop-box-block a{display:inline-block;padding:6px;border-radius:.25em;line-height:1;font-size:1em}.phablet .pop-box,.phone .pop-box{color:var(--topBarText)}.phablet .pop-box-menu .menu-item,.phablet .pop-box-menu a,.phone .pop-box-menu .menu-item,.phone .pop-box-menu a{padding:10px;color:inherit}.phablet .pop-box-menu li.with-icon a .btn-icon,.phone .pop-box-menu li.with-icon a .btn-icon{top:11px}@media (min-width:992px){.pop-box-menu .menu-item,.pop-box-menu a{border-bottom:0}}.pop-box-menu a.focus,html:not(.phone) .pop-box-menu a:hover{background:var(--menuItemHoverBackground);color:var(--menuItemHoverText)}.pop-box-menu li.current a,.pop-box-menu li.current a:hover{color:var(--buttonDefaultHoverText);background:var(--buttonDefaultHoverBackground)}.pop-box-menu ul{display:block;padding:0}.phablet .pop-box-menu ul,.phone .pop-box-menu ul{display:flex;flex-wrap:wrap}.phablet .pop-box-menu ul li,.phone .pop-box-menu ul li{width:50%}@media (min-width:992px){.pop-box-menu ul{margin:5px 0}}.pop-box-menu li{display:block;text-align:start;overflow:hidden;position:relative}.pop-box-menu li.with-icon a{-webkit-padding-start:36px;padding-inline-start:36px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}html:not(.phone):not(.phablet) .header--height .pop-box-menu li a{-webkit-padding-end:25px;padding-inline-end:25px}.pop-box-menu li a kbd{position:absolute;top:50%;transform:translateY(-50%);inset-inline-end:10px;border-radius:2px;display:block;line-height:1;font-size:.9em;opacity:.5}.pop-box-menu li a:hover kbd{opacity:1}.phablet .pop-box-menu li a kbd,.phone .pop-box-menu li a kbd{display:none}.pop-box-menu li.with-icon a .btn-icon{position:absolute;inset-inline-start:10px;top:8px}.pop-box-menu li.current,.pop-box-menu li.current a{font-weight:600}.pop-box-menu li.current a:hover{cursor:default}.pop-box-userdetails{padding:10px;width:120%;min-width:var(--columnWidth);cursor:default;inset-inline-start:42px;line-height:normal;top:0!important;margin-top:0!important}.phablet .pop-box,.phone .pop-box{position:fixed;bottom:0;inset-inline-start:0!important;width:100%;top:auto!important;background:var(--topBarBackground);color:var(--topBarText)}@media all and (display-mode:standalone){.phablet .pop-box,.phone .pop-box{padding-bottom:30px}}.pop-box-header{font-weight:700;padding:15px 10px;position:relative;text-align:start;color:var(--topBarText)}.pop-box-header .icon--close{position:absolute;inset-inline-end:10px;top:50%;margin-top:-7px;font-size:1em;text-align:end}@media (min-width:992px){.pop-box-header{display:none}}.top-bar-placeholder{-webkit-backface-visibility:hidden;backface-visibility:hidden}.top-bar,.top-bar ul li.pop-btn,.top-bar ul li.top-btn-el,.top-bar-placeholder{height:50px}.top-btn-create-account,.top-btn-text{line-height:50px}.top-btn-text{-webkit-tap-highlight-color:transparent}.follow-scroll{transition:all .4s ease-out}.scroll-down #dashboard .top-sub-bar--1{top:50px}#dashboard .top-sub-bar--1:not(.follow-scroll){position:static}.top-bar,.top-sub-bar{left:0;right:0;width:100%;position:static;height:50px}.follow-scroll,.top-bar{position:-webkit-sticky;position:sticky}.top-bar{color:var(--topBarText);z-index:900;top:0}.top-bar--main{z-index:910}.top-bar--main .content-width{padding-left:5px;padding-right:5px}.top-sub-bar{color:var(--bodyText);z-index:500;overflow:visible;top:50px}body.pop-box-show .top-sub-bar--1{z-index:1}.top-sub-bar--1 .content-tabs-container{z-index:2}body.landing .top-bar,body.split .top-bar{position:fixed}.phablet .pop-box-show .top-bar,.phone .pop-box-show .top-bar{z-index:1}.follow-scroll-wrapper.position-fixed,.top-bar::before,.top-sub-bar::before{background:var(--topBarBackground);-webkit-backdrop-filter:blur(17.5px);backdrop-filter:blur(17.5px)}.top-sub-bar::before{background:var(--topSubBarBackground)}.top-bar::before,.top-sub-bar::before{-webkit-backface-visibility:hidden;backface-visibility:hidden}.top-bar::before,.top-sub-bar::before{width:100%;min-height:50px;position:absolute;content:" "}.top-bar .content-width,.top-sub-bar .content-width{position:relative;height:100%;-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:10px;padding-inline-end:10px}.top-bar-logo{width:100%;height:100%;position:absolute;top:0;text-align:center;inset-inline-start:0}.top-bar-logo img{height:20px}.top-bar-logo>a{display:inline-block;vertical-align:top;position:relative;top:50%;transform:translateY(-50%);text-decoration:none;font-weight:400;font-size:24px;color:var(--topBarText)}.top-bar-logo img{display:block;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto}.top-bar ul{list-style:none}.top-bar li.pop-btn,.top-bar li.top-btn-el{float:left;-webkit-padding-end:5px;padding-inline-end:5px;-webkit-padding-start:5px;padding-inline-start:5px;position:relative}[dir=rtl] .top-bar li.pop-btn,[dir=rtl] .top-bar li.top-btn-el{float:right}@media (min-width:992px){.top-bar li.pop-btn,.top-bar li.top-btn-el{-webkit-padding-end:10px;padding-inline-end:10px;-webkit-padding-start:10px;padding-inline-start:10px}.top-bar .top-bar-notifications.pop-btn{-webkit-padding-end:0;padding-inline-end:0}}.top-bar ul .pop-btn.current,.top-bar ul .top-btn-el.current{border-bottom:3px solid var(--colorAccent)}.top-bar ul .pop-btn.current .top-btn-text,.top-bar ul .top-btn-el.current .top-btn-text{text-shadow:none;box-shadow:none}.top-bar ul li.top-btn-el a{text-decoration:none;color:inherit}.phablet .top-bar-left,.phone .top-bar-left{-webkit-margin-start:-5px;margin-inline-start:-5px}.phablet .top-bar-right,.phone .top-bar-right{-webkit-margin-end:-5px;margin-inline-end:-5px}.top-btn-el.current[data-nav=mobile-menu]{border-bottom-color:transparent!important}.top-btn-el.current[data-nav=mobile-menu] .top-btn-text .icon:before{color:var(--topBarText)!important;content:"\f00d"}.top-bar-right li.pop-btn:last-child,.top-bar-right li.pop-btn:last-child .arrow-down{-webkit-margin-end:0;margin-inline-end:0}.top-btn-create-account,.top-btn-text{display:block;font-weight:400;font-size:1em;height:100%}#menu-fullscreen .btn.top-btn-create-account,.btn.top-btn-create-account:not(.grey):not(.white),.top-btn-text{color:inherit}.top-btn-text{text-decoration:none;color:var(--topBarText)}.top-bar #menu-fullscreen .top-btn-text{color:var(--topBarText)}body.landing .top-btn-text{color:var(--topBarText)}.top-btn-text .icon{-webkit-margin-end:7px;margin-inline-end:7px;position:relative;top:0;display:inline-block;font-size:18px;width:18px;font-size:1.28571429rem;width:1.625rem;line-height:50px;text-align:center}.current .top-btn-text .icon{color:var(--colorAccent)}.top-btn-text .btn-text{-webkit-margin-start:0;margin-inline-start:0}.top-btn-text .arrow-down{position:relative;margin:0 0 0 5px}.top-btn-text .btn-text{vertical-align:top}.top-btn-text .icon{-webkit-margin-end:0;margin-inline-end:0}#menu-fullscreen .top-bar-notifications .btn-text{display:inline-block}#menu-fullscreen #top-bar-user,#menu-fullscreen [data-nav=upload]{display:none}.top-bar-notifications-container{-webkit-margin-end:2px;margin-inline-end:2px;cursor:default}.top-bar-notifications-header{font-size:.93em;line-height:1;padding:12px 10px;overflow:auto}.top-bar-notifications-header,.top-bar-notifications-list li{border-bottom:1px solid var(--menuSeparator)}.top-bar-notifications-header h2{font-size:1em;font-weight:700;float:left}[dir=rtl] .top-bar-notifications-header h2{float:right}.top-bar-notifications-header a{float:right}[dir=rtl] .top-bar-notifications-header a{float:left}.top-bar-notifications-list li{display:block;text-decoration:none;padding:10px;position:relative;min-height:68px;-webkit-padding-start:68px;padding-inline-start:68px}.top-bar-notifications-list li:last-child{border-bottom:0}.top-bar-notifications-list li:hover{background:rgba(0,0,0,.02)}.top-bar-notifications-list li.transition{transition:background-color 150ms linear}.top-bar-notifications-list li.new,.top-bar-notifications-list li.persistent{background:#fffad9}.ie7 .top-bar-notifications-list li{min-height:48px}.top-bar-notifications-list li .user-image{width:48px;height:48px;position:absolute;left:10px;top:10px}.top-bar-notifications-list li .user-image img{width:100%;height:100%;display:block}.top-bar-notifications-list li .user-image span.icon{font-size:48px;width:48px;height:48px;-webkit-margin-start:-24px;margin-inline-start:-24px;margin-top:-24px}.top-bar-notifications-list li .how-long-ago{display:block;font-size:11px;color:var(--bodyTextSubtle)}.top-bar-notifications .top-btn-number{position:absolute;z-index:1;border-radius:100px;zoom:.75;inset-inline-end:-8px;top:10px;visibility:hidden}.top-bar-notifications .top-btn-number.on{visibility:visible}@media (min-width:992px){.top-bar .pop-box{margin:10px;z-index:200}}.top-bar-search-input .icon--close{inset-inline-end:-4px}.top-bar-search-input .icon--settings{inset-inline-end:14px}.top-bar .top-bar-search-input .icon--search{color:var(--colorAccent)}.top-bar-search-input{display:flex;justify-content:center;align-items:center}.top-bar-search-input .input-search{position:relative}.top-bar-search-input input{font-size:1em;border-width:0;-webkit-padding-start:36px;padding-inline-start:36px}.tone-light .top-bar .top-bar-search-input input{border-width:1px}.top-bar-left .pop-box{inset-inline-start:-10px}.top-bar-right .pop-box{inset-inline-start:auto;inset-inline-end:-10px}.top-bar--main .pop-box{top:calc(50% + 10px)}#top-predictive-search.pop-box{width:200px;inset-inline-start:0;font-size:100%}.top-bar .pop-account .or-separator{margin-top:30px;margin-bottom:30px}.top-btn-create-account{text-decoration:none;display:inline;padding:4px 12px;height:26px}.top-bar .opened .top-btn-text span:not(.btn-text),.top-bar .top-btn-text:hover span:not(.btn-text){color:var(--colorAccent)}.phone .top-bar .top-btn-text:hover span:not(.btn-text){color:inherit}.phone .top-bar .current .top-btn-text:hover span:not(.btn-text){color:var(--colorAccent)}.ios .top-bar .top-btn-text span:not(.btn-text):not(.top-btn-number):hover{color:var(--bodyText)}.ios .top-bar .opened .top-btn-text span:not(.btn-text),.ios .top-bar .opened .top-btn-text:not(.top-btn-number){color:var(--colorAccent)}.top-bar .btn:hover:not(.white):not(.grey),.top-bar .btn:not(.white):not(.grey),.top-bar .opened .btn:not(.white):not(.grey){color:#fff}.current .top-btn-create-account:hover{background:inherit}.current .top-btn-create-account{padding:0;background:0 0}.top-btn-number{background:#555;color:#ddd;font-size:12px;font-weight:400;border-radius:3px;padding:0 7px;position:relative;display:block;line-height:22px;height:22px;top:-2px}#menu-fullscreen .top-btn-number{display:inline-block;position:absolute;-webkit-margin-end:5px;margin-inline-end:5px;top:10px;vertical-align:text-bottom;inset-inline-start:30px;inset-inline-end:auto}.opened .top-btn-number.on,.tone-light.ios .top-bar .top-btn-number.on,.tone-light.top-bar .top-btn-number.on,.top-bar .top-btn-text:hover .top-btn-number.on,.top-btn-number.on,.top-btn-number.on:hover{background:#d90000;color:#fff}.pop-account .pop-box-inner{padding:20px 10px;cursor:default}.pop-account .title,.pop-account h2{font-size:1em;text-align:center;margin-top:5px;font-weight:400;display:block}.pop-account .sign-services{margin:15px 0 11px 0}.pop-account input.text-input,.pop-account input[type=password],.pop-account input[type=text]{width:100%}.ie7 .pop-account input.text-input{width:266px;height:auto}.pop-account .checkbox-label{display:inline-block;margin:0}#top-bar-user .top-btn-text .user-image{position:relative;top:50%;margin-top:-13px;width:1em;height:1em;float:left;font-size:26px;background:0 0;color:inherit;-webkit-margin-end:0;margin-inline-end:0}[dir=rtl] #top-bar-user .top-btn-text .user-image{float:right}#top-bar-user-menu.pop-box{width:150px}.header{position:relative}.header-icon{color:var(--colorAccent)}.header-tabs{min-height:50px}.header.follow-scroll{-webkit-margin-end:-10px;margin-inline-end:-10px;-webkit-margin-start:-10px;margin-inline-start:-10px;-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:10px;padding-inline-end:10px;overflow:visible;position:-webkit-sticky;position:sticky;min-height:50px}.header.fixed.follow-scroll{border-bottom:0}.header .header-title,.header h1{font-size:1em}.header>*{vertical-align:middle}.header .header-title,.header .heading,.header .heading *,.header>h1{word-break:break-word}.header-tabs .heading,.header-tabs .heading *,.header-tabs>.header-title,.header-tabs>h1{line-height:50px}.header .header-title,.header .heading,.header>h1{font-size:1.57142857rem;font-weight:400;display:inline-block;color:inherit}.header .header-title a,.header h1 a{color:inherit;text-decoration:none}.header .header-title strong,.header .heading strong,.header h1 strong{font-weight:inherit}.header.header-tabs .header-title,.header.header-tabs h1{-webkit-margin-end:5px;margin-inline-end:5px}.header ul.content-tabs{display:inline-block}.phablet .header ul.content-tabs,.phone .header ul.content-tabs{float:none;display:inline-block;inset-inline-start:10px;inset-inline-end:10px;position:absolute;z-index:1;white-space:nowrap}.phablet .header.follow-scroll ul.content-tabs,.phone .header.follow-scroll ul.content-tabs{position:absolute;-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:10px;padding-inline-end:10px}.phablet .header:not(.follow-scroll) ul.content-tabs,.phone .header:not(.follow-scroll) ul.content-tabs{top:auto}.header-content-left{float:left}[dir=rtl] .header-content-left{float:right}.header-content-right{float:right;height:auto;-webkit-margin-start:auto;margin-inline-start:auto}[dir=rtl] .header-content-right{float:left}@media (max-width:340px){.header-content-right.breaks-ui{clear:both;position:static!important;-webkit-margin-start:0;margin-inline-start:0}}.phablet .header-content-right:not(.phablet-float-none),.phone .header-content-right:not(.phone-float-none){position:absolute;inset-inline-end:0;top:0;float:right}[dir=rtl].phablet .header-content-right:not(.phablet-float-none),[dir=rtl].phone .header-content-right:not(.phone-float-none){float:left}.header-content-right .number-figures{margin-top:14px;-webkit-border-start:1px solid var(--bodySeparator);border-inline-start:1px solid var(--bodySeparator)}.header-content-right .number-figures:first-child{-webkit-border-start:0;border-inline-start:0}.header .header-link{font-size:1em;display:inline-block}.header .pop-btn.breadcrum-item{margin-top:0}.header .user-image{font-size:30px;width:1em;height:1em;margin-top:10px;float:left}[dir=rtl] .header .user-image{float:right}.header.header-content{position:relative;min-height:40px;border:0}.header.header-content .heading,.header.header-content .heading *{line-height:40px;height:40px}.header-content img{max-height:40px}.header-content .user-image{width:1em;height:1em;font-size:40px;margin-top:0;top:0}.header .user-image img,.header-content .user-image img{width:100%;height:100%;display:block}.header-description{line-height:1.4;max-height:10vh;overflow-y:scroll;overflow:auto}.header-description:empty{display:none}.header-description p{margin:10px 0}.header-content-breadcrum{float:left}[dir=rtl] .header-content-breadcrum{float:right}.breadcrum-item :not(.btn){line-height:normal}.breadcrum-text,.header-content-breadcrum .breadcrum-item{line-height:40px}.breadcrum-text,.breadcrum-text a{color:inherit}.breadcrum-text{font-weight:400}.breadcrum-item{-webkit-margin-end:5px;margin-inline-end:5px;position:relative;float:left}[dir=rtl] .breadcrum-item{float:right}.breadcrum-text a:hover{color:var(--linkText);text-decoration:none}.breadcrum-text .user-link{-webkit-margin-start:5px;margin-inline-start:5px}.header-content-breadcrum .arrow,.header-content-breadcrum .arrow-down,.header-content-breadcrum .arrow-right{-webkit-margin-start:5px;margin-inline-start:5px;position:relative}.header-content-breadcrum a:hover .arrow-down{border-top-color:var(--linkText)}.header-content-breadcrum a:hover .arrow-right{border-left-color:var(--linkText)}.header-content-breadcrum .pop-box h2{font-size:1.07em;line-height:1.2}.header-content-breadcrum .pop-box h2 a{line-height:1}.btn-container [dir=rtl] .header-content .btn{float:right}.header-content .btn:last-child{-webkit-margin-end:0;margin-inline-end:0}.follow-scroll{-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;z-index:1}.follow-scroll-wrapper{left:0;right:0;z-index:50}.follow-scroll-wrapper.position-fixed .header{margin-bottom:-1px!important}.follow-scroll-placeholder{-webkit-backface-visibility:hidden;backface-visibility:hidden}.phablet .header:not(.header-tabs) .tab-menu,.phone .header:not(.header-tabs) .tab-menu{color:var(--buttonDefaultText);background:var(--buttonDefaultBackground);border-radius:4px;height:auto;line-height:1em;min-height:1em;padding:10px}.phablet .header:not(.header-tabs) .tab-menu:not(.--hide),.phone .header:not(.header-tabs) .tab-menu:not(.--hide){color:var(--buttonDefaultHoverText);background:var(--buttonDefaultHoverBackground);margin-bottom:10px}.phablet .header .tab-menu.--hide .tab-menu--show,.phablet .header .tab-menu:not(.--hide) .tab-menu--hide,.phone .header .tab-menu.--hide .tab-menu--show,.phone .header .tab-menu:not(.--hide) .tab-menu--hide{display:none}.tab-menu--hide,.tab-menu--show{-webkit-margin-start:2.5px;margin-inline-start:2.5px}.tab-menu{cursor:pointer;line-height:50px;min-height:50px}.tab-menu.--hide .btn-icon[data-content=tab-icon]{color:var(--colorAccent)}.tab-menu.--hide{color:var(--buttonDefaultText)}.tab-menu:not(.--hide){color:var(--buttonDefaultHoverText)}.content-tabs-container{position:relative;display:inline-block}.phablet .content-tabs-container--mobile,.phone .content-tabs-container--mobile{box-shadow:0 6px 4px rgba(0,0,0,.25);inset-inline-start:-10px;width:100%;width:100dvw}.phablet .content-tabs-wrap,.phone .content-tabs-wrap{height:50px;overflow-y:hidden;position:relative;-webkit-overflow-scrolling:touch;overflow-x:scroll;position:relative;display:none;-webkit-backdrop-filter:blur(17.5px);backdrop-filter:blur(17.5px);background:var(--bodyBackground);padding-left:10px;padding-right:10px}.content-tabs-wrap::-webkit-scrollbar{display:none}.content-tabs-wrap{display:inline-block;-ms-scroll-snap-type:x mandatory;scroll-snap-type:x mandatory}.content-tabs li{scroll-snap-align:start}.content-tabs li:not(.current){transition-duration:.2s;transition-property:background-color}.content-tabs a{font-weight:400;color:inherit;text-decoration:none;-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:10px;padding-inline-end:10px}.phone .content-tabs li:last-child{-webkit-margin-end:15px;margin-inline-end:15px}.content-tabs-shade{content:" ";background:-webkit-linear-gradient(0deg,rgba(255,255,255,0),var(--bodyBackground));width:15px;height:100%;position:absolute;inset-inline-end:0;top:0;pointer-events:none;z-index:2}[dir=rtl] .content-tabs-shade{background:-webkit-linear-gradient(180deg,rgba(255,255,255,0),var(--bodyBackground))}.phablet .content-tabs a,.phone .content-tabs a{color:var(--menuItemText)}.content-tabs li.disabled a{cursor:default}.tab-menu .--show{display:none}.tab-menu.current .--show{display:inline-block}.tab-menu.current .--hide{display:none}.content-tabs li{float:left;font-size:1em}[dir=rtl] .content-tabs li{float:right}.phablet .content-tabs li,.phone .content-tabs li{float:none;border-bottom:0;display:inline-block}.content-tabs-vertical li{float:none;margin:0;-webkit-border-start:2px solid transparent;border-inline-start:2px solid transparent}.content-tabs-vertical li>*{-webkit-padding-end:20px;padding-inline-end:20px;-webkit-padding-start:20px;padding-inline-start:20px}.header-content-right .content-tabs li{-webkit-margin-start:10px;margin-inline-start:10px;-webkit-margin-end:0;margin-inline-end:0}.content-tabs a,.content-tabs li,.content-tabs-wrap{height:50px;line-height:50px;display:block;border:0}.content-tabs-vertical a,.content-tabs-vertical li{height:38px;line-height:38px}.content-tabs li.current,.content-tabs li.visited,.content-tabs li.visited:hover{border-color:var(--colorAccent);border-style:solid;border-bottom-width:3px}.content-tabs li.current .btn-icon{color:var(--colorAccent)}.content-tabs li:not(.current):hover{background:var(--bodyEmpty)}.content-tabs li:not(.current):hover a .btn-icon{color:var(--colorAccent)}.content-tabs li.disabled:hover{border-bottom:0}.content-tabs li.current{border-color:var(--colorAccent)}.content-tabs li.visited{border-bottom-color:transparent}.content-tabs li.current.visited{border-color:#d93600}.content-tabs li.visited,.content-tabs li.visited a{color:#d93600}.content-tabs-vertical li.current,.content-tabs-vertical li:hover{border-bottom-width:0;border-left-width:2px}.content-tabs .tab-count{font-weight:400;color:var(--bodyTextSubtle)}.content-tabs .tab-count-block{font-weight:400;background:#d90000;border-radius:3px;padding:1px 4px;position:relative;top:-1px}.content-tabs .current .tab-count-block,.content-tabs .tab-count-block{color:#fff}.content-tabs li.disabled *{color:var(--bodyTextDisabled)}.header--centering{display:flex;align-items:center;flex-wrap:wrap}.header--height{overflow:visible;height:50px}.list-selection *{line-height:normal}#tabbed-content-group{margin-top:20px;padding-bottom:20px;position:relative}.content-listing .viewer-kb{opacity:0;position:fixed;bottom:-100px;z-index:1;left:0;right:0;background:linear-gradient(0deg,var(--topBarBackground) 0,rgba(0,0,0,0) 100%)}.--has-selection .content-listing.visible .viewer-kb{opacity:1;bottom:0}.content-listing .viewer-kb-input{color:var(--menuText);background:var(--menuBackground);border-radius:.5em;margin:1em;-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);box-shadow:0 4px 14px rgb(0 0 0 / 25%)}#content-listing-tabs #tabbed-content-group{margin-top:0}#content-listing-tabs{padding-bottom:0;-webkit-margin-start:-10px;margin-inline-start:-10px;-webkit-margin-end:-10px;margin-inline-end:-10px}.tabbed-content{display:none;width:100%;overflow:hidden}.title{font-size:.93em;font-weight:700;margin-bottom:5px}.title.grid-columns{-webkit-margin-end:10px;margin-inline-end:10px;text-align:end;line-height:2}.phablet .title.grid-columns,.phone .title.grid-columns{-webkit-margin-end:0!important;margin-inline-end:0!important;text-align:start}.tabbed-content-section{overflow:auto}.tabbed-content-list{line-height:1.8}.tabbed-listing .tabbed-content{overflow:hidden}.table-li{display:table;width:100%}.table-li>li{padding-top:8px;padding-bottom:8px;border-bottom:1px solid var(--bodySeparator);list-style:none!important}.tabbed-content-list.table-li-hover>li:hover{background:var(--bodyEmpty)}.tabbed-content-list .table-li-header{font-weight:700}.tabbed-content-list.table-li-hover .table-li-header:hover{background:0 0}.table-li ul li:last-child{border-bottom:none}.desktop .table-li--mobile-display,.laptop .table-li--mobile-display,.largescreen .table-li--mobile-display,.phablet .table-li--mobile-display,.tablet .table-li--mobile-display{display:none!important}.viewer-title{flex-grow:1;order:2;font-size:1.57142857rem;line-height:1.43em;-webkit-padding-end:2em;padding-inline-end:2em}.panel-description:empty{display:none;margin:0!important;padding:0!important}.panel-description .description-text{font-size:1em;line-height:1.6em}.panel-description .description-meta{font-size:.93em}.panel-description .exif-meta{-webkit-padding-start:1.57em;padding-inline-start:1.57em;position:relative}.panel-description .exif-meta .camera-icon{color:var(--bodyTextDisabled);position:absolute;inset-inline-start:0;top:.21em;font-size:1.14em}.panel-description .exif-meta .exif-data{display:block;font-size:1em}.panel-thumbs{z-index:1;bottom:0;left:0;right:0;background:var(--viewerBackground)}.panel-thumb-list{overflow-x:auto;overflow-y:hidden;white-space:nowrap;text-align:center;height:50px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto}.panel-thumb-list:empty{display:none}.panel-thumb-list li{position:relative;font-size:0;border-top:3px solid transparent;display:inline-block;line-height:50px}.panel-thumb-list li.current{border-color:var(--colorAccent)}.list-item-desc .panel-thumb-list li:hover img,.panel-thumb-list li.current img{opacity:1}.phablet .panel-thumb-list li.more-link,.phone .panel-thumb-list li.more-link{clear:both;line-height:100%;padding:10px 0}.panel-thumb-list img{display:block;width:47px;height:47px;opacity:.4;transition:opacity 350ms ease}.panel-thumb-list li:hover img{opacity:1}.panel-share-item{margin-bottom:30px}.panel-share-item:last-child{margin-bottom:0}.panel-share-item .pre-title{-webkit-padding-start:200px;padding-inline-start:200px;line-height:20px;margin-bottom:10px;padding-bottom:10px;border-bottom:1px solid var(--bodySeparator);font-weight:700}.phablet .panel-share-item .pre-title,.phone .panel-share-item .pre-title{-webkit-padding-start:0;padding-inline-start:0}.panel-share-item .title{line-height:36px;-webkit-margin-after:0;margin-block-end:0}.panel-share-item .grid-columns{position:relative}.panel-share-input-label{margin-bottom:10px;overflow:auto}.panel-share-input-label:last-child{margin-bottom:0}.panel-share-input{position:relative}.panel-share-networks{overflow:auto;text-align:center}.panel-share-networks h4.title{line-height:32px}.panel-share-networks li{display:inline-block;-webkit-margin-end:5px;margin-inline-end:5px;margin-bottom:5px}.panel-share-networks li a{display:block;width:32px;height:32px;position:relative}.panel-report h4.title{line-height:36px}.text-content{font-size:16px}.text-content li,.text-content p{line-height:160%;margin:10px 0}.text-content h1,.text-content h2,.text-content h3,.text-content h4{margin:40px 0 20px 0;font-weight:400;line-height:120%}.text-content h1{font-size:1.375em}.text-content h2{font-size:1.25em}.text-content h3{font-size:1.125em}.text-content h4{font-size:1.07em}.text-content h5{font-size:1em}.text-content h6{font-size:1em}.text-content ol,.text-content ul{-webkit-margin-start:20px;margin-inline-start:20px}.text-content li{list-style:disc outside;margin-top:0;margin-bottom:0}.form-content{position:relative;margin-top:20px}.form-content .input-label:first-child{margin-top:0}.signup-services-column h2{font-size:17px}.signup-services-column ul{margin:10px 0}.signup-services-column li:first-child{-webkit-margin-start:0;margin-inline-start:0}.signup-services-column li:last-child{-webkit-margin-end:0;margin-inline-end:0}.form-content .content-tabs-vertical{-webkit-margin-end:10px;margin-inline-end:10px;position:absolute;inset-inline-start:0;top:0}.form-content .content-tabs-vertical.position-fixed{position:fixed;inset-inline-start:auto;top:auto}.tabbed-input-column{-webkit-margin-start:200px;margin-inline-start:200px}.phablet .tabbed-input-column,.phone .tabbed-input-column{-webkit-margin-start:0;margin-inline-start:0}.account-link{position:relative}a.account-linked-profile{width:48px;height:48px;display:block}a.account-linked-profile img{width:100%;height:100%;display:block;border:0}.text-overflow-ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}html.menu-fullscreen-visible{overflow:hidden}#menu-fullscreen{position:fixed;left:0;top:50px;bottom:0;right:0;height:calc(100vh - 50px);height:calc(100dvh - 50px);width:100vw;width:100dvw;overflow:auto}#menu-fullscreen .menu-hide{display:none}#menu-fullscreen .fullscreen{top:50px;height:calc(100% - 50px)}#menu-fullscreen>ul>li{display:block;float:none;border-bottom:0;margin:0!important;position:relative}#menu-fullscreen>ul>li .top-btn-text{padding:0 5px;background:inherit}#menu-fullscreen>ul>li .icon{-webkit-margin-end:7px;margin-inline-end:7px}#menu-fullscreen>ul>li .input-search .icon{-webkit-margin-end:0;margin-inline-end:0}#menu-fullscreen>ul>li a{text-decoration:none}#menu-fullscreen .input-search{-webkit-margin-start:5px;margin-inline-start:5px;top:10px;width:auto}#menu-fullscreen .input-search .search{border-radius:0;-webkit-padding-end:50px;padding-inline-end:50px;-webkit-padding-end:3.12rem;padding-inline-end:3.12rem}#menu-fullscreen .menu-fullscreen-show{display:block}#menu-fullscreen .menu-fullscreen-hide{display:none}body.upload-box-visible{margin-top:300px}body.upload-box-visible.no-margin-top{margin-top:280px}body.upload-box-visible .upload-box{display:block}.upload-box{clear:both;background:var(--bodyBackground)}.upload-box--fixed{position:fixed;left:0;right:0;z-index:200;background:var(--bodyBackground)}body:not(#upload) .upload-box--fixed{padding-top:50px;overflow:auto}.phone .upload-box--fixed{top:0;z-index:500;max-height:100%;overflow-y:auto;overflow-x:hidden}.upload-box--hidden{transform:translateY(-100%);top:-1px}.upload-box--show{transform:translateY(0)}.upload-box-inner{padding:40px 0;position:relative}.phone .upload-box-inner{padding:20px 0}.upload-box-inner .position-absolute{position:absolute;text-transform:uppercase;top:20px;line-height:20px}#upload .upload-box[data-queue-size="0"] .upload-box-heading,.phone .upload-box[data-queue-size="0"] .upload-box-heading{position:fixed;top:50%;left:0;right:0;transform:translateY(-50%);padding:10px}.upload-box-heading{text-align:center}.upload-box-heading .icon{font-size:100px;height:1em;display:inline-block;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;text-decoration:none;-webkit-tap-highlight-color:transparent}.upload-box-heading .heading,.upload-box-heading h2{font-size:26px;margin:10px 0;display:block}.upload-box-heading .heading a,.upload-box-heading h2 a{color:inherit;text-decoration:none}.upload-box-status a{display:inline-block}.upload-box-status-text{font-size:1em;line-height:1.4}.upload-box-allowed-files{inset-inline-start:0;font-size:11px;font-size:.79rem;color:var(--bodyTextSubtle)}.upload-box-close{text-decoration:none;inset-inline-end:0;font-size:11px;line-height:11px;font-size:.79rem;line-height:1em;color:var(--bodyText)}.upload-box-close:hover{text-decoration:none}.upload-box-close a{color:inherit;text-decoration:none}.upload-box-close .btn-icon{font-size:.9em;display:inline}@media (min-width:380px){.upload-input-col{width:350px}}.page-not-found{border-radius:10px;background:var(--bodyEmpty);text-align:center;padding:30px;font-size:16px;margin-top:20px}.page-not-found h1{font-size:30px;margin-bottom:10px}.page-not-found .input-search{-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;margin-top:20px}.page-not-found .input-search .icon--search{font-size:20px;inset-inline-start:14px;top:8px}.page-not-found .input-search .icon--close{top:3px;inset-inline-end:6px}.page-not-found input.search{height:36px;width:100%;font-size:15px;-webkit-padding-end:30px;padding-inline-end:30px;-webkit-padding-start:40px;padding-inline-start:40px}.ie7 .page-not-found input.search,.ie8 .page-not-found input.search,.ie9 .page-not-found input.search{-webkit-padding-end:10px;padding-inline-end:10px;line-height:36px}.content-listing{overflow:hidden;position:relative;clear:both}.pad-content-listing{width:calc(100% + 10px);-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:relative}.list-item{display:inline-block;position:relative}.js .content-listing{opacity:0}.js .jsly.content-listing{opacity:1}.list-item .disabled-mask{width:100%;height:100%;position:absolute;top:0;inset-inline-start:0;background:rgba(255,255,255,.5);z-index:1}.list-item:hover .hover-display,.phablet .list-item .hover-display,.phone .list-item .hover-display{display:block}.list-item.masked:hover .hover-display{display:none}.list-item .hover-display,html.--idle .list-item .hover-display:not(.idle-display),html.--idle .list-item-image-tools>div{opacity:0;transition:all 350ms ease}html:not(.--idle) .list-item:hover .hover-display{opacity:1}.phablet .list-item .hover-display,.phone .list-item .hover-display{opacity:1;transition:none}.list-item-image{position:relative;display:block;overflow:hidden;min-height:260px;text-align:center;background:var(--bodyEmpty);content-visibility:auto;contain:layout style paint}.list-item-image .image-container{display:inline-block;text-align:center;vertical-align:bottom;text-decoration:none;font-size:64px;width:100%;height:100%}.js .list-item-image .image-container.--media{width:100%;height:100%}.list-item-image .image-container .media,.list-item-image .image-container img,.list-item-image .image-container svg,.list-item-image .image-container video{display:block;position:relative;width:100%!important;height:100%;-o-object-fit:cover;object-fit:cover}.list-item-image .image-container .icon.empty{font-size:1em;opacity:.25}.list-item-image .image-container .empty{color:var(--bodyText);text-decoration:none}.selected .list-item-image .image-container .icon.empty,.ui-selecting .list-item-image .image-container .icon.empty{color:#fff}.list-item-image-btn{padding:5px 8px 5px 28px;font-size:.93em;background:var(--bodyBackground);position:absolute;top:10px;cursor:pointer;border-radius:2px}.list-item-image-btn.list-image-like-btn{inset-inline-start:10px}.list-item-image-btn span{font-size:15px;position:absolute;inset-inline-start:8px;top:50%;margin-top:-8px}.ie7 .list-item-image-btn span{inset-inline-start:4px;top:2px}.list-item-image-btn:hover span{color:var(--colorAccent)}.list-item-image-btn.liked{background:var(--colorAccent);color:#fff;display:block}.list-item-image-btn.liked:hover{background:#d90000}.list-item-image-btn.liked:hover span.icon-like{font-size:11px;padding:0;inset-inline-start:10px;color:#fff;margin-top:-6px}.list-item-image-btn.liked:hover span.icon-like:before{content:"\e01f"}.list-item-desc-title{width:100%;height:100%;padding:0 10px;inset-inline-start:0;bottom:10px;text-decoration:none}.list-item-desc-title>*{padding-bottom:5px;margin-bottom:-2.5px;-webkit-padding-start:5px;padding-inline-start:5px;-webkit-margin-start:-5px;margin-inline-start:-5px}.list-item-from{bottom:0;line-height:1}.phablet .content-listing:not([data-list=users]).list-item-desc-title,.phone .content-listing:not([data-list=users]).list-item-desc-title{display:none}.list-item-desc-title--center-y{top:50%;transform:translateY(-50%)}.list-item-desc-title-link{font-size:1.1em;font-weight:600;display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:calc(100%)}@media (min-width:320px){.list-item-desc-title-link{width:calc(100% - 20px)}}.list-item-title{padding-top:0;padding-bottom:0;font-weight:400;text-align:center;height:40px;overflow:hidden}.list-item-title,.list-item-title *{font-size:1em;line-height:40px}.list-item-title a{font-weight:400;color:var(--bodyText)}.list-item-alt{background:#f9f9f9}.list-item-desc-height{height:100%}.list-item-overflow{height:110%;overflow:hidden}.list-item-desc{width:100%;font-size:.93em;line-height:1;box-shadow:0 1px 0 rgba(0,0,0,.1),0 0 0 transparent;border-bottom:1px solid rgba(0,0,0,.2)}.list-item-desc a,.list-item-desc b,.list-item-desc strong,.list-item.masked:hover .list-item-desc a,.list-item.masked:hover .list-item-title a{color:inherit}.list-item:hover .list-item-desc a,.list-item:hover .list-item-title a{color:var(--linkText)}.list-item-desc .user,.list-item-desc a.user img{border-radius:100%}.list-item-desc .user{float:left;margin-top:-20px;-webkit-margin-end:8px;margin-inline-end:8px;padding:3px;background:var(--bodyBackground);width:50px;height:50px}[dir=rtl] .list-item-desc .user{float:right}.list-item-desc .user:hover{background:var(--linkText)}.phablet .content-listing[data-list=images] .list-item-desc,.phone .content-listing[data-list=images] .list-item-desc{display:none}.list-item-desc strong{display:block}.list-item-card{border-radius:3px;min-height:82px}.list-item-card .user-image{display:block}.list-item-thumbs-container{overflow:hidden}.list-item-thumbs{overflow:auto;background:#f9f9f9;width:101%;margin-top:2px;margin-bottom:0;-webkit-margin-start:-1px;margin-inline-start:-1px}.list-item-thumbs li{background:#f6f6f6;-webkit-border-end:1px solid;border-inline-end:1px solid;-webkit-border-start:1px solid;border-inline-start:1px solid;border-color:#fff;float:left}[dir=rtl] .list-item-thumbs li{float:right}.list-item-desc{color:inherit;background:0 0;border:0;box-shadow:none;text-shadow:1px 1px 5px rgba(0,0,0,.5);opacity:0;transition:all 350ms ease;bottom:5px;position:absolute}.desktop .list-item .list-item-desc,.laptop .list-item .list-item-desc,.largescreen .list-item .list-item-desc,.list-item:hover .list-item-desc,.phablet .list-item .list-item-desc,.phone .list-item .list-item-desc,.tablet .list-item .list-item-desc{opacity:1}.list-item-desc *,.list-item-desc a,.list-item:hover .list-item-desc a{color:var(--listItemText)}.list-item-desc .list-item-overflow{bottom:0;inset-inline-start:0;padding:10px;position:absolute;height:auto}.content-listing-loading,.content-listing-more{text-align:center;margin:20px 0}.content-listing-more{display:none}.content-listing-loading{height:32px}.content-listing-loading .loading-indicator{position:static}.content-listing-pagination{text-align:center;font-size:1.3em;padding:0;color:inherit;font-weight:400;margin-top:20px}.js .content-listing-pagination{display:none}.content-listing-pagination.visible{display:flex!important}.content-listing-pagination a{text-decoration:none;font-weight:inherit;color:inherit;padding:.3em 1em;display:inline-block;border-radius:4px}.content-listing-pagination li.pagination-prev{text-align:end}.content-listing-pagination li.pagination-next{text-align:start}.content-listing-pagination a:hover{color:var(--linkText);background:var(--bodyEmpty)}.content-listing-pagination a.current{color:inherit}.phone .content-listing-pagination li.pagination-page{display:none}.content-listing-pagination li,.phone .content-listing-pagination li.pagination-page.pagination-current{display:inline-block}.content-listing-pagination li.pagination-next,.content-listing-pagination li.pagination-prev{flex-grow:4}.content-listing-pagination li.pagination-current{flex-grow:1}.content-listing-pagination .pagination-current a,.content-listing-pagination .pagination-current a:hover{color:inherit;background:initial;cursor:default}.pagination-disabled{visibility:hidden}.content-empty{padding:4em 2em;text-align:center;font-size:inherit;color:var(--bodyTextSubtle)}.content-empty .icon{color:var(--bodyTextSubtle);font-size:90px;width:90px;height:90px;display:inline-block}.content-empty .message,.content-empty h2{font-size:16px;margin-top:10px;line-height:160%}.sort-listing{display:none}.sort-listing .selection-count:before{content:" (";white-space:pre}.sort-listing .selection-count:after{content:")"}.disabled.sort-listing .selection-count:after,.disabled.sort-listing .selection-count:before{display:none}.user-image{display:inline-block}.user-image path{fill:red}.user-image,.user-image img{display:block}.default-user-image{color:var(--bodyText);text-align:center;position:relative;border-radius:100%;-webkit-backdrop-filter:blur(17.5px);backdrop-filter:blur(17.5px);background:var(--bodyBackground)}.checkered-background{background-image:linear-gradient(45deg,rgba(0,0,0,.1) 25%,transparent 25%),linear-gradient(135deg,rgba(0,0,0,.1) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,rgba(0,0,0,.1) 75%),linear-gradient(135deg,transparent 75%,rgba(0,0,0,.1) 75%);background-size:25px 25px;background-position:0 0,12.5px 0,12.5px -12.5px,0 12.5px}.default-user-image .icon{color:inherit;position:absolute;inset-inline-start:50%;top:50%;display:block;line-height:100%;font-size:1em;width:1em;height:1em;-webkit-margin-start:-.5em;margin-inline-start:-.5em;margin-top:-.5em}.default-user-image.size-70,img.user-image.size-70{width:70px;height:70px}.default-user-image.size-70 .icon{font-size:38px;-webkit-margin-start:-19px;margin-inline-start:-19px;margin-top:-19px}.default-user-image.size-60,img.user-image.size-60{width:60px;height:60px}.default-user-image.size-60 .icon{font-size:32px;-webkit-margin-start:-16px;margin-inline-start:-16px;margin-top:-16px}.default-user-image.size-40,img.user-image.size-40{width:40px;height:40px}.default-user-image.size-40 .icon{font-size:22px;-webkit-margin-start:-11px;margin-inline-start:-11px;margin-top:-11px}.user-social-networks{font-size:1em;margin-bottom:5px}.user-social-networks,.user-social-networks a{text-decoration:none;color:var(--bodyTextSubtle)}.user-social-networks a{padding:2px}.user-social-networks a:hover{color:var(--bodyText)}.top-user{position:relative;height:110px;margin-top:10px;margin-bottom:10px;height:auto;min-height:100px}.top-user.no-background{min-height:160px}.top-user>div{position:absolute;top:0}.top-user .top-user-credentials{position:static;-webkit-padding-end:220px;padding-inline-end:220px;clear:both;overflow:visible}.top-user.user-has-no-background .top-user-credentials{overflow:auto}.phone .top-user .top-user-credentials{-webkit-padding-end:0;padding-inline-end:0;-webkit-padding-start:0;padding-inline-start:0;width:100%;margin-bottom:10px;text-align:center;margin-top:-160px}.top-user-avatar{font-size:160px;z-index:500}a.top-user-avatar{display:block}.phone .top-user-avatar{position:relative}.top-user-avatar{position:absolute;left:0}.phablet .top-user:not(.no-background) .top-user-avatar,.tablet .top-user:not(.no-background) .top-user-avatar{top:calc(-.4em - 10px)}.top-user{-webkit-padding-start:190px;padding-inline-start:190px}.desktop .top-user:not(.no-background),.laptop .top-user:not(.no-background),.largescreen .top-user:not(.no-background),.phone .top-user{-webkit-padding-start:0;padding-inline-start:0}.desktop .top-user:not(.no-background) .top-user-avatar,.laptop .top-user:not(.no-background) .top-user-avatar,.largescreen .top-user:not(.no-background) .top-user-avatar{position:absolute;left:50%;-webkit-margin-start:calc(-.5em - 10px);margin-inline-start:calc(-.5em - 10px);top:calc(-.5em - 10px)}.phablet .top-user .user-image,.tablet .top-user .user-image{border:0;-webkit-margin-end:10px;margin-inline-end:10px}.top-user .user-image{font-size:1em;width:1em;height:1em;float:left}.header .user-image img,.header-content .user-image img,.top-user .user-image,.user-image,.user-image img{border-radius:50%;object-fit:cover}.top-user:not(.no-background) .user-image{border:10px solid var(--bodyBackground)}.top-user:not(.no-background) img.user-image{background:var(--bodyBackground);border:10px solid transparent;box-sizing:content-box}.phone .top-user.no-background .top-user-credentials{margin-top:initial}.phone .top-user .top-user-credentials>a{display:inline-block}.top-user .header-content-right{inset-inline-end:0}.top-user .header-content-right>*{margin-bottom:10px}.top-user .header-content-right>:last-child{margin-bottom:0}.phone .top-user .header-content-right{position:relative}.phone .top-user .header-content-right>div{margin:10px auto;text-align:center}.phone .top-user .input-search{position:relative;top:auto}.phone .top-user .input-search form{position:relative}.top-user h1{font-size:1.8575em;font-weight:700;margin-bottom:5px;margin-top:10px;color:var(--bodyText)}.no-margin-top .top-user h1,.phone .top-user h1{margin-top:0}.top-user h1 a{color:inherit;text-decoration:none}.top-user .user-meta{margin-bottom:5px}.user-meta .icon--lock{-webkit-margin-end:5px;margin-inline-end:5px}[dir=rtl] .top-user .user-image{float:right}.phone .top-user .user-image{float:none;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;margin-bottom:10px}.phone body.no-margin-top .top-user .user-image{margin-top:10px}.top-user .user-image.no-border{border:none}.top-user .number-figures{margin-top:0}.user-card.avatar{-webkit-padding-start:70px;padding-inline-start:70px}.user-card.no-avatar{-webkit-padding-start:0;padding-inline-start:0}.user-card .or-separator{margin-top:5px;margin-bottom:5px}.user-card .user-link{font-size:.93em}.user-card-header h2{font-size:15px;font-weight:400;margin-top:0;margin-bottom:2px}.user-card-header h2 a{color:inherit;text-decoration:none}.user-card-header div{color:var(--bodyTextSubtle)}.user-card-footer{overflow:hidden}.user-card-footer .user-social-networks{margin-top:3px}.top-user .input-search .icon--close{right:.5rem;top:50%;transform:translate(0,-50%)}.ad-space{text-align:center}.ad-margin-vertical{margin-top:20px;margin-bottom:20px}.ad-margin-horizontal{-webkit-margin-start:20px;margin-inline-start:20px;-webkit-margin-end:20px;margin-inline-end:20px}[role=menu]{position:relative;overflow:visible}.menu-box,[role=menu]>.menu-box{z-index:300}[role=menu]>.menu-box{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;max-height:10px;display:block;visibility:hidden;transition:350ms all ease-in-out;opacity:0;transform:translateY(-5px);transform-origin:top;max-height:100vh;max-height:100dvh}[role=menu].opened>.menu-box{visibility:visible;opacity:1;transform:translateY(0)}@media (min-width:768px){[role=menu]>.menu-box{transition:none}}.menu-box{border:0}.menu-box,.menu-box .menu-box-sub>.sub,.menu-box .menu-box-sub>ul{background:var(--bodyBackground);border-radius:3px;box-shadow:0 0 15px 0 rgba(0,0,0,.2);color:var(--bodyText);font-size:14px;font-weight:400;position:absolute;top:100%;list-style:none;min-width:190px;padding:0;margin:0}.menu-box--static{position:static;max-width:190px}.menu-box :not(a),.menu-box [role*=button]{color:var(--bodyText)}.menu-box ul{margin:0;padding:0}.float-left .menu-box,.pull-left .menu-box,menu-box.anchor-left{inset-inline-start:0}.float-right .menu-box,.menu-box--anchor-right,.pull-right .menu-box{inset-inline-end:0}.menu-box .separator,.menu-box [role=separator],.menu-box hr{display:block;margin:0;padding:0;height:0;border:0;border-top:1px solid #ebebeb}.menu-box--border-separators>*{border-bottom:1px solid #ebebeb}.menu-box--border-separators>:last-child{border-bottom:0}.menu-box--border-separators>hr{display:none}.menu-box .sub,.menu-box [role*=button],.menu-box [role=box],.menu-box li{padding:10px;list-style:none;position:relative;line-height:1.4;clear:both;min-height:40px;display:block}.menu-box [role=box]{cursor:default}.menu-box [role*=button]{-webkit-padding-start:35px;padding-inline-start:35px;-webkit-border-start:2px solid transparent;border-inline-start:2px solid transparent;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;text-align:start}.menu-box--multiline [role*=button]{white-space:normal}.menu-box--noicons li:not([role=button]){-webkit-padding-start:0;padding-inline-start:0}.menu-box--noicons [role=button]{-webkit-padding-start:10px;padding-inline-start:10px;color:inherit}.menu-box [role=button]:hover{border-left-color:#a66bbe}.menu-box .disabled[role=button]{cursor:not-allowed;background:0 0;border-color:transparent!important;opacity:.5}.menu-box li.menu-box-sub{-webkit-padding-end:34px;padding-inline-end:34px}.menu-box .menu-box-sub>.sub,.menu-box .menu-box-sub>ul{display:none}.menu-box .menu-box-sub:hover>.sub,.menu-box .menu-box-sub:hover>ul{display:block}.menu-box [role*=button]>.icon,.menu-box li>.icon{font-size:16px;width:16px;height:16px;text-align:center;position:absolute;inset-inline-start:8px;top:50%;margin-top:-8px}.menu-box .menu-box-sub>.icon{inset-inline-start:auto;inset-inline-end:10px}.menu-box .menu-box-sub .sub,.menu-box .menu-box-sub ul{cursor:default;position:absolute;top:0;inset-inline-start:100%}.menu-box .meta{font-size:.93em;display:block}.menu-box .empty{font-size:1em;text-align:center;padding:40px 20px}.menu-box .empty>.icon{font-size:64px;margin-bottom:10px;display:block;color:#ebebeb;position:static}.arrow-navigator a{color:var(--colorAccent);display:block;text-decoration:none;text-align:center;height:40px;width:40px;position:absolute;top:50%;margin-top:-20px;opacity:.7;padding:10px}.arrow-navigator a.disabled{display:none}.arrow-navigator a:hover{opacity:1}.arrow-navigator a span{display:inline-block;font-size:20px;width:1em;height:1em;text-align:center}.growl{word-break:break-word;color:var(--alertText);font-size:1.1em;line-height:1.2;background:var(--alertBackground);padding:1em;-webkit-padding-end:2em;padding-inline-end:2em;text-align:center;overflow:visible;position:fixed;width:630px;inset-inline-start:50%;top:45px;z-index:9999;cursor:default;-webkit-border-start:5px solid var(--alertAccent);border-inline-start:5px solid var(--alertAccent);box-shadow:0 0 15px 5px rgba(0,0,0,.15);border-radius:4px;-webkit-margin-start:-315px;margin-inline-start:-315px}.growl:empty{display:none}.phone .growl{left:10px;right:10px;width:auto;-webkit-margin-start:auto;margin-inline-start:auto}.growl.static{-webkit-margin-start:auto;margin-inline-start:auto;position:static;-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:30px;padding-inline-end:30px;box-shadow:none;z-index:initial;margin:auto;width:auto}.growl.static.inline{margin:initial;text-align:start;display:inline-block;-webkit-padding-end:1em;padding-inline-end:1em;-webkit-padding-start:1em;padding-inline-start:1em}.growl .icon{font-size:14px;text-align:center;position:absolute;inset-inline-end:5px;top:7px;cursor:pointer;padding:10px;color:var(--alertText)}.growl-debug-message{text-align:start}.growl-debug-trace{overflow-x:auto;font-size:80%;margin-top:10px}.growl-debug-status{font-style:italic;margin-top:10px;margin-bottom:10px}#growl-placeholder{position:relative}#fullscreen-modal-box #growl-placeholder .growl{overflow:auto;text-align:start}.flex-center{margin:auto}.width-full{width:100%}.height-full{height:100%}.width-min-full{min-width:100%}.height-min-full{min-height:100%}.fullscreen{position:fixed;top:0;inset-inline-start:0;width:100%;height:100%;overflow:auto;z-index:1000;opacity:0;transition:opacity 350ms linear}.fullscreen.black,.fullscreen.white{-webkit-backdrop-filter:blur(35px) saturate(1.8);backdrop-filter:blur(35px) saturate(1.8)}.black-bkg,.fullscreen.black{background:var(--backgroundDarkAlpha)}.fullscreen.white,.white-bkg{background:var(--backgroundLightAlpha)}.fullscreen.soft-white,.soft-white-bkg{background:rgba(255,255,255,.6)}.ie9 .fullscreen{-webkit-filter:none;filter:none}.fullscreen-loader{width:150px;height:150px;text-align:center;border-radius:10px;color:#fff;margin-top:-75px;-webkit-margin-start:-75px;margin-inline-start:-75px;position:absolute;top:50%;inset-inline-start:50%;zoom:1}.loading-txt{position:absolute;bottom:15px;inset-inline-start:0;text-align:center;width:100%}#fullscreen-modal{display:none}#fullscreen-modal.--show{display:grid;align-items:center}.ie9 #fullscreen-modal{-webkit-filter:none;filter:none}#fullscreen-modal-box{width:670px;margin:0 auto;padding:20px;position:relative;box-shadow:0 0 50px 6px rgba(0,0,0,.25);border-radius:10px;background:var(--modalBackground);color:var(--modalText)}.--has-scrollbar #fullscreen-modal-box{border-radius:0}.phone #fullscreen-modal-box{width:100%;margin:0;max-height:100%;-webkit-overflow-scrolling:touch;border-radius:0;padding:20px}#fullscreen-modal-box .modal-box-title,#fullscreen-modal-box h1{display:block;margin-top:0;margin-bottom:20px;font-size:20px;line-height:1.2;-webkit-padding-end:32px;padding-inline-end:32px}#fullscreen-modal-box h2{font-size:1.14em}#fullscreen-modal-box h2 *{font-weight:400}#fullscreen-modal-box .or-separator{margin-top:16px}#fullscreen-modal-box p{font-size:1em;line-height:160%;margin-top:10px;margin-bottom:10px}#fullscreen-modal-box p:firt-child{margin-top:0}#fullscreen-modal-box .btn-container{margin-bottom:0}#fullscreen-modal-box .close-modal.icon--close{position:absolute;inset-inline-end:10px;top:15px;cursor:pointer;display:block;padding:10px}.phone #fullscreen-modal-box .close-modal.icon--close,.phone #fullscreen-modal-box .close-modal.icon--close:hover{inset-inline-end:10px}.modal-form textarea{height:70px;resize:none}.fancy-box{padding:20px;background:var(--bodyBackground);box-shadow:0 0 50px 6px rgb(0 0 0 / 25%);border-radius:10px}.fancy-box p{-webkit-margin-before:1em;margin-block-start:1em;-webkit-margin-after:1em;margin-block-end:1em}.fancy-box .or-separator{height:1px;margin:0}#fullscreen-changes-confirm{background:var(--bodyBackground);padding:40px 0;margin-top:75px;position:absolute;text-align:center;top:50%;width:100%;box-shadow:0 4px 16px rgba(0,0,0,.25)}#fullscreen-changes-confirm h2{font-size:18px;line-height:18px;color:inherit}.fullscreen-viewer{background:#000;background:rgba(0,0,0,.9);color:#bbb;display:none}.fullscreen-viewer-top{height:50px;width:100%;background:#000}.fullscreen-viewer-navigation,.fullscreen-viewer-top-user{margin-top:8px}.fullscreen-viewer-top-user img{width:34px;height:34px;-webkit-margin-end:10px;margin-inline-end:10px}.fullscreen-viewer-navigation{font-size:16px;font-size:1.143rem;height:26px;position:relative;z-index:100}.fullscreen-viewer-navigation a{display:inline-block;color:#bbb;color:rgba(255,255,255,.7);text-decoration:none;padding:8px}.fullscreen-viewer-navigation a:hover{color:#fff}.fullscreen-viewer-navigation a.disabled{color:#bbb;color:rgba(255,255,255,.4);cursor:default}.fullscreen-viewer-content{text-align:center;height:100%;position:relative;display:none}.fullscreen-viewer-content img{max-width:100%;max-height:100%;box-shadow:0 0 6px 0 #000}#cookie-law-banner{position:fixed;padding:20px;width:100%;bottom:0;background:rgba(0,0,0,.8);color:#fff;font-size:1.2em;z-index:1000}#cookie-law-banner p{font-size:85%;-webkit-padding-end:20px;padding-inline-end:20px}a.cookie-law-close{color:inherit;text-decoration:none;position:absolute;inset-inline-end:0;top:0;opacity:.5}a.cookie-law-close:hover{opacity:1}.badge--paid{text-transform:uppercase;text-align:center;border-radius:3px;padding:2px 5px;display:inline-block;line-height:1;border:1px solid var(--buttonDefaultBorder);color:var(--buttonDefaultHoverText);background-color:var(--buttonDefaultHoverBackground);border-color:var(--buttonDefaultHoverBorder);font-weight:400}.pop-box-menu li .badge{position:absolute;inset-inline-end:8px;top:8px}.badge{vertical-align:text-bottom;font-size:.7143em;transform-origin:right;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.badge+label,.btn .badge{-webkit-margin-start:5px;margin-inline-start:5px}.pop-box-menu li.paid a{-webkit-padding-end:52px;padding-inline-end:52px}.r1{height:30px}.r2{height:70px}.r3{height:110px}.r4{height:150px}.r5{height:190px}.r6{height:230px}.r7{height:270px}.r8{height:310px}.r9{height:350px}.r10{height:390px}.r11{height:430px}.r12{height:470px}.r13{height:510px}.r14{height:550px}.r15{height:590px}.r16{height:630px}.r17{height:670px}.r18{height:710px}.r19{height:750px}.r20{height:790px}.r11{height:830px}.r22{height:870px}.r23{height:910px}.r24{height:950px}.columns-container{overflow:auto}.grid-columns{display:block;float:left}[dir=rtl] .grid-columns{float:right}.gutter-margin-right,.gutter-margin-right-bottom{-webkit-margin-end:1px;margin-inline-end:1px}.gutter-margin-bottom,.gutter-margin-left-bottom,.gutter-margin-right-bottom{margin-bottom:1px}.gutter-margin-left,.gutter-margin-left-bottom{-webkit-margin-start:1px;margin-inline-start:1px}.gutter-width{width:5px}.col-1-min{min-width:30px}.col-2-min{min-width:70px}.col-3-min{min-width:110px}.col-4-min{min-width:150px}.col-5-min{min-width:190px}.col-6-min{min-width:230px}.col-7-min{min-width:270px}.col-8-min{min-width:310px}.col-9-min{min-width:350px}.col-10-min{min-width:390px}.col-11-min{min-width:430px}.col-12-min{min-width:470px}.col-13-min{min-width:510px}.col-14-min{min-width:550px}.col-15-min{min-width:590px}.col-16-min{min-width:630px}.col-17-min{min-width:670px}.col-18-min{min-width:710px}.col-19-min{min-width:750px}.col-20-min{min-width:790px}.col-21-min{min-width:830px}.col-22-min{min-width:870px}.col-23-min{min-width:910px}.col-24-min{min-width:950px}.col-1-max{max-width:30px}.col-2-max{max-width:70px}.col-3-max{max-width:110px}.col-4-max{max-width:150px}.col-5-max{max-width:190px}.col-6-max{max-width:230px}.col-7-max{max-width:270px}.col-8-max{max-width:310px}.col-9-max{max-width:350px}.col-10-max{max-width:390px}.col-11-max{max-width:430px}.col-12-max{max-width:470px}.col-13-max{max-width:510px}.col-14-max{max-width:550px}.col-15-max{max-width:590px}.col-16-max{max-width:630px}.col-17-max{max-width:670px}.col-18-max{max-width:710px}.col-19-max{max-width:750px}.col-20-max{max-width:790px}.col-21-max{max-width:830px}.col-22-max{max-width:870px}.col-23-max{max-width:910px}.col-24-max{max-width:950px}@media (min-width:768px){.c1{width:30px}.c2{width:70px}.c3{width:110px}.c4{width:150px}.c5{width:190px}.c6{width:230px}.c7{width:270px}.c8{width:310px}.c9{width:350px}.c10{width:390px}.c11{width:430px}.c12{width:470px}.c13{width:510px}.c14{width:550px}.c15{width:590px}.c16{width:630px}.c17{width:670px}.c18{width:710px}.fluid-column.c1{width:3.157%}.fluid-column.c2{width:7.368%}.fluid-column.c3{width:11.578%}.fluid-column.c4{width:15.789%}.fluid-column.c5{width:20%}.fluid-column.c6{width:24.21%}.fluid-column.c7{width:28.421%}.fluid-column.c8{width:32.631%}.fluid-column.c9{width:36.842%}.fluid-column.c10{width:41.052%}.fluid-column.c11{width:45.263%}.fluid-column.c12{width:49.473%}.fluid-column.c13{width:53.684%}.fluid-column.c14{width:57.894%}.fluid-column.c15{width:62.105%}.fluid-column.c16{width:66.315%}.fluid-column.c17{width:70.526%}.fluid-column.c18{width:74.736%}}@media (min-width:992px){.content-width{width:100%;min-width:970px}.c19{width:750px}.c20{width:790px}.c21{width:830px}.c22{width:870px}.c23{width:910px}.c24{width:950px}.fluid-column.c19{width:78.947%}.fluid-column.c20{width:83.157%}.fluid-column.c21{width:87.368%}.fluid-column.c22{width:91.578%}.fluid-column.c23{width:95.789%}.fluid-column.c24{width:100%}.top-btn-text .btn-text{-webkit-margin-start:7px;margin-inline-start:7px}.pop-box .arrow-down{border-width:6px 6px 0 6px}}@media (min-width:992px) and (max-width:1920px){.content-width{max-width:1800px}}@media (min-width:1921px) and (max-width:2560px){.content-width{max-width:2440px}}@media (min-width:3840px){.content-width{max-width:3720px}}.color-body-text-subtle{color:var(--bodyTextSubtle)}.color-accent{color:var(--colorAccent)}.color-success{color:var(--colorSuccess)}.color-fail{color:var(--colorFail)}.color-white{color:#fff!important}.color-black{color:#333!important}.color-grey{color:#ccc!important}.color-green{color:#27ae61!important}.color-red{color:#e74c3c!important}.color-blue{color:var(--colorBlue)!important}.color-orange{color:#d35400!important}.color-purple{color:#8e44ad!important}.color-inherit{color:inherit!important}.color-initial{color:initial!important}.height-auto{height:auto}.width-auto{width:auto}.height-100p{height:100%}.width-100p{width:100%}.color-facebook{color:#3b5998}.color-twitter{color:#1da1f2}.color-google{color:#ea4335}.color-vk{color:#45668e}.border-color-facebook{border-color:#3b5998}.border-color-twitter{border-color:#1da1f2}.border-color-google{border-color:#ea4335}.border-color-vk{border-color:#45668e}.opacity-10{opacity:.1}.opacity-20{opacity:.2}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.opacity-100{opacity:1}.background-black{background:#000!important}.background-white{background:#fff!important}.background-transparent{background:0 0!important}.background-gradient-white-left{background:linear-gradient(to right,rgba(255,255,255,0) 0,rgba(255,255,255,1) 35%,rgba(255,255,255,1) 100%)}.background-gradient-white-right{background:linear-gradient(to right,rgba(255,255,255,1) 0,rgba(255,255,255,1) 80%,rgba(255,255,255,0) 100%)}.font-weight-bold{font-weight:700!important}.font-weight-normal{font-weight:400!important}.cursor-pointer{cursor:pointer!important}.cursor-grab{cursor:-webkit-grab;cursor:grab}.cursor-grabbing{cursor:-webkit-grabbing;cursor:grabbing}.cursor-default{cursor:default!important}.cursor-zoom-in{cursor:zoom-in}.cursor-zoom-out{cursor:zoom-out}.font-size-small{font-size:13px;font-size:.92857143rem!important}.font-size-medium{font-size:medium!important}.font-size-large{font-size:large!important}.font-size-inherit{font-size:inherit!important}.font-size-10{font-size:10px!important}.font-size-11{font-size:11px!important}.font-size-12{font-size:12px!important}.font-size-13{font-size:13px!important}.font-size-14{font-size:14px!important}.font-size-15{font-size:15px!important}.font-size-16{font-size:16px!important}.font-size-17{font-size:17px!important}.font-size-18{font-size:18px!important}.height-100p{height:100%!important}.height-120p{height:120%!important}.top-0{top:0}.top-10{top:10px}.top-20{top:20px}.top-30{top:30px}.top-40{top:40px}.right-0{inset-inline-end:0}.right-10{inset-inline-end:10px}.right-20{inset-inline-end:20px}.right-30{inset-inline-end:30px}.right-40{inset-inline-end:40px}.bottom-0{bottom:0}.bottom-10{bottom:10px}.bottom-20{bottom:20px}.bottom-30{bottom:30px}.bottom-40{bottom:40px}.left-0{inset-inline-start:0}.left-10{inset-inline-start:10px}.left-20{inset-inline-start:20px}.left-30{inset-inline-start:30px}.left-40{inset-inline-start:40px}.display-none{display:none}.display-none-forced{display:none!important}.display-block{display:block}.display-block-forced{display:block!important}.display-flex{display:-moz-flex;display:flex}.visibility-hidden{visibility:hidden}.clear-both{clear:both}.float-left{float:left}[dir=rtl] .float-left{float:right}.float-right{float:right}[dir=rtl] .float-right{float:left}.border-0,.no-border{border:none}.border-top-0{border-top:0}.border-right-0{-webkit-border-end:0;border-inline-end:0}.border-bottom-0{border-bottom:0}.border-left-0{-webkit-border-start:0;border-inline-start:0}.box-shadow-none{box-shadow:none}.word-break-break-all{word-break:break-all}.word-break-break-word{word-break:break-word}.margin-0{margin:0!important}.phone .phone-margin-0{margin:0!important}.margin-5{margin:5px!important}.margin-10{margin:10px!important}.margin-20{margin:20px!important}.margin-30{margin:20px!important}.margin-40{margin:20px!important}.margin-top-0,.phablet .phablet-margin-top-0,.phone .phone-margin-top-0{margin-top:0!important}.margin-top-5,.phablet .phablet-margin-top-5,.phone .phone-margin-top-5{margin-top:5px!important}.margin-top-10,.phablet .phablet-margin-top-10,.phone .phone-margin-top-10{margin-top:10px!important}.margin-top-20,.phablet .phablet-margin-top-20,.phone .phone-margin-top-20{margin-top:20px!important}.margin-top-30{margin-top:30px!important}.margin-top-40{margin-top:40px!important}.margin-right-auto{-webkit-margin-end:auto!important;margin-inline-end:auto!important}.margin-right-0,.phablet .phablet-margin-right-0,.phone .phone-margin-right-0{-webkit-margin-end:0!important;margin-inline-end:0!important}.margin-right-035em{-webkit-margin-end:.35em!important;margin-inline-end:.35em!important}.margin-right-5{-webkit-margin-end:5px!important;margin-inline-end:5px!important}.margin-right-10{-webkit-margin-end:10px!important;margin-inline-end:10px!important}.margin-right-20{-webkit-margin-end:20px!important;margin-inline-end:20px!important}.margin-right-30{-webkit-margin-end:30px!important;margin-inline-end:30px!important}.margin-right-40{-webkit-margin-end:40px!important;margin-inline-end:40px!important}.margin-bottom-0,.phablet .phablet-margin-bottom-0,.phone .phone-margin-bottom-0{margin-bottom:0!important}.margin-bottom-5{margin-bottom:5px!important}.margin-bottom-10,.phablet .phablet-margin-bottom-10,.phone .phone-margin-bottom-10{margin-bottom:10px!important}.margin-bottom-20,.phablet .phablet-margin-bottom-20,.phone .phone-margin-bottom-20{margin-bottom:20px!important}.margin-bottom-30{margin-bottom:30px!important}.margin-bottom-40{margin-bottom:40px!important}.margin-left-auto{-webkit-margin-start:auto!important;margin-inline-start:auto!important}.margin-left-0,.phablet .phablet-margin-left-0,.phone .phone-margin-left-0{-webkit-margin-start:0!important;margin-inline-start:0!important}.margin-right--10{-webkit-margin-end:-10px!important;margin-inline-end:-10px!important}.margin-left--10{-webkit-margin-start:-10px!important;margin-inline-start:-10px!important}.margin-left-5{-webkit-margin-start:5px!important;margin-inline-start:5px!important}.margin-left-10{-webkit-margin-start:10px!important;margin-inline-start:10px!important}.margin-left-20{-webkit-margin-start:20px!important;margin-inline-start:20px!important}.margin-left-30{-webkit-margin-start:30px!important;margin-inline-start:30px!important}.margin-left-40{-webkit-margin-start:40px!important;margin-inline-start:40px!important}.padding-0{padding:0!important}.phone .phone-padding-0{padding:0!important}.padding-5{padding:5px!important}.padding-10{padding:10px!important}.padding-20{padding:20px!important}.padding-30{padding:20px!important}.padding-40{padding:20px!important}.padding-top-5{padding-top:5px!important}.padding-top-0{padding-top:0!important}.padding-top-10{padding-top:10px!important}.padding-top-20{padding-top:20px!important}.padding-top-30{padding-top:30px!important}.padding-top-40{padding-top:40px!important}.padding-right-5{-webkit-padding-end:5px!important;padding-inline-end:5px!important}.padding-right-0{-webkit-padding-end:0!important;padding-inline-end:0!important}.padding-right-10{-webkit-padding-end:10px!important;padding-inline-end:10px!important}.padding-right-20{-webkit-padding-end:20px!important;padding-inline-end:20px!important}.padding-right-30{-webkit-padding-end:30px!important;padding-inline-end:30px!important}.padding-right-40{-webkit-padding-end:40px!important;padding-inline-end:40px!important}.padding-bottom-5{padding-bottom:5px!important}.padding-bottom-0{padding-bottom:0!important}.padding-bottom-10{padding-bottom:10px!important}.padding-bottom-20{padding-bottom:20px!important}.padding-bottom-30{padding-bottom:30px!important}.padding-bottom-40{padding-bottom:40px!important}.padding-left-5{-webkit-padding-start:5px!important;padding-inline-start:5px!important}.padding-left-0{-webkit-padding-start:0!important;padding-inline-start:0!important}.padding-left-10{-webkit-padding-start:10px!important;padding-inline-start:10px!important}.padding-left-20{-webkit-padding-start:20px!important;padding-inline-start:20px!important}.padding-left-30{-webkit-padding-start:30px!important;padding-inline-start:30px!important}.padding-left-40{-webkit-padding-start:40px!important;padding-inline-start:40px!important}.position-sticky{position:-webkit-sticky;position:sticky}.position-static{position:static}.position-relative{position:relative}.position-absolute{position:absolute}.position-fixed{position:fixed}.text-align-left{text-align:start}.text-align-center{text-align:center}.text-align-right{text-align:end}.text-align-justify{text-align:justify}.text-decoration-none{text-decoration:none!important}.display-block{display:block}.display-inline{display:inline}.display-inline-table{display:inline-table}.display-inline-block{display:inline-block}.display-table-cell{display:table-cell}.word-break-break-all{word-break:break-all}.list-style-position-inside li{list-style-position:inside!important}.list-style-position-outside li{list-style-position:outside!important}.list-style-type-disc li{list-style-type:disc!important}.list-style-type-decimal li{list-style-type:decimal!important}.center-box{-webkit-margin-end:auto!important;margin-inline-end:auto!important;-webkit-margin-start:auto!important;margin-inline-start:auto!important}.display-inline-block,.display-table-cell{zoom:1}.vertical-align-middle{vertical-align:middle!important}.resize-vertical{resize:vertical!important}.no-resize,.resize-none{resize:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.overflow-x-auto{overflow-x:auto!important}.overflow-y-auto{overflow-y:auto!important}.overflow-x-hidden{overflow-x:hidden!important}.overflow-y-hidden{overflow-y:hidden!important}.overflow-x-visible{overflow-x:visible!important}.overflow-y-visible{overflow-y:visible!important}.overflow-x-scroll{overflow-x:scroll!important}.overflow-y-scroll{overflow-y:scroll!important}.text-transform-capitalize{text-transform:capitalize}.text-transform-uppercase{text-transform:uppercase}.default-margin-top{margin-top:20px}.default-margin-bottom{margin-bottom:20px}.float-none{float:none!important;clear:both!important}.desktop .desktop-hide,.laptop .laptop-hide,.largescreen .desktop-hide,.phablet .phablet-hide,.phone .phone-hide,.tablet .tablet-hide{display:none!important}.desktop .desktop-display-block,.desktop .desktop-show,.laptop .laptop-display-block,.laptop .laptop-show,.largescreen .desktop-display-block,.largescreen .desktop-show,.phablet .phablet-display-block,.phablet .phablet-show,.phone .phone-display-block,.phone .phone-show,.tablet .tablet-display-block,.tablet .tablet-show{display:block!important}.desktop .desktop-display-inline,.laptop .laptop-display-inline,.phablet .phablet-display-inline,.phone .phone-display-inline,.tablet .tablet-display-inline{display:inline!important}.desktop .desktop-display-inline-block,.laptop .laptop-display-inline-block,.phablet .phablet-display-inline-block,.phone .phone-display-inline-block,.tablet .tablet-display-inline-block{display:inline-block!important}.image-responsive{max-width:100%!important;width:auto!important}.desktop .desktop-float-none,.laptop .laptop-float-none,.phablet .phablet-float-none,.phone .phone-float-none,.tablet .tablet-float-none{float:none;clear:both}.phablet .grid-columns,.phone .grid-columns{float:none;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0;margin-inline-end:0}.phablet .phablet-float-left,.phone .phone-float-left{float:left!important}[dir=rtl].phablet .phablet-float-left,[dir=rtl].phone .phone-float-left{float:right!important}.phablet .phablet-c1,.phone .fluid-column.phablet-c1,.phone .fluid-column.phone-c1,.phone .phone-c1{width:100%}.phablet .phablet-text-align-left,.phone .phone-text-align-left{text-align:left!important}.phablet .phablet-text-align-center,.phone .phone-text-align-center{text-align:center!important}#tiptip_holder{display:none;position:absolute;top:0;inset-inline-start:0;z-index:99999}#tiptip_holder.tip_top{padding-bottom:5px}#tiptip_holder.tip_bottom{padding-top:5px}#tiptip_holder.tip_right{-webkit-padding-start:5px;padding-inline-start:5px}#tiptip_holder.tip_left{-webkit-padding-end:5px;padding-inline-end:5px}#tiptip_content{font-size:12px;color:#fff;padding:6px 8px;background-color:#333;background-color:rgba(0,0,0,.8);word-break:break-word}#tiptip_arrow,#tiptip_arrow_inner{position:absolute;border-color:transparent;border-style:solid;border-width:6px;height:0;width:0}#tiptip_holder.tip_top #tiptip_arrow_inner{margin-top:-6px;-webkit-margin-start:-7px;margin-inline-start:-7px;border-top-color:#333;border-top-color:rgba(0,0,0,.8)}#tiptip_holder.tip_bottom #tiptip_arrow_inner{margin-top:-6px;-webkit-margin-start:-7px;margin-inline-start:-7px;border-bottom-color:#333;border-bottom-color:rgba(0,0,0,.8)}#tiptip_holder.tip_right #tiptip_arrow_inner{margin-top:-6px;-webkit-margin-start:-6px;margin-inline-start:-6px;border-right-color:#333;border-right-color:rgba(0,0,0,.8)}#tiptip_holder.tip_left #tiptip_arrow_inner{margin-top:-6px;-webkit-margin-start:-6px;margin-inline-start:-6px;border-left-color:#333;border-left-color:rgba(0,0,0,.8)}.antiscroll-wrap{display:block;position:relative;overflow:hidden}.antiscroll-scrollbar{background:gray;background:rgba(0,0,0,.5);border-radius:7px;box-shadow:0 0 1px #fff;position:absolute;opacity:0;-webkit-transition:linear 350ms opacity;-moz-transition:linear 350ms opacity;-o-transition:linear 350ms opacity}.antiscroll-scrollbar-shown{opacity:1}.antiscroll-scrollbar-horizontal{height:7px;-webkit-margin-start:2px;margin-inline-start:2px;bottom:2px;inset-inline-start:0}.antiscroll-scrollbar-vertical{width:7px;margin-top:2px;inset-inline-end:2px;top:0}.antiscroll-inner{overflow:scroll}.antiscroll-inner::-webkit-scrollbar{width:0;height:0}.antiscroll-inner::scrollbar{width:0;height:0}#recaptcha_table.recaptcha_theme_clean #recaptcha_image{border:0!important}#recaptcha_response_field{height:auto}.copy-hover-display button.copy-input,.copy-hover-display button.input-action{visibility:hidden}.copy-hover-display:hover button.copy-input,.copy-hover-display:hover button.input-action,.phablet button.copy-input,.phablet button.input-action,.phone button.copy-input,.phone button.input-action{visibility:visible}button.copy-input,button.input-action{position:absolute;inset-inline-end:7px;top:.8181em;text-transform:uppercase;cursor:pointer;line-height:1;font-size:11px;padding:4px 6px;border-radius:4px;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:0}button.copy-input,button.input-action{background:var(--buttonDefaultBackground);color:var(--buttonDefaultText)}button:hover.copy-input,button:hover.input-action{background:var(--buttonDefaultHoverBackground);color:var(--buttonDefaultHoverText)}.shake{-webkit-animation:shake .82s cubic-bezier(.36,.07,.19,.97) both;animation:shake .82s cubic-bezier(.36,.07,.19,.97) both}@-webkit-keyframes shake{10%,90%{transform:translate3d(-1px,0,0)}20%,80%{transform:translate3d(2px,0,0)}30%,50%,70%{transform:translate3d(-4px,0,0)}40%,60%{transform:translate3d(4px,0,0)}}@keyframes shake{10%,90%{transform:translate3d(-1px,0,0)}20%,80%{transform:translate3d(2px,0,0)}30%,50%,70%{transform:translate3d(-4px,0,0)}40%,60%{transform:translate3d(4px,0,0)}}.key-feedback{line-height:1;background:rgba(0,0,0,.7);position:fixed;z-index:10000;-webkit-backdrop-filter:blur(30px);backdrop-filter:blur(30px);bottom:1.5em;transition:all .5s;opacity:0;text-align:center;color:#fff;font-weight:700;font-size:45px;padding:1em;border-radius:.5em;inset-inline-start:50%;transform:translateX(-50%);border:4px solid rgba(255,255,255,.9);box-shadow:0 0 50px 6px rgb(0 0 0 / 25%);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}img.qr{display:inline-block}.fa-vkontakte:before{content:"\f189"}.fab.fa-mailru{font-family:"Font Awesome 5 Free";font-weight:900}.fa-mailru:before{content:"\f1fa"}.fa-stackexchange:before{content:"\f18d"}.fa-twitchtv:before{content:"\f1e8"}.fa-wechat:before{content:"\f1d7"}.clearfix:after{clear:both;display:table;content:''}
\ No newline at end of file
+:root{--colorBlue:rgb(0, 110, 219);--colorBlueHover:rgb(0, 119, 237);--colorGreen:#2ecc71;--colorGreenHover:#27ae60;--colorOrange:#e67e22;--colorOrangeHover:#d35400;--colorPurple:#9b59b6;--colorPurpleHover:#8e44ad;--colorRed:#e74c3c;--colorRedHover:#c0392b;--colorYellow:#f1c40f;--colorYellowHover:#f39c12}:root{color-scheme:light;--colorSuccess:var(--colorGreen);--colorFail:var(--colorRed);--alertAccent:#f1c40f;--alertBackground:#fff5b3;--alertText:#161c1d;--backgroundDarkAlpha:rgb(0 0 0 / 80%);--backgroundLightAlpha:rgb(255 255 255 / 90%);--bodyBackground:#FFF;--bodyEmpty:#e2e8e9;--bodySeparator:#e2e8e9;--bodyText:#161c1d;--bodyTextDisabled:#c5d1d3;--bodyTextSubtle:#6c7779;--buttonAccentBackground:var(--colorAccent);--buttonAccentHoverBackground:var(--colorAccentStrong);--buttonAccentHoverText:var(--buttonAccentText);--buttonAccentText:#FFF;--buttonDefaultBackground:#d9e1e2;--buttonDefaultBorder:var(--buttonDefaultBackground);--buttonDefaultHoverBackground:#c0def2;--buttonDefaultHoverBorder:var(--buttonDefaultHoverBackground);--buttonDefaultHoverText:var(--buttonAccentBackground);--buttonDefaultText:#161c1d;--colorAccent:var(--colorBlue);--colorAccentStrong:var(--colorBlueHover);--inputBackground:#ecf0f1;--inputPlaceholderText:#8aa2a8;--inputText:#161c1d;--linkText:rgb(0, 102, 204);--menuBackground:hsla(0, 5.9%, 98.9%, .7);--menuItemHoverBackground:var(--colorAccent);--menuItemHoverText:#FFF;--menuItemText:#161c1d;--menuSeparator:rgba(11, 14, 15, 0.1);--menuBorder:var(--menuSeparator);--menuText:#161c1d;--modalBackground:var(--bodyBackground);--modalText:#161c1d;--topBarBackground:rgb(255 255 255);--topSubBarBackground:var(--topBarBackground);--topBarText:#161c1d;--viewerBackground:#323232;--listItemText:#FFF}*{-ms-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none}.btn,.btn-container,.input-search,.link,.list-item,.no-select,.pop-btn-text,.top-btn-text,.user-select-none{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.animate{transition:all .2s ease-in-out}.animate--slow{transition-duration:.4s}[type=search]{-moz-appearance:textfield;-webkit-appearance:textfield;appearance:textfield}::-webkit-input-placeholder{color:var(--inputPlaceholderText);line-height:140%}:-moz-placeholder{color:var(--inputPlaceholderText);opacity:1}::-moz-placeholder{color:var(--inputPlaceholderText);opacity:1}:-ms-input-placeholder{color:var(--inputPlaceholderText)}:focus::-webkit-input-placeholder{color:var(--inputPlaceholderText)}:focus:-moz-placeholder{color:var(--inputPlaceholderText)}:focus::-moz-placeholder{color:var(--inputPlaceholderText)}focus:-ms-input-placeholder{color:var(--inputPlaceholderText)}::-moz-focus-inner{border:0;padding:0;margin:0}::-ms-clear{display:none}body{min-height:100vh;min-height:100dvh;min-height:-webkit-fill-available;-webkit-font-smoothing:subpixel-antialiased}[type=submit]:focus,button:focus{outline:0}html{height:100%;height:-webkit-fill-available}body,html{min-height:100vh;min-height:100dvh;font-family:Helvetica,Arial,sans-serif;color:var(--bodyText);font-size:16px;background:var(--bodyBackground);-webkit-text-size-adjust:100%}kbd{font-family:inherit}.pointer-events-none{pointer-events:none}#menu-fullscreen,#pop-box-mask.fullscreen{height:100%}#menu-fullscreen,.pop-box{transition:transform 350ms cubic-bezier(.4,0,0,1),opacity 350ms cubic-bezier(.4,0,0,1)}#menu-fullscreen>ul{position:relative;z-index:1000;background:var(--topBarBackground);color:var(--topBarText)}body.no-margin-top{margin-top:0;padding-top:0}.content-width{width:100%;-webkit-margin-end:auto;margin-inline-end:auto;-webkit-margin-start:auto;margin-inline-start:auto;position:relative;-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:10px;padding-inline-end:10px}a{color:var(--linkText);text-decoration:none;cursor:pointer;outline:0}a[rel=external]::after{font-weight:900;font-family:"Font Awesome 5 Free";-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;-webkit-margin-start:.25em;margin-inline-start:.25em;content:"\f35d";font-size:90%}a[role=button]:hover{text-decoration:none}a:focus,a:hover{text-decoration:underline}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1}.ui-selectable-helper{background:var(--colorAccent);border:2px dashed var(--topBarBackground);position:absolute;z-index:500;opacity:.6}.image-container{transition:transform 180ms cubic-bezier(.25,1,.5,1)}.selected .image-container,.ui-selecting .image-container{transform:scale(.5)}.selected .list-item-play-gif,.ui-selecting .list-item-play-gif{transform:scale(.75)}.selected .image-container img,.selected .image-container svg,.ui-selecting .image-container img,.ui-selecting .image-container svg{border-radius:.5em;transform:translateZ(0)}.hidden{display:none!important}.visible{display:block!important}.fab.soft-hidden,.far.soft-hidden,.fas.soft-hidden,.soft-hidden{display:none}.soft-visible{display:block}.hidden-visibility{visibility:hidden;position:absolute;top:0}.touch-scroll{overflow:auto;-webkit-overflow-scrolling:touch}.or-separator{border-top:1px solid var(--bodySeparator);text-align:center;margin:10px 0 10px 0}.or-separator span{font-size:.93em;font-weight:400;color:var(--bodySeparator);text-transform:uppercase;text-align:center;background:var(--bodyBackground);display:inline-block;position:relative;padding:0 10px;top:-10px}.highlight{color:var(--alertText);background:var(--alertBackground)}.highlight:empty{display:none}.line-through{text-decoration:line-through}.line-separator{width:100%;height:1px;background:var(--bodySeparator);display:block;margin:20px 0;border:0}.number-figures,a.number-figures{font-size:1.21em;line-height:1.21em;color:inherit;text-decoration:none;-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:10px;padding-inline-end:10px;-webkit-margin-start:0;margin-inline-start:0;-webkit-border-start:1px solid var(--bodySeparator);border-inline-start:1px solid var(--bodySeparator);text-align:center}.number-figures:first-child{-webkit-padding-start:0;padding-inline-start:0;-webkit-border-start:none;border-inline-start:none}.number-figures:last-child{-webkit-padding-end:0;padding-inline-end:0}.number-figures b{font-weight:inherit}.number-figures .icon-heart4{position:relative;top:1px}.number-figures span:not(.icon){color:var(--bodyTextSubtle);text-transform:uppercase;font-size:.6em}a.number-figures:hover,a.number-figures:hover *{color:var(--linkText)}.loading-indicator,.loading-text{display:inline-block;line-height:inherit;vertical-align:top}.loading-text{-webkit-margin-start:5px;margin-inline-start:5px}.btn-alt{color:var(--bodyTextSubtle);font-size:13px;font-size:.93rem;margin:0 5px;display:inline!important}.btn-alt a:first-letter{text-transform:capitalize}.phone .btn-alt{margin:5px 0 0}.btn-alt a{-webkit-margin-start:5px;margin-inline-start:5px;cursor:pointer}a.link{font-size:13px;font-size:.93rem;text-decoration:none;font-weight:400}.pop-box-menu a.link--delete,[data-action=delete],a.link--delete{color:#e74c3c}html:not(.phone) .pop-box-menu a.link--delete:hover{background-color:#e74c3c}a.link--approve{color:#2ecc71}a.link span.icon,a.link:hover span.icon{text-decoration:none}a.link:hover span{text-decoration:underline}.disabled,.disabled a{color:var(--bodyTextDisabled)}.disabled a{text-decoration:none;cursor:default}.optional{font-size:.6em;color:var(--bodyTextSubtle);font-weight:400}.text-shadow{text-shadow:2px 2px 3px rgba(0,0,0,.75);-webkit-filter:dropshadow(color=#000000, offx=2, offy=2);filter:dropshadow(color=#000000, offx=2, offy=2)}.box-shadow{box-shadow:2px 2px 3px 0 rgba(0,0,0,.45)}.silent-links a,a.silent-links{color:inherit}.close-box .icon-circle{color:var(--bodyText);position:relative}.close-box .icon-close-box{color:#fff;position:absolute;inset-inline-start:0;top:0}.transparent-canvas{background-image:url(data:image/gif;base64,R0lGODlhEAAQAIAAAP///9/f3yH5BAAHAP8ALAAAAAAQABAAAAIfjG+gq4jM3IFLJgpswNly/XkcBpIiVaInlLJr9FZWAQA7);background-repeat:repeat}.transparent-canvas.dark{background-image:url(data:image/gif;base64,R0lGODlhEAAQAIAAAOfn58rKyiH5BAAHAP8ALAAAAAAQABAAAAIfjG+gq4jM3IFLJgpswNly/XkcBpIiVaInlLJr9FZWAQA7)}input,select,textarea{font-family:inherit;font-size:1rem;display:inline-block}html:not(.safari) select,input,textarea{border-radius:3px;color:var(--inputText);border:1px solid transparent;background:var(--inputBackground)}input:-webkit-autofill,select:-webkit-autofill,textarea:-webkit-autofill{-webkit-text-fill-color:var(--inputText)!important}.input-focus,html:not(.safari) select:focus,input.search:focus,input:focus,textarea:focus{border-color:var(--colorAccent)}input:-webkit-autofill,input:-webkit-autofill:focus,input:-webkit-autofill:hover,select:-webkit-autofill,select:-webkit-autofill:focus,select:-webkit-autofill:hover{-webkit-text-fill-color:inherit;-webkit-box-shadow:inset 0 0 0 9999px transparent;-webkit-transition:background-color 5000s ease-in-out 0s;transition:background-color 5000s ease-in-out 0s}select{font:inherit;outline:0}.text-input,textarea{outline:0}input[type=checkbox],input[type=radio]{border-radius:0;border:none;position:relative;vertical-align:baseline}.input-line-height,.text-input,input[type=text]{height:36px}.input-line-height{line-height:36px}.text-input,input[type=text]:not(.text-input),textarea{padding:7px 10px;width:100%}.ie7 .text-input,.ie7 input[type=text],.ie7 textarea{padding:10px;width:328px;height:14px}.ie8 .text-input,.ie8 input[type=text],.ie8 textarea,.ie9 .text-input,.ie9 input[type=text],.ie9 textarea{height:auto}.input,.input-label{position:relative;overflow:visible;scroll-snap-align:start}.input{margin:10px 0;font-size:1em}.input.first-child,.input:first-child{margin-top:0}.input-label{margin:20px 0}.input-label.first-child,.input:first-child{margin-top:0}.input-label h3,.input-label label,.input-label-label{font-weight:600;padding-bottom:5px;display:inline-block;font-size:1em}.input-label h3{display:block}.input-label h3 a,.input-label label a{font-weight:400}.input-label label .caption,.input-label label .optional{font-weight:400;font-size:.92em}.input-label .btn-alt{position:absolute;inset-inline-start:100%;top:23px;line-height:36px;-webkit-margin-start:10px;margin-inline-start:10px;-webkit-margin-end:0;margin-inline-end:0}.phone .input-label .btn-alt{position:static;-webkit-margin-start:0;margin-inline-start:0}.checkbox-label,.input-label{position:relative;font-size:.93em}.input .icon-input-submit{background:0 0;font-size:1.82em;color:#d9d9d9;position:absolute;inset-inline-end:.21em;top:.21em;cursor:pointer;line-height:1}.input .icon-input-submit.focus,.input .icon-input-submit:focus,.input .icon-input-submit:hover{color:var(--colorAccent)}.ie7 .input .icon-input-submit{top:2px}.ui-autocomplete{max-height:130px;overflow-y:auto;overflow-x:hidden}* html .ui-autocomplete{height:125px}.autocomplete-list{min-width:50%;position:absolute;z-index:1;inset-inline-start:0;-webkit-margin-before:0;margin-block-start:0;border:1px solid var(--bodySeparator);border-radius:var(--borderRadius);background:var(--bodyBackground);box-shadow:0 4px 14px rgba(0,0,0,.25);--borderRadius:3px}.autocomplete-list:empty{display:none}.autocomplete-list li{color:inherit;padding:4px 16px;display:block;cursor:pointer;border-bottom:1px solid var(--bodySeparator)}.autocomplete-list li:first-child{border-top-left-radius:var(--borderRadius);border-top-right-radius:var(--borderRadius)}.autocomplete-list li:last-child{border-bottom:0;border-bottom-right-radius:var(--borderRadius);border-bottom-left-radius:var(--borderRadius)}.autocomplete-list li.--focus,.autocomplete-list li:hover{background:var(--buttonAccentBackground);color:var(--buttonAccentText)}.hide-empty:empty{display:none}.input-column{width:350px}.input-warning{color:var(--bodyTextSubtle);inset-inline-end:0;top:0}.input-below{margin-top:5px;display:block;position:static}.red-warning{color:#d74634}.input-password input[type=password][id=new-password]{-webkit-padding-end:65px;padding-inline-end:65px}.input-password .input-password-strength{position:absolute;inset-inline-end:11px;top:50%;margin-top:5px}.fancy-fieldset .input-password{display:flex;align-items:center}.fancy-fieldset .input-password-strength{inset-inline-end:0;top:auto;margin-top:0}.input-password-strength{background:var(--bodyEmpty)}.input-password-strength,.input-password-strength span{display:block;width:50px;height:8px}.input-password-strength span{width:0%;background-color:transparent}.input-password-strength [data-veredict=very-weak]{background-color:#e74c3c}.input-password-strength [data-veredict=weak]{background-color:#e67e22}.input-password-strength [data-veredict=average],.input-password-strength [data-veredict=strong],.input-password-strength [data-veredict=stronger]{background-color:#2ecc71}.checkbox-label{font-size:1em;display:block;margin:5px 0;position:relative}.checkbox-label:last-child{margin-bottom:0}.checkbox-label input{position:absolute;padding:0;margin:0;-webkit-margin-start:-20px;margin-inline-start:-20px}.btn-alt.checkbox-label input{position:static;vertical-align:text-top;-webkit-margin-end:4px;margin-inline-end:4px}.phone .btn-alt.checkbox-label{display:block!important;margin:10px 0}.checkbox-label label{-webkit-padding-start:20px;padding-inline-start:20px;font-weight:400;margin:0;padding-bottom:0}.fancy-box .checkbox-label label{display:flex;align-items:flex-start}.input-search{position:relative}input.search{font-size:1em;border-radius:200px;padding:0 25px 0 32px;-webkit-padding-end:3.0666em;padding-inline-end:3.0666em;-webkit-padding-start:2.3571em;padding-inline-start:2.3571em;line-height:100%;height:26px;height:1.86em;width:100%;border:1px solid transparent;top:0;inset-inline-start:0;outline:0;vertical-align:text-bottom}input.search::-webkit-input-placeholder{font-size:1em}input.search:-moz-placeholder{font-size:1em}input.search::-moz-placeholder{font-size:1em}input.search:-ms-input-placeholder{font-size:1em}input.search.one-icon-padding,input.search.two-icon-padding{-webkit-padding-end:2em;padding-inline-end:2em}input.search.two-icon-padding{-webkit-padding-start:2.2em;padding-inline-start:2.2em}.top-bar input.search{-webkit-padding-start:calc(1.625rem + 7px);padding-inline-start:calc(1.625rem + 7px);position:relative;-webkit-padding-end:34px;padding-inline-end:34px;background:0 0;border:0;box-shadow:none!important}.top-bar input{color:var(--topBarText)}.ie7 input.search,.ie8 input.search,.ie9 input.search{-webkit-padding-end:10px;padding-inline-end:10px;line-height:26px;height:26px}.ie7 input.search{padding:0;width:200px}.input-search span{position:absolute;cursor:pointer}.input-search .icon--search{color:var(--inputText);left:.85714286rem;top:50%;transform:translateY(-50%)}.top-bar .input-search .icon--search{font-size:1.28571429rem;line-height:50px;width:1.625rem;left:0;text-align:center}.input-search .icon--search,.top-btn-text .icon--search{font-size:1em;width:1em}.input-search .icon--close,.input-search .icon--settings{color:var(--inputText);padding:.5em;top:0;font-size:1em}.input-search .icon--close:hover,.input-search .icon--settings:hover{color:var(--colorAccent)}.input-search .icon--close{-webkit-padding-end:.75em;padding-inline-end:.75em;margin-right:-.5em}#menu-fullscreen .input-search .icon--settings,.input-search .icon--settings{inset-inline-end:22px}#menu-fullscreen .input-search .icon--close,.input-search .icon--close{inset-inline-end:4px}.ie7 .input-search .icon--close,.ie8 .input-search .icon--close,.ie9 .input-search .icon--close{display:none}select{-webkit-padding-start:7px!important;padding-inline-start:7px!important}.ie7 select{width:100%!important;padding:0!important;height:auto!important}select option{padding:4px 10px;margin:0}textarea{resize:both;height:80px}.input-upload{position:relative}.user-settings-avatar{min-height:160px;height:auto}.user-settings-avatar-container{position:relative}.user-settings-avatar-container,.user-settings-avatar-container .user-image{font-size:160px;width:1em;height:1em}.user-settings-avatar .loading-placeholder{position:absolute;inset-inline-start:0;top:0;background:var(--bodyEmpty)}.phone .user-settings-avatar-container{margin:0 auto 10px!important}.input-upload .btn-container{margin:0 0 5px 0}.input-upload .btn-alt{-webkit-margin-start:0;margin-inline-start:0}.arrow-down{border-width:4px 4px 0 4px;border-color:#333 transparent transparent transparent;border-color:#333 transparent transparent transparent;content:""}.arrow-down{border-style:solid;display:inline-block;height:0;width:0;vertical-align:middle}.sign-services li{display:inline-block;margin:0 4px 4px 0}.sign-service{font-size:.93em;padding:0 8px;line-height:30px;height:29px}.sign-service .btn-icon{font-size:inherit;width:auto}.sign-services-compact .btn-text{display:none}.link-service,.sign-service{color:#fff;display:inline-block;text-decoration:none!important}.link-service span,.sign-service{border-radius:3px}.link-service{font-weight:400;height:28px;position:relative}.link-service span{display:block;line-height:28px;text-align:center!important}.link-service .btn-icon{width:28px;height:28px;-webkit-margin-end:4px;margin-inline-end:4px;position:absolute;inset-inline-start:0;top:0}.link-service span.sign-text{padding:0 20px;-webkit-margin-start:32px;margin-inline-start:32px}.btn-social .btn-icon,.sign-service .icon{color:#fff;position:relative;display:inline-block}.buttons{display:flex;flex-wrap:wrap;gap:5px;justify-content:flex-start}.buttons.text-align-right{justify-content:flex-end}.phone .buttons{justify-content:center}.buttons .btn{display:inline-block;text-align:center}.btn-container{margin-top:20px;margin-bottom:20px;position:relative}.btn{height:36px;line-height:36px;height:2.57142857rem;line-height:2.57142857rem;font-family:inherit;font-size:1em;font-weight:400;padding:0 10px;border-radius:3px;cursor:pointer;display:inline-block;text-decoration:none;border:1px solid transparent;white-space:nowrap}.btn>*{pointer-events:none}.btn,.btn:active,.btn:focus,.btn:hover{text-decoration:none}.btn.default:active,.btn:active{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-icon{display:inline-block;text-align:center;width:1.4em}.btn-text{-webkit-margin-start:4px;margin-inline-start:4px}.btn-text:empty{display:none}.btn-big{font-size:16px;font-size:1.143rem;height:38px;line-height:38px;-webkit-padding-start:1em;padding-inline-start:1em;-webkit-padding-end:1em;padding-inline-end:1em}.btn-small{font-size:13px;height:30px;line-height:30px;font-size:.92rem;height:2.14285714rem;line-height:2.14285714rem}.btn-input{font-weight:600;font-size:.93em;-webkit-padding-start:20px;padding-inline-start:20px;-webkit-padding-end:20px;padding-inline-end:20px}.btn-32{width:32px;height:32px;text-align:center;display:inline-block}.btn-32 .btn-icon{font-size:18px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%)}.btn-capsule{border-radius:100px;border-color:rgba(255,255,255,.1);background-color:rgba(0,0,0,.5);-webkit-backdrop-filter:blur(17.5px) saturate(1.8);backdrop-filter:blur(17.5px) saturate(1.8);background-image:none;height:auto;color:#fff;text-shadow:none;font-size:.93em;height:2.15em;line-height:2.15em;font-weight:400;padding:0 1.15em;box-shadow:none;-webkit-filter:none;filter:none}.btn-capsule:hover{background-color:rgba(0,0,0,.7);border-color:rgba(255,255,255,.3)}.no-rgba .btn-capsule{border-color:#666;background-color:none;zoom:1}.btn-capsule:active{box-shadow:none}.btn-capsule .btn-icon{font-size:.93em}.btn.accent{color:var(--buttonAccentText);border:1px solid transparent;background:var(--buttonAccentBackground)}.btn.accent:not(.outline):hover{color:var(--buttonAccentHoverText);background:var(--buttonAccentHoverBackground)}.btn.accent.outline{color:var(--buttonAccentBackground);border-color:var(--buttonAccentBackground);box-shadow:none}.btn.accent.outline:hover{color:var(--buttonAccentHoverBackground);border-color:var(--buttonAccentHoverBackground)}.btn.default{color:var(--buttonDefaultText);border-color:var(--buttonDefaultBorder);background:var(--buttonDefaultBackground)}.btn.default--hover:not(.outline),.btn.default:not(.outline):hover{color:var(--buttonDefaultHoverText);background:var(--buttonDefaultHoverBackground);border-color:var(--buttonDefaultHoverBorder)}.btn.default.outline{color:var(--buttonDefaultBackground);border-color:var(--buttonDefaultBackground);box-shadow:none}.btn.default.outline:hover{color:var(--buttonDefaultHoverBackground);border-color:var(--buttonDefaultHoverBackground)}.btn.disabled,.btn.disabled:hover{color:var(--bodyTextSubtle);background-color:var(--buttonDefaultBackground);background-image:none;box-shadow:none;cursor:default}.btn.disabled.outline,.btn.disabled.outline:hover{color:var(--bodyTextSubtle);border-color:var(--bodyTextSubtle)}.btn.plain,.btn.plain:hover{background:0 0;text-shadow:none;border-color:transparent;box-shadow:none;padding:0;color:inherit}.btn.plain:active{box-shadow:none}.btn.active{background-image:none;background-color:var(--colorAccent);border-color:var(--colorAccent);-webkit-filter:none;filter:none}.btn.grey,.btn.grey.off:hover{background-color:#eee}.btn.grey:hover{background-color:#e9e9e9}.btn.grey.outline{color:#eee}.btn.orange,.btn.orange.off:hover{border-color:#fe771d;background-color:#fe771d}.btn.orange:hover{background-color:#fe6b0a}.btn.orange.outline{color:#fe771d}.btn.purple,.btn.purple.off:hover{border-color:#8e44ad;background-color:#8e44ad}.btn.purple:hover{background-color:#8e44ad}.btn.purple.outline{color:#8e44ad}.btn.blue,.btn.blue.off:hover{border-color:var(--colorBlue);background-color:var(--colorBlue)}.btn.blue:hover{background-color:#2879b0}.btn.blue.outline{color:var(--colorBlue)}.btn.green,.btn.green.off:hover{background-color:var(--colorGreen)}.btn.green:not(.outline):hover{background-color:var(--colorGreenHover)}.btn.green.outline{color:var(--colorGreen);border-color:var(--colorGreenHover)}.btn.red,.btn.red.off:hover{border-color:var(--colorRed);background-color:var(--colorRed)}.btn.red:not(.outline):hover{background-color:var(--colorRedHover)}.btn.red.outline{color:var(--colorRed)}.btn.red.outline:hover{color:var(--colorRedHover);border-color:var(--colorRedHover)}.btn.white,.btn.white.off:hover{border-color:#fff;background-color:#fff}.btn.white:hover{background-color:#fff}.btn.white.outline{color:#fff}.btn.black,.btn.black.off:hover{border-color:#3a3a3a;background-color:#3a3a3a}.btn.black:hover{background-color:#343434}.btn.black.outline{color:#3a3a3a}.btn.active,.btn.black,.btn.blue,.btn.green,.btn.orange,.btn.red{color:#fff;border:1px solid transparent}.btn.grey,.btn.white{color:#161c1d}.btn.off{cursor:default}.btn.off:active{box-shadow:none}.btn-social{color:var(--buttonDefaultText);background:var(--buttonDefaultBackground);background-image:none;box-shadow:none;border:1px solid transparent}.btn-social.btn-at .btn-icon,.btn-social.btn-share .btn-icon{color:var(--buttonDefaultText)}.btn-social,.btn-social:hover{text-decoration:none;text-shadow:none}.btn-x-twitter,.link-x-twitter span{background:#000}.btn-twitter,.link-twitter span{background:#55acee}.btn-facebook,.link-facebook span{background:#3b5998}.btn-google,.btn-google-plus,.link-google span,.link-google-plus span{background:#d74836}.btn-mail{background:#ccc;color:var(--bodyText)}.btn-mail span{color:var(--bodyText)}.btn-tumblr{background:#35465c}.btn-pinterest{background:#bd081c}.btn-stumbleupon{background:#eb4924}.btn-blogger{background:#f57d00}.btn-whatsapp{background:#43d854}.btn-telegram{background:#08c}.btn-weixin{background:#7bb32e}.btn-weibo{background:#df2029}.btn-qzone{background:#ffce00}.btn-qq{background:#121214}.btn-reddit{background:#ff4500}.btn-reddit .btn-icon{color:#fff}.btn-vk,.link-vk span{background:#45668e}.btn.outline,.btn.outline:hover{background:0 0;border:1px solid;box-shadow:none}.pop-btn,.top-btn-el,a[data-modal]{-webkit-tap-highlight-color:transparent}.pop-btn *,.top-btn-el *{-webkit-tap-highlight-color:rgba(0,0,0,.2)}.pop-btn,.top-btn-el{display:inline-block;position:relative;cursor:pointer}.pop-box-inner{cursor:default;display:block;-webkit-overflow-scrolling:touch;overflow:auto}.pop-box-inner form{margin-top:-20px;margin-bottom:-20px}.btn.pop-btn .pop-box{line-height:100%}.pop-btn-text{color:var(--linkText);cursor:pointer}.ie7 .pop-btn-text,.ie8 .pop-btn-text{-webkit-padding-end:0;padding-inline-end:0}.pop-btn-text .arrow-down{vertical-align:middle;-webkit-margin-start:5px;margin-inline-start:5px;border-top-color:var(--linkText)}.pop-btn.disabled{cursor:default}.pop-btn.disabled .pop-btn-text{color:var(--bodyTextDisabled);cursor:default}.pop-btn.disabled .arrow-down{border-top-color:var(--bodyTextDisabled)}.pop-box{color:var(--menuText);background:var(--menuBackground);-webkit-backdrop-filter:blur(27.5px) saturate(1.8);backdrop-filter:blur(27.5px) saturate(1.8);display:none;font-size:1em;z-index:200;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid var(--menuBorder)}.phablet .pop-box,.phone .pop-box{font-size:inherit;border-color:transparent}.pop-box .or-separator{border-top-color:var(--menuSeparator);margin-left:10px;margin-right:10px}.phablet .pop-box .or-separator,.phone .pop-box .or-separator{border-top-color:var(--topBarText);opacity:.25}@media (min-width:992px){.pop-box{position:absolute;top:20px;min-height:20px;min-width:190px;box-shadow:0 4px 14px rgba(0,0,0,.25);border-radius:6px;box-sizing:content-box;--columnGutter:5px;--columnWidth:190px;--columnWidthOuter:calc(var(--columnWidth) + var(--columnGutter))}.header--height .pop-box{min-width:240px}.pop-box,.pop-box.left-anchor{inset-inline-start:0}.pop-box.anchor-center{inset-inline-start:50%!important}.pop-box.anchor-right{inset-inline-start:auto;inset-inline-end:0}.pop-box.pbcols2{width:calc(2 * var(--columnWidthOuter) + var(--columnGutter))}.pop-box.pbcols3{width:calc(3 * var(--columnWidthOuter) + var(--columnGutter))}.pop-box.pbcols4{width:calc(4 * var(--columnWidthOuter) + var(--columnGutter))}.pop-box.pbcols5{width:calc(5 * var(--columnWidthOuter) + var(--columnGutter))}.pop-box.pbcols2 li,.pop-box.pbcols3 li,.pop-box.pbcols4 li,.pop-box.pbcols5 li{border-radius:6px}.pop-box-menucols ul{padding:10px 0;overflow:auto}.pop-box-menucols li{width:var(--columnWidth);float:left;margin:0 0 0 5px}[dir=rtl] .pop-box-menucols li{float:right}.pop-box-menucols li:first-child a,.pop-box-menucols li:last-child a{border-radius:0}}.pop-box-menu{font-size:13px;font-size:.92857143rem;-ms-scroll-snap-type:y mandatory;scroll-snap-type:y mandatory}.phablet .pop-box-menu,.phone .pop-box-menu{font-size:inherit}.pop-box-label{color:inherit;margin:10px;text-transform:uppercase;font-weight:700;font-size:85%;cursor:default}.pop-box-block{padding:0 10px}.pop-box-block .current::before{font-weight:900;font-family:"Font Awesome 5 Free";-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;-webkit-margin-end:.25em;margin-inline-end:.25em;content:"\f205";font-size:90%}.pop-box-menu .menu-item,.pop-box-menu a{display:block;padding:6px 10px;text-decoration:none;font-weight:400;line-height:143%;color:var(--menuItemText)}.pop-box-block a{display:inline-block;padding:6px;border-radius:.25em;line-height:1;font-size:1em}.phablet .pop-box,.phone .pop-box{color:var(--topBarText)}.phablet .pop-box-menu .menu-item,.phablet .pop-box-menu a,.phone .pop-box-menu .menu-item,.phone .pop-box-menu a{padding:10px;color:inherit}.phablet .pop-box-menu li.with-icon a .btn-icon,.phone .pop-box-menu li.with-icon a .btn-icon{top:11px}@media (min-width:992px){.pop-box-menu .menu-item,.pop-box-menu a{border-bottom:0}}.pop-box-menu a.focus,html:not(.phone) .pop-box-menu a:hover{background:var(--menuItemHoverBackground);color:var(--menuItemHoverText)}.pop-box-menu li.current a,.pop-box-menu li.current a:hover{color:var(--buttonDefaultHoverText);background:var(--buttonDefaultHoverBackground)}.pop-box-menu ul{display:block;padding:0}.phablet .pop-box-menu ul,.phone .pop-box-menu ul{display:flex;flex-wrap:wrap}.phablet .pop-box-menu ul li,.phone .pop-box-menu ul li{width:50%}@media (min-width:992px){.pop-box-menu ul{margin:5px 0}}.pop-box-menu li{display:block;text-align:start;overflow:hidden;position:relative}.pop-box-menu li.with-icon a{-webkit-padding-start:36px;padding-inline-start:36px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}html:not(.phone):not(.phablet) .header--height .pop-box-menu li a{-webkit-padding-end:25px;padding-inline-end:25px}.pop-box-menu li a kbd{position:absolute;top:50%;transform:translateY(-50%);inset-inline-end:10px;border-radius:2px;display:block;line-height:1;font-size:.9em;opacity:.5}.pop-box-menu li a:hover kbd{opacity:1}.phablet .pop-box-menu li a kbd,.phone .pop-box-menu li a kbd{display:none}.pop-box-menu li.with-icon a .btn-icon{position:absolute;inset-inline-start:10px;top:8px}.pop-box-menu li.current,.pop-box-menu li.current a{font-weight:600}.pop-box-menu li.current a:hover{cursor:default}.pop-box-userdetails{padding:10px;width:120%;min-width:var(--columnWidth);cursor:default;inset-inline-start:42px;line-height:normal;top:0!important;margin-top:0!important}.phablet .pop-box,.phone .pop-box{position:fixed;bottom:0;inset-inline-start:0!important;width:100%;top:auto!important;background:var(--topBarBackground);color:var(--topBarText)}@media all and (display-mode:standalone){.phablet .pop-box,.phone .pop-box{padding-bottom:30px}}.pop-box-header{font-weight:700;padding:15px 10px;position:relative;text-align:start;color:var(--topBarText)}.pop-box-header .icon--close{position:absolute;inset-inline-end:10px;top:50%;margin-top:-7px;font-size:1em;text-align:end}@media (min-width:992px){.pop-box-header{display:none}}.top-bar-placeholder{-webkit-backface-visibility:hidden;backface-visibility:hidden}.top-bar,.top-bar ul li.pop-btn,.top-bar ul li.top-btn-el,.top-bar-placeholder{height:50px}.top-btn-create-account,.top-btn-text{line-height:50px}.top-btn-text{-webkit-tap-highlight-color:transparent}.follow-scroll{transition:all .4s ease-out}.scroll-down #dashboard .top-sub-bar--1{top:50px}#dashboard .top-sub-bar--1:not(.follow-scroll){position:static}.top-bar,.top-sub-bar{left:0;right:0;width:100%;position:static;height:50px}.follow-scroll,.top-bar{position:-webkit-sticky;position:sticky}.top-bar{color:var(--topBarText);z-index:900;top:0}.top-bar--main{z-index:910}.top-bar--main .content-width{padding-left:5px;padding-right:5px}.top-sub-bar{color:var(--bodyText);z-index:500;overflow:visible;top:50px}body.pop-box-show .top-sub-bar--1{z-index:1}.top-sub-bar--1 .content-tabs-container{z-index:2}body.landing .top-bar,body.split .top-bar{position:fixed}.phablet .pop-box-show .top-bar,.phone .pop-box-show .top-bar{z-index:1}.follow-scroll-wrapper.position-fixed,.top-bar::before,.top-sub-bar::before{background:var(--topBarBackground);-webkit-backdrop-filter:blur(17.5px);backdrop-filter:blur(17.5px)}.top-sub-bar::before{background:var(--topSubBarBackground)}.top-bar::before,.top-sub-bar::before{-webkit-backface-visibility:hidden;backface-visibility:hidden}.top-bar::before,.top-sub-bar::before{width:100%;min-height:50px;position:absolute;content:" "}.top-bar .content-width,.top-sub-bar .content-width{position:relative;height:100%;-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:10px;padding-inline-end:10px}.top-bar-logo{width:100%;height:100%;position:absolute;top:0;text-align:center;inset-inline-start:0}.top-bar-logo img{height:20px}.top-bar-logo>a{display:inline-block;vertical-align:top;position:relative;top:50%;transform:translateY(-50%);text-decoration:none;font-weight:400;font-size:24px;color:var(--topBarText)}.top-bar-logo img{display:block;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto}.top-bar ul{list-style:none}.top-bar li.pop-btn,.top-bar li.top-btn-el{float:left;-webkit-padding-end:5px;padding-inline-end:5px;-webkit-padding-start:5px;padding-inline-start:5px;position:relative}[dir=rtl] .top-bar li.pop-btn,[dir=rtl] .top-bar li.top-btn-el{float:right}@media (min-width:992px){.top-bar li.pop-btn,.top-bar li.top-btn-el{-webkit-padding-end:10px;padding-inline-end:10px;-webkit-padding-start:10px;padding-inline-start:10px}.top-bar .top-bar-notifications.pop-btn{-webkit-padding-end:0;padding-inline-end:0}}.top-bar ul .pop-btn.current,.top-bar ul .top-btn-el.current{border-bottom:3px solid var(--colorAccent)}.top-bar ul .pop-btn.current .top-btn-text,.top-bar ul .top-btn-el.current .top-btn-text{text-shadow:none;box-shadow:none}.top-bar ul li.top-btn-el a{text-decoration:none;color:inherit}.phablet .top-bar-left,.phone .top-bar-left{-webkit-margin-start:-5px;margin-inline-start:-5px}.phablet .top-bar-right,.phone .top-bar-right{-webkit-margin-end:-5px;margin-inline-end:-5px}.top-btn-el.current[data-nav=mobile-menu]{border-bottom-color:transparent!important}.top-btn-el.current[data-nav=mobile-menu] .top-btn-text .icon:before{color:var(--topBarText)!important;content:"\f00d"}.top-bar-right li.pop-btn:last-child,.top-bar-right li.pop-btn:last-child .arrow-down{-webkit-margin-end:0;margin-inline-end:0}.top-btn-create-account,.top-btn-text{display:block;font-weight:400;font-size:1em;height:100%}#menu-fullscreen .btn.top-btn-create-account,.btn.top-btn-create-account:not(.grey):not(.white),.top-btn-text{color:inherit}.top-btn-text{text-decoration:none;color:var(--topBarText)}.top-bar #menu-fullscreen .top-btn-text{color:var(--topBarText)}body.landing .top-btn-text{color:var(--topBarText)}.top-btn-text .icon{-webkit-margin-end:7px;margin-inline-end:7px;position:relative;top:0;display:inline-block;font-size:18px;width:18px;font-size:1.28571429rem;width:1.625rem;line-height:50px;text-align:center}.current .top-btn-text .icon{color:var(--colorAccent)}.top-btn-text .btn-text{-webkit-margin-start:0;margin-inline-start:0}.top-btn-text .arrow-down{position:relative;margin:0 0 0 5px}.top-btn-text .btn-text{vertical-align:top}.top-btn-text .icon{-webkit-margin-end:0;margin-inline-end:0}#menu-fullscreen .top-bar-notifications .btn-text{display:inline-block}#menu-fullscreen #top-bar-user,#menu-fullscreen [data-nav=upload]{display:none}.top-bar-notifications-container{-webkit-margin-end:2px;margin-inline-end:2px;cursor:default}.top-bar-notifications-header{font-size:.93em;line-height:1;padding:12px 10px;overflow:auto}.top-bar-notifications-header,.top-bar-notifications-list li{border-bottom:1px solid var(--menuSeparator)}.top-bar-notifications-header h2{font-size:1em;font-weight:700;float:left}[dir=rtl] .top-bar-notifications-header h2{float:right}.top-bar-notifications-header a{float:right}[dir=rtl] .top-bar-notifications-header a{float:left}.top-bar-notifications-list li{display:block;text-decoration:none;padding:10px;position:relative;min-height:68px;-webkit-padding-start:68px;padding-inline-start:68px}.top-bar-notifications-list li:last-child{border-bottom:0}.top-bar-notifications-list li:hover{background:rgba(0,0,0,.02)}.top-bar-notifications-list li.transition{transition:background-color 150ms linear}.top-bar-notifications-list li.new,.top-bar-notifications-list li.persistent{background:#fffad9}.ie7 .top-bar-notifications-list li{min-height:48px}.top-bar-notifications-list li .user-image{width:48px;height:48px;position:absolute;left:10px;top:10px}.top-bar-notifications-list li .user-image img{width:100%;height:100%;display:block}.top-bar-notifications-list li .user-image span.icon{font-size:48px;width:48px;height:48px;-webkit-margin-start:-24px;margin-inline-start:-24px;margin-top:-24px}.top-bar-notifications-list li .how-long-ago{display:block;font-size:11px;color:var(--bodyTextSubtle)}.top-bar-notifications .top-btn-number{position:absolute;z-index:1;border-radius:100px;zoom:.75;inset-inline-end:-8px;top:10px;visibility:hidden}.top-bar-notifications .top-btn-number.on{visibility:visible}@media (min-width:992px){.top-bar .pop-box{margin:10px;z-index:200}}.top-bar-search-input .icon--close{inset-inline-end:-4px}.top-bar-search-input .icon--settings{inset-inline-end:14px}.top-bar .top-bar-search-input .icon--search{color:var(--colorAccent)}.top-bar-search-input{display:flex;justify-content:center;align-items:center}.top-bar-search-input .input-search{position:relative}.top-bar-search-input input{font-size:1em;border-width:0;-webkit-padding-start:36px;padding-inline-start:36px}.tone-light .top-bar .top-bar-search-input input{border-width:1px}.top-bar-left .pop-box{inset-inline-start:-10px}.top-bar-right .pop-box{inset-inline-start:auto;inset-inline-end:-10px}.top-bar--main .pop-box{top:calc(50% + 10px)}#top-predictive-search.pop-box{width:200px;inset-inline-start:0;font-size:100%}.top-bar .pop-account .or-separator{margin-top:30px;margin-bottom:30px}.top-btn-create-account{text-decoration:none;display:inline;padding:4px 12px;height:26px}.top-bar .opened .top-btn-text span:not(.btn-text),.top-bar .top-btn-text:hover span:not(.btn-text){color:var(--colorAccent)}.phone .top-bar .top-btn-text:hover span:not(.btn-text){color:inherit}.phone .top-bar .current .top-btn-text:hover span:not(.btn-text){color:var(--colorAccent)}.ios .top-bar .top-btn-text span:not(.btn-text):not(.top-btn-number):hover{color:var(--bodyText)}.ios .top-bar .opened .top-btn-text span:not(.btn-text),.ios .top-bar .opened .top-btn-text:not(.top-btn-number){color:var(--colorAccent)}.top-bar .btn:hover:not(.white):not(.grey),.top-bar .btn:not(.white):not(.grey),.top-bar .opened .btn:not(.white):not(.grey){color:#fff}.current .top-btn-create-account:hover{background:inherit}.current .top-btn-create-account{padding:0;background:0 0}.top-btn-number{background:#555;color:#ddd;font-size:12px;font-weight:400;border-radius:3px;padding:0 7px;position:relative;display:block;line-height:22px;height:22px;top:-2px}#menu-fullscreen .top-btn-number{display:inline-block;position:absolute;-webkit-margin-end:5px;margin-inline-end:5px;top:10px;vertical-align:text-bottom;inset-inline-start:30px;inset-inline-end:auto}.opened .top-btn-number.on,.tone-light.ios .top-bar .top-btn-number.on,.tone-light.top-bar .top-btn-number.on,.top-bar .top-btn-text:hover .top-btn-number.on,.top-btn-number.on,.top-btn-number.on:hover{background:#d90000;color:#fff}.pop-account .pop-box-inner{padding:20px 10px;cursor:default}.pop-account .title,.pop-account h2{font-size:1em;text-align:center;margin-top:5px;font-weight:400;display:block}.pop-account .sign-services{margin:15px 0 11px 0}.pop-account input.text-input,.pop-account input[type=password],.pop-account input[type=text]{width:100%}.ie7 .pop-account input.text-input{width:266px;height:auto}.pop-account .checkbox-label{display:inline-block;margin:0}#top-bar-user .top-btn-text .user-image{position:relative;top:50%;margin-top:-13px;width:1em;height:1em;float:left;font-size:26px;background:0 0;color:inherit;-webkit-margin-end:0;margin-inline-end:0}[dir=rtl] #top-bar-user .top-btn-text .user-image{float:right}#top-bar-user-menu.pop-box{width:150px}.header{position:relative}.header-icon{color:var(--colorAccent)}.header-tabs{min-height:50px}.header.follow-scroll{-webkit-margin-end:-10px;margin-inline-end:-10px;-webkit-margin-start:-10px;margin-inline-start:-10px;-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:10px;padding-inline-end:10px;overflow:visible;position:-webkit-sticky;position:sticky;min-height:50px}.header.fixed.follow-scroll{border-bottom:0}.header .header-title,.header h1{font-size:1em}.header>*{vertical-align:middle}.header .header-title,.header .heading,.header .heading *,.header>h1{word-break:break-word}.header-tabs .heading,.header-tabs .heading *,.header-tabs>.header-title,.header-tabs>h1{line-height:50px}.header .header-title,.header .heading,.header>h1{font-size:1.57142857rem;font-weight:400;display:inline-block;color:inherit}.header .header-title a,.header h1 a{color:inherit;text-decoration:none}.header .header-title strong,.header .heading strong,.header h1 strong{font-weight:inherit}.header.header-tabs .header-title,.header.header-tabs h1{-webkit-margin-end:5px;margin-inline-end:5px}.header ul.content-tabs{display:inline-block}.phablet .header ul.content-tabs,.phone .header ul.content-tabs{float:none;display:inline-block;inset-inline-start:10px;inset-inline-end:10px;position:absolute;z-index:1;white-space:nowrap}.phablet .header.follow-scroll ul.content-tabs,.phone .header.follow-scroll ul.content-tabs{position:absolute;-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:10px;padding-inline-end:10px}.phablet .header:not(.follow-scroll) ul.content-tabs,.phone .header:not(.follow-scroll) ul.content-tabs{top:auto}.header-content-left{float:left}[dir=rtl] .header-content-left{float:right}.header-content-right{float:right;height:auto;-webkit-margin-start:auto;margin-inline-start:auto}[dir=rtl] .header-content-right{float:left}@media (max-width:340px){.header-content-right.breaks-ui{clear:both;position:static!important;-webkit-margin-start:0;margin-inline-start:0}}.phablet .header-content-right:not(.phablet-float-none),.phone .header-content-right:not(.phone-float-none){position:absolute;inset-inline-end:0;top:0;float:right}[dir=rtl].phablet .header-content-right:not(.phablet-float-none),[dir=rtl].phone .header-content-right:not(.phone-float-none){float:left}.header-content-right .number-figures{margin-top:14px;-webkit-border-start:1px solid var(--bodySeparator);border-inline-start:1px solid var(--bodySeparator)}.header-content-right .number-figures:first-child{-webkit-border-start:0;border-inline-start:0}.header .header-link{font-size:1em;display:inline-block}.header .pop-btn.breadcrum-item{margin-top:0}.header .user-image{font-size:30px;width:1em;height:1em;margin-top:10px;float:left}[dir=rtl] .header .user-image{float:right}.header.header-content{position:relative;min-height:40px;border:0}.header.header-content .heading,.header.header-content .heading *{line-height:40px;height:40px}.header-content img{max-height:40px}.header-content .user-image{width:1em;height:1em;font-size:40px;margin-top:0;top:0}.header .user-image img,.header-content .user-image img{width:100%;height:100%;display:block}.header-description{line-height:1.4;max-height:10vh;overflow-y:scroll;overflow:auto}.header-description:empty{display:none}.header-description p{margin:10px 0}.header-content-breadcrum{float:left}[dir=rtl] .header-content-breadcrum{float:right}.breadcrum-item :not(.btn){line-height:normal}.breadcrum-text,.header-content-breadcrum .breadcrum-item{line-height:40px}.breadcrum-text,.breadcrum-text a{color:inherit}.breadcrum-text{font-weight:400}.breadcrum-item{-webkit-margin-end:5px;margin-inline-end:5px;position:relative;float:left}[dir=rtl] .breadcrum-item{float:right}.breadcrum-text a:hover{color:var(--linkText);text-decoration:none}.breadcrum-text .user-link{-webkit-margin-start:5px;margin-inline-start:5px}.header-content-breadcrum .arrow,.header-content-breadcrum .arrow-down,.header-content-breadcrum .arrow-right{-webkit-margin-start:5px;margin-inline-start:5px;position:relative}.header-content-breadcrum a:hover .arrow-down{border-top-color:var(--linkText)}.header-content-breadcrum a:hover .arrow-right{border-left-color:var(--linkText)}.header-content-breadcrum .pop-box h2{font-size:1.07em;line-height:1.2}.header-content-breadcrum .pop-box h2 a{line-height:1}.btn-container [dir=rtl] .header-content .btn{float:right}.header-content .btn:last-child{-webkit-margin-end:0;margin-inline-end:0}.follow-scroll{-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;z-index:1}.follow-scroll-wrapper{left:0;right:0;z-index:50}.follow-scroll-wrapper.position-fixed .header{margin-bottom:-1px!important}.follow-scroll-placeholder{-webkit-backface-visibility:hidden;backface-visibility:hidden}.phablet .header:not(.header-tabs) .tab-menu,.phone .header:not(.header-tabs) .tab-menu{color:var(--buttonDefaultText);background:var(--buttonDefaultBackground);border-radius:4px;height:auto;line-height:1em;min-height:1em;padding:10px}.phablet .header:not(.header-tabs) .tab-menu:not(.--hide),.phone .header:not(.header-tabs) .tab-menu:not(.--hide){color:var(--buttonDefaultHoverText);background:var(--buttonDefaultHoverBackground);margin-bottom:10px}.phablet .header .tab-menu.--hide .tab-menu--show,.phablet .header .tab-menu:not(.--hide) .tab-menu--hide,.phone .header .tab-menu.--hide .tab-menu--show,.phone .header .tab-menu:not(.--hide) .tab-menu--hide{display:none}.tab-menu--hide,.tab-menu--show{-webkit-margin-start:2.5px;margin-inline-start:2.5px}.tab-menu{cursor:pointer;line-height:50px;min-height:50px}.tab-menu.--hide .btn-icon[data-content=tab-icon]{color:var(--colorAccent)}.tab-menu.--hide{color:var(--buttonDefaultText)}.tab-menu:not(.--hide){color:var(--buttonDefaultHoverText)}.content-tabs-container{position:relative;display:inline-block}.phablet .content-tabs-container--mobile,.phone .content-tabs-container--mobile{box-shadow:0 6px 4px rgba(0,0,0,.25);inset-inline-start:-10px;width:100%;width:100dvw}.phablet .content-tabs-wrap,.phone .content-tabs-wrap{height:50px;overflow-y:hidden;position:relative;-webkit-overflow-scrolling:touch;overflow-x:scroll;position:relative;display:none;-webkit-backdrop-filter:blur(17.5px);backdrop-filter:blur(17.5px);background:var(--bodyBackground);padding-left:10px;padding-right:10px}.content-tabs-wrap::-webkit-scrollbar{display:none}.content-tabs-wrap{display:inline-block;-ms-scroll-snap-type:x mandatory;scroll-snap-type:x mandatory}.content-tabs li{scroll-snap-align:start}.content-tabs li:not(.current){transition-duration:.2s;transition-property:background-color}.content-tabs a{font-weight:400;color:inherit;text-decoration:none;-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:10px;padding-inline-end:10px}.phone .content-tabs li:last-child{-webkit-margin-end:15px;margin-inline-end:15px}.content-tabs-shade{content:" ";background:-webkit-linear-gradient(0deg,rgba(255,255,255,0),var(--bodyBackground));width:15px;height:100%;position:absolute;inset-inline-end:0;top:0;pointer-events:none;z-index:2}[dir=rtl] .content-tabs-shade{background:-webkit-linear-gradient(180deg,rgba(255,255,255,0),var(--bodyBackground))}.phablet .content-tabs a,.phone .content-tabs a{color:var(--menuItemText)}.content-tabs li.disabled a{cursor:default}.tab-menu .--show{display:none}.tab-menu.current .--show{display:inline-block}.tab-menu.current .--hide{display:none}.content-tabs li{float:left;font-size:1em}[dir=rtl] .content-tabs li{float:right}.phablet .content-tabs li,.phone .content-tabs li{float:none;border-bottom:0;display:inline-block}.content-tabs-vertical li{float:none;margin:0;-webkit-border-start:2px solid transparent;border-inline-start:2px solid transparent}.content-tabs-vertical li>*{-webkit-padding-end:20px;padding-inline-end:20px;-webkit-padding-start:20px;padding-inline-start:20px}.header-content-right .content-tabs li{-webkit-margin-start:10px;margin-inline-start:10px;-webkit-margin-end:0;margin-inline-end:0}.content-tabs a,.content-tabs li,.content-tabs-wrap{height:50px;line-height:50px;display:block;border:0}.content-tabs-vertical a,.content-tabs-vertical li{height:38px;line-height:38px}.content-tabs li.current,.content-tabs li.visited,.content-tabs li.visited:hover{border-color:var(--colorAccent);border-style:solid;border-bottom-width:3px}.content-tabs li.current .btn-icon{color:var(--colorAccent)}.content-tabs li:not(.current):hover{background:var(--bodyEmpty)}.content-tabs li:not(.current):hover a .btn-icon{color:var(--colorAccent)}.content-tabs li.disabled:hover{border-bottom:0}.content-tabs li.current{border-color:var(--colorAccent)}.content-tabs li.visited{border-bottom-color:transparent}.content-tabs li.current.visited{border-color:#d93600}.content-tabs li.visited,.content-tabs li.visited a{color:#d93600}.content-tabs-vertical li.current,.content-tabs-vertical li:hover{border-bottom-width:0;border-left-width:2px}.content-tabs .tab-count{font-weight:400;color:var(--bodyTextSubtle)}.content-tabs .tab-count-block{font-weight:400;background:#d90000;border-radius:3px;padding:1px 4px;position:relative;top:-1px}.content-tabs .current .tab-count-block,.content-tabs .tab-count-block{color:#fff}.content-tabs li.disabled *{color:var(--bodyTextDisabled)}.header--centering{display:flex;align-items:center;flex-wrap:wrap}.header--height{overflow:visible;height:50px}.list-selection *{line-height:normal}#tabbed-content-group{margin-top:20px;padding-bottom:20px;position:relative}.content-listing .viewer-kb{opacity:0;position:fixed;bottom:-100px;z-index:1;left:0;right:0;background:linear-gradient(0deg,var(--topBarBackground) 0,rgba(0,0,0,0) 100%)}.--has-selection .content-listing.visible .viewer-kb{opacity:1;bottom:0}.content-listing .viewer-kb-input{color:var(--menuText);background:var(--menuBackground);border-radius:.5em;margin:1em;-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);box-shadow:0 4px 14px rgb(0 0 0 / 25%)}#content-listing-tabs #tabbed-content-group{margin-top:0}#content-listing-tabs{padding-bottom:0;-webkit-margin-start:-10px;margin-inline-start:-10px;-webkit-margin-end:-10px;margin-inline-end:-10px}.tabbed-content{display:none;width:100%;overflow:hidden}.title{font-size:.93em;font-weight:700;margin-bottom:5px}.title.grid-columns{-webkit-margin-end:10px;margin-inline-end:10px;text-align:end;line-height:2}.phablet .title.grid-columns,.phone .title.grid-columns{-webkit-margin-end:0!important;margin-inline-end:0!important;text-align:start}.tabbed-content-section{overflow:auto}.tabbed-content-list{line-height:1.8}.tabbed-listing .tabbed-content{overflow:hidden}.table-li{display:table;width:100%}.table-li>li{padding-top:8px;padding-bottom:8px;border-bottom:1px solid var(--bodySeparator);list-style:none!important}.tabbed-content-list.table-li-hover>li:hover{background:var(--bodyEmpty)}.tabbed-content-list .table-li-header{font-weight:700}.tabbed-content-list.table-li-hover .table-li-header:hover{background:0 0}.table-li ul li:last-child{border-bottom:none}.desktop .table-li--mobile-display,.laptop .table-li--mobile-display,.largescreen .table-li--mobile-display,.phablet .table-li--mobile-display,.tablet .table-li--mobile-display{display:none!important}.viewer-title{flex-grow:1;order:2;font-size:1.57142857rem;line-height:1.43em;-webkit-padding-end:2em;padding-inline-end:2em}.panel-description:empty{display:none;margin:0!important;padding:0!important}.panel-description .description-text{font-size:1em;line-height:1.6em}.panel-description .description-meta{font-size:.93em}.panel-description .exif-meta{-webkit-padding-start:1.57em;padding-inline-start:1.57em;position:relative}.panel-description .exif-meta .camera-icon{color:var(--bodyTextDisabled);position:absolute;inset-inline-start:0;top:.21em;font-size:1.14em}.panel-description .exif-meta .exif-data{display:block;font-size:1em}.panel-thumbs{z-index:1;bottom:0;left:0;right:0;background:var(--viewerBackground)}.panel-thumb-list{overflow-x:auto;overflow-y:hidden;white-space:nowrap;text-align:center;height:50px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto}.panel-thumb-list:empty{display:none}.panel-thumb-list li{position:relative;font-size:0;border-top:3px solid transparent;display:inline-block;line-height:50px}.panel-thumb-list li.current{border-color:var(--colorAccent)}.list-item-desc .panel-thumb-list li:hover img,.panel-thumb-list li.current img{opacity:1}.phablet .panel-thumb-list li.more-link,.phone .panel-thumb-list li.more-link{clear:both;line-height:100%;padding:10px 0}.panel-thumb-list a{display:block;line-height:0}.panel-thumb-list img{display:block;width:47px;height:47px;opacity:.4;transition:opacity 350ms ease}.panel-thumb-list li:hover img{opacity:1}.panel-share-item{margin-bottom:30px}.panel-share-item:last-child{margin-bottom:0}.panel-share-item .pre-title{-webkit-padding-start:200px;padding-inline-start:200px;line-height:20px;margin-bottom:10px;padding-bottom:10px;border-bottom:1px solid var(--bodySeparator);font-weight:700}.phablet .panel-share-item .pre-title,.phone .panel-share-item .pre-title{-webkit-padding-start:0;padding-inline-start:0}.panel-share-item .title{line-height:36px;-webkit-margin-after:0;margin-block-end:0}.panel-share-item .grid-columns{position:relative}.panel-share-input-label{margin-bottom:10px;overflow:auto}.panel-share-input-label:last-child{margin-bottom:0}.panel-share-input{position:relative}.panel-share-networks{overflow:auto;text-align:center}.panel-share-networks h4.title{line-height:32px}.panel-share-networks li{display:inline-block;-webkit-margin-end:5px;margin-inline-end:5px;margin-bottom:5px}.panel-share-networks li a{display:block;width:32px;height:32px;position:relative}.panel-report h4.title{line-height:36px}.text-content{font-size:16px}.text-content li,.text-content p{line-height:160%;margin:10px 0}.text-content h1,.text-content h2,.text-content h3,.text-content h4{margin:40px 0 20px 0;font-weight:400;line-height:120%}.text-content h1{font-size:1.375em}.text-content h2{font-size:1.25em}.text-content h3{font-size:1.125em}.text-content h4{font-size:1.07em}.text-content h5{font-size:1em}.text-content h6{font-size:1em}.text-content ol,.text-content ul{-webkit-margin-start:20px;margin-inline-start:20px}.text-content li{list-style:disc outside;margin-top:0;margin-bottom:0}.form-content{position:relative;margin-top:20px}.form-content .input-label:first-child{margin-top:0}.signup-services-column h2{font-size:17px}.signup-services-column ul{margin:10px 0}.signup-services-column li:first-child{-webkit-margin-start:0;margin-inline-start:0}.signup-services-column li:last-child{-webkit-margin-end:0;margin-inline-end:0}.form-content .content-tabs-vertical{-webkit-margin-end:10px;margin-inline-end:10px;position:absolute;inset-inline-start:0;top:0}.form-content .content-tabs-vertical.position-fixed{position:fixed;inset-inline-start:auto;top:auto}.tabbed-input-column{-webkit-margin-start:200px;margin-inline-start:200px}.phablet .tabbed-input-column,.phone .tabbed-input-column{-webkit-margin-start:0;margin-inline-start:0}.account-link{position:relative}a.account-linked-profile{width:48px;height:48px;display:block}a.account-linked-profile img{width:100%;height:100%;display:block;border:0}.text-overflow-ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}html.menu-fullscreen-visible{overflow:hidden}#menu-fullscreen{position:fixed;left:0;top:50px;bottom:0;right:0;height:calc(100vh - 50px);height:calc(100dvh - 50px);width:100vw;width:100dvw;overflow:auto}#menu-fullscreen .menu-hide{display:none}#menu-fullscreen .fullscreen{top:50px;height:calc(100% - 50px)}#menu-fullscreen>ul>li{display:block;float:none;border-bottom:0;margin:0!important;position:relative}#menu-fullscreen>ul>li .top-btn-text{padding:0 5px;background:inherit}#menu-fullscreen>ul>li .icon{-webkit-margin-end:7px;margin-inline-end:7px}#menu-fullscreen>ul>li .input-search .icon{-webkit-margin-end:0;margin-inline-end:0}#menu-fullscreen>ul>li a{text-decoration:none}#menu-fullscreen .input-search{-webkit-margin-start:5px;margin-inline-start:5px;top:10px;width:auto}#menu-fullscreen .input-search .search{border-radius:0;-webkit-padding-end:50px;padding-inline-end:50px;-webkit-padding-end:3.12rem;padding-inline-end:3.12rem}#menu-fullscreen .menu-fullscreen-show{display:block}#menu-fullscreen .menu-fullscreen-hide{display:none}body.upload-box-visible{margin-top:300px}body.upload-box-visible.no-margin-top{margin-top:280px}body.upload-box-visible .upload-box{display:block}.upload-box{clear:both;background:var(--bodyBackground)}.upload-box--fixed{position:fixed;left:0;right:0;z-index:200;background:var(--bodyBackground)}body:not(#upload) .upload-box--fixed{padding-top:50px;overflow:auto}.phone .upload-box--fixed{top:0;z-index:500;max-height:100%;overflow-y:auto;overflow-x:hidden}.upload-box--hidden{transform:translateY(-100%);top:-1px}.upload-box--show{transform:translateY(0)}.upload-box-inner{padding:40px 0;position:relative}.phone .upload-box-inner{padding:20px 0}.upload-box-inner .position-absolute{position:absolute;text-transform:uppercase;top:20px;line-height:20px}#upload .upload-box[data-queue-size="0"] .upload-box-heading,.phone .upload-box[data-queue-size="0"] .upload-box-heading{position:fixed;top:50%;left:0;right:0;transform:translateY(-50%);padding:10px}.upload-box-heading{text-align:center}.upload-box-heading .icon{font-size:100px;height:1em;display:inline-block;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;text-decoration:none;-webkit-tap-highlight-color:transparent}.upload-box-heading .heading,.upload-box-heading h2{font-size:26px;margin:10px 0;display:block}.upload-box-heading .heading a,.upload-box-heading h2 a{color:inherit;text-decoration:none}.upload-box-status a{display:inline-block}.upload-box-status-text{font-size:1em;line-height:1.4}.upload-box-allowed-files{inset-inline-start:0;font-size:11px;font-size:.79rem;color:var(--bodyTextSubtle)}.upload-box-close{text-decoration:none;inset-inline-end:0;font-size:11px;line-height:11px;font-size:.79rem;line-height:1em;color:var(--bodyText)}.upload-box-close:hover{text-decoration:none}.upload-box-close a{color:inherit;text-decoration:none}.upload-box-close .btn-icon{font-size:.9em;display:inline}@media (min-width:380px){.upload-input-col{width:350px}}.page-not-found{border-radius:10px;background:var(--bodyEmpty);text-align:center;padding:30px;font-size:16px;margin-top:20px}.page-not-found h1{font-size:30px;margin-bottom:10px}.page-not-found .input-search{-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;margin-top:20px}.page-not-found .input-search .icon--search{font-size:20px;inset-inline-start:14px;top:8px}.page-not-found .input-search .icon--close{top:3px;inset-inline-end:6px}.page-not-found input.search{height:36px;width:100%;font-size:15px;-webkit-padding-end:30px;padding-inline-end:30px;-webkit-padding-start:40px;padding-inline-start:40px}.ie7 .page-not-found input.search,.ie8 .page-not-found input.search,.ie9 .page-not-found input.search{-webkit-padding-end:10px;padding-inline-end:10px;line-height:36px}.content-listing{overflow:hidden;position:relative;clear:both}.pad-content-listing{width:calc(100% + 10px);-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:relative}.list-item{display:inline-block;position:relative}.js .content-listing{opacity:0}.js .jsly.content-listing{opacity:1}.list-item .disabled-mask{width:100%;height:100%;position:absolute;top:0;inset-inline-start:0;background:rgba(255,255,255,.5);z-index:1}.list-item:hover .hover-display,.phablet .list-item .hover-display,.phone .list-item .hover-display{display:block}.list-item.masked:hover .hover-display{display:none}.list-item .hover-display,html.--idle .list-item .hover-display:not(.idle-display),html.--idle .list-item-image-tools>div{opacity:0;transition:all 350ms ease}html:not(.--idle) .list-item:hover .hover-display{opacity:1}.phablet .list-item .hover-display,.phone .list-item .hover-display{opacity:1;transition:none}.list-item-image{position:relative;display:block;overflow:hidden;min-height:260px;text-align:center;background:var(--bodyEmpty);content-visibility:auto;contain:layout style paint}.list-item-image .image-container{display:inline-block;text-align:center;vertical-align:bottom;text-decoration:none;font-size:64px;width:100%;height:100%}.js .list-item-image .image-container.--media{width:100%;height:100%}.list-item-image .image-container .media,.list-item-image .image-container img,.list-item-image .image-container svg,.list-item-image .image-container video{display:block;position:relative;width:100%!important;height:100%;-o-object-fit:cover;object-fit:cover}.list-item-image .image-container .icon.empty{font-size:1em;opacity:.25}.list-item-image .image-container .empty{color:var(--bodyText);text-decoration:none}.selected .list-item-image .image-container .icon.empty,.ui-selecting .list-item-image .image-container .icon.empty{color:#fff}.list-item-image-btn{padding:5px 8px 5px 28px;font-size:.93em;background:var(--bodyBackground);position:absolute;top:10px;cursor:pointer;border-radius:2px}.list-item-image-btn.list-image-like-btn{inset-inline-start:10px}.list-item-image-btn span{font-size:15px;position:absolute;inset-inline-start:8px;top:50%;margin-top:-8px}.ie7 .list-item-image-btn span{inset-inline-start:4px;top:2px}.list-item-image-btn:hover span{color:var(--colorAccent)}.list-item-image-btn.liked{background:var(--colorAccent);color:#fff;display:block}.list-item-image-btn.liked:hover{background:#d90000}.list-item-image-btn.liked:hover span.icon-like{font-size:11px;padding:0;inset-inline-start:10px;color:#fff;margin-top:-6px}.list-item-image-btn.liked:hover span.icon-like:before{content:"\e01f"}.list-item-desc-title{width:100%;height:100%;padding:0 10px;inset-inline-start:0;bottom:10px;text-decoration:none}.list-item-desc-title>*{padding-bottom:5px;margin-bottom:-2.5px;-webkit-padding-start:5px;padding-inline-start:5px;-webkit-margin-start:-5px;margin-inline-start:-5px}.list-item-from{bottom:0;line-height:1}.phablet .content-listing:not([data-list=users]).list-item-desc-title,.phone .content-listing:not([data-list=users]).list-item-desc-title{display:none}.list-item-desc-title--center-y{top:50%;transform:translateY(-50%)}.list-item-desc-title-link{font-size:1.1em;font-weight:600;display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:calc(100%)}@media (min-width:320px){.list-item-desc-title-link{width:calc(100% - 20px)}}.list-item-title{padding-top:0;padding-bottom:0;font-weight:400;text-align:center;height:40px;overflow:hidden}.list-item-title,.list-item-title *{font-size:1em;line-height:40px}.list-item-title a{font-weight:400;color:var(--bodyText)}.list-item-alt{background:#f9f9f9}.list-item-desc-height{height:100%}.list-item-overflow{height:110%;overflow:hidden}.list-item-desc{width:100%;font-size:.93em;line-height:1;box-shadow:0 1px 0 rgba(0,0,0,.1),0 0 0 transparent;border-bottom:1px solid rgba(0,0,0,.2)}.list-item-desc a,.list-item-desc b,.list-item-desc strong,.list-item.masked:hover .list-item-desc a,.list-item.masked:hover .list-item-title a{color:inherit}.list-item:hover .list-item-desc a,.list-item:hover .list-item-title a{color:var(--linkText)}.list-item-desc .user,.list-item-desc a.user img{border-radius:100%}.list-item-desc .user{float:left;margin-top:-20px;-webkit-margin-end:8px;margin-inline-end:8px;padding:3px;background:var(--bodyBackground);width:50px;height:50px}[dir=rtl] .list-item-desc .user{float:right}.list-item-desc .user:hover{background:var(--linkText)}.phablet .content-listing[data-list=images] .list-item-desc,.phone .content-listing[data-list=images] .list-item-desc{display:none}.list-item-desc strong{display:block}.list-item-card{border-radius:3px;min-height:82px}.list-item-card .user-image{display:block}.list-item-thumbs-container{overflow:hidden}.list-item-thumbs{overflow:auto;background:#f9f9f9;width:101%;margin-top:2px;margin-bottom:0;-webkit-margin-start:-1px;margin-inline-start:-1px}.list-item-thumbs li{background:#f6f6f6;-webkit-border-end:1px solid;border-inline-end:1px solid;-webkit-border-start:1px solid;border-inline-start:1px solid;border-color:#fff;float:left}[dir=rtl] .list-item-thumbs li{float:right}.list-item-desc{color:inherit;background:0 0;border:0;box-shadow:none;text-shadow:1px 1px 5px rgba(0,0,0,.5);opacity:0;transition:all 350ms ease;bottom:5px;position:absolute}.desktop .list-item .list-item-desc,.laptop .list-item .list-item-desc,.largescreen .list-item .list-item-desc,.list-item:hover .list-item-desc,.phablet .list-item .list-item-desc,.phone .list-item .list-item-desc,.tablet .list-item .list-item-desc{opacity:1}.list-item-desc *,.list-item-desc a,.list-item:hover .list-item-desc a{color:var(--listItemText)}.list-item-desc .list-item-overflow{bottom:0;inset-inline-start:0;padding:10px;position:absolute;height:auto}.content-listing-loading,.content-listing-more{text-align:center;margin:20px 0}.content-listing-more{display:none}.content-listing-loading{height:32px}.content-listing-loading .loading-indicator{position:static}.content-listing-pagination{text-align:center;font-size:1.3em;padding:0;color:inherit;font-weight:400;margin-top:20px}.js .content-listing-pagination{display:none}.content-listing-pagination.visible{display:flex!important}.content-listing-pagination a{text-decoration:none;font-weight:inherit;color:inherit;padding:.3em 1em;display:inline-block;border-radius:4px}.content-listing-pagination li.pagination-prev{text-align:end}.content-listing-pagination li.pagination-next{text-align:start}.content-listing-pagination a:hover{color:var(--linkText);background:var(--bodyEmpty)}.content-listing-pagination a.current{color:inherit}.phone .content-listing-pagination li.pagination-page{display:none}.content-listing-pagination li,.phone .content-listing-pagination li.pagination-page.pagination-current{display:inline-block}.content-listing-pagination li.pagination-next,.content-listing-pagination li.pagination-prev{flex-grow:4}.content-listing-pagination li.pagination-current{flex-grow:1}.content-listing-pagination .pagination-current a,.content-listing-pagination .pagination-current a:hover{color:inherit;background:initial;cursor:default}.pagination-disabled{visibility:hidden}.content-empty{padding:4em 2em;text-align:center;font-size:inherit;color:var(--bodyTextSubtle)}.content-empty .icon{color:var(--bodyTextSubtle);font-size:90px;width:90px;height:90px;display:inline-block}.content-empty .message,.content-empty h2{font-size:16px;margin-top:10px;line-height:160%}.sort-listing{display:none}.sort-listing .selection-count:before{content:" (";white-space:pre}.sort-listing .selection-count:after{content:")"}.disabled.sort-listing .selection-count:after,.disabled.sort-listing .selection-count:before{display:none}.user-image{display:inline-block}.user-image path{fill:red}.user-image,.user-image img{display:block}.default-user-image{color:var(--bodyText);text-align:center;position:relative;border-radius:100%;-webkit-backdrop-filter:blur(17.5px);backdrop-filter:blur(17.5px);background:var(--bodyBackground)}.checkered-background{background-image:linear-gradient(45deg,rgba(0,0,0,.1) 25%,transparent 25%),linear-gradient(135deg,rgba(0,0,0,.1) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,rgba(0,0,0,.1) 75%),linear-gradient(135deg,transparent 75%,rgba(0,0,0,.1) 75%);background-size:25px 25px;background-position:0 0,12.5px 0,12.5px -12.5px,0 12.5px}.default-user-image .icon{color:inherit;position:absolute;inset-inline-start:50%;top:50%;display:block;line-height:100%;font-size:1em;width:1em;height:1em;-webkit-margin-start:-.5em;margin-inline-start:-.5em;margin-top:-.5em}.default-user-image.size-70,img.user-image.size-70{width:70px;height:70px}.default-user-image.size-70 .icon{font-size:38px;-webkit-margin-start:-19px;margin-inline-start:-19px;margin-top:-19px}.default-user-image.size-60,img.user-image.size-60{width:60px;height:60px}.default-user-image.size-60 .icon{font-size:32px;-webkit-margin-start:-16px;margin-inline-start:-16px;margin-top:-16px}.default-user-image.size-40,img.user-image.size-40{width:40px;height:40px}.default-user-image.size-40 .icon{font-size:22px;-webkit-margin-start:-11px;margin-inline-start:-11px;margin-top:-11px}.user-social-networks{font-size:1em;margin-bottom:5px}.user-social-networks,.user-social-networks a{text-decoration:none;color:var(--bodyTextSubtle)}.user-social-networks a{padding:2px}.user-social-networks a:hover{color:var(--bodyText)}.top-user{position:relative;height:110px;margin-top:10px;margin-bottom:10px;height:auto;min-height:100px}.top-user.no-background{min-height:160px}.top-user>div{position:absolute;top:0}.top-user .top-user-credentials{position:static;-webkit-padding-end:220px;padding-inline-end:220px;clear:both;overflow:visible}.top-user.user-has-no-background .top-user-credentials{overflow:auto}.phone .top-user .top-user-credentials{-webkit-padding-end:0;padding-inline-end:0;-webkit-padding-start:0;padding-inline-start:0;width:100%;margin-bottom:10px;text-align:center;margin-top:-160px}.top-user-avatar{font-size:160px;z-index:500}a.top-user-avatar{display:block}.phone .top-user-avatar{position:relative}.top-user-avatar{position:absolute;left:0}.phablet .top-user:not(.no-background) .top-user-avatar,.tablet .top-user:not(.no-background) .top-user-avatar{top:calc(-.4em - 10px)}.top-user{-webkit-padding-start:190px;padding-inline-start:190px}.desktop .top-user:not(.no-background),.laptop .top-user:not(.no-background),.largescreen .top-user:not(.no-background),.phone .top-user{-webkit-padding-start:0;padding-inline-start:0}.desktop .top-user:not(.no-background) .top-user-avatar,.laptop .top-user:not(.no-background) .top-user-avatar,.largescreen .top-user:not(.no-background) .top-user-avatar{position:absolute;left:50%;-webkit-margin-start:calc(-.5em - 10px);margin-inline-start:calc(-.5em - 10px);top:calc(-.5em - 10px)}.phablet .top-user .user-image,.tablet .top-user .user-image{border:0;-webkit-margin-end:10px;margin-inline-end:10px}.top-user .user-image{font-size:1em;width:1em;height:1em;float:left}.header .user-image img,.header-content .user-image img,.top-user .user-image,.user-image,.user-image img{border-radius:50%;-o-object-fit:cover;object-fit:cover}.top-user:not(.no-background) .user-image{border:10px solid var(--bodyBackground)}.top-user:not(.no-background) img.user-image{background:var(--bodyBackground);border:10px solid transparent;box-sizing:content-box}.phone .top-user.no-background .top-user-credentials{margin-top:initial}.phone .top-user .top-user-credentials>a{display:inline-block}.top-user .header-content-right{inset-inline-end:0}.top-user .header-content-right>*{margin-bottom:10px}.top-user .header-content-right>:last-child{margin-bottom:0}.phone .top-user .header-content-right{position:relative}.phone .top-user .header-content-right>div{margin:10px auto;text-align:center}.phone .top-user .input-search{position:relative;top:auto}.phone .top-user .input-search form{position:relative}.top-user h1{font-size:1.8575em;font-weight:700;margin-bottom:5px;margin-top:10px;color:var(--bodyText)}.no-margin-top .top-user h1,.phone .top-user h1{margin-top:0}.top-user h1 a{color:inherit;text-decoration:none}.top-user .user-meta{margin-bottom:5px}.user-meta .icon--lock{-webkit-margin-end:5px;margin-inline-end:5px}[dir=rtl] .top-user .user-image{float:right}.phone .top-user .user-image{float:none;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;margin-bottom:10px}.phone body.no-margin-top .top-user .user-image{margin-top:10px}.top-user .user-image.no-border{border:none}.top-user .number-figures{margin-top:0}.user-card.avatar{-webkit-padding-start:70px;padding-inline-start:70px}.user-card.no-avatar{-webkit-padding-start:0;padding-inline-start:0}.user-card .or-separator{margin-top:5px;margin-bottom:5px}.user-card .user-link{font-size:.93em}.user-card-header h2{font-size:15px;font-weight:400;margin-top:0;margin-bottom:2px}.user-card-header h2 a{color:inherit;text-decoration:none}.user-card-header div{color:var(--bodyTextSubtle)}.user-card-footer{overflow:hidden}.user-card-footer .user-social-networks{margin-top:3px}.top-user .input-search .icon--close{right:.5rem;top:50%;transform:translate(0,-50%)}.ad-space{text-align:center}.ad-margin-vertical{margin-top:20px;margin-bottom:20px}.ad-margin-horizontal{-webkit-margin-start:20px;margin-inline-start:20px;-webkit-margin-end:20px;margin-inline-end:20px}[role=menu]{position:relative;overflow:visible}.menu-box,[role=menu]>.menu-box{z-index:300}[role=menu]>.menu-box{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;max-height:10px;display:block;visibility:hidden;transition:350ms all ease-in-out;opacity:0;transform:translateY(-5px);transform-origin:top;max-height:100vh;max-height:100dvh}[role=menu].opened>.menu-box{visibility:visible;opacity:1;transform:translateY(0)}@media (min-width:768px){[role=menu]>.menu-box{transition:none}}.menu-box{border:0}.menu-box,.menu-box .menu-box-sub>.sub,.menu-box .menu-box-sub>ul{background:var(--bodyBackground);border-radius:3px;box-shadow:0 0 15px 0 rgba(0,0,0,.2);color:var(--bodyText);font-size:14px;font-weight:400;position:absolute;top:100%;list-style:none;min-width:190px;padding:0;margin:0}.menu-box--static{position:static;max-width:190px}.menu-box :not(a),.menu-box [role*=button]{color:var(--bodyText)}.menu-box ul{margin:0;padding:0}.float-left .menu-box,.pull-left .menu-box,menu-box.anchor-left{inset-inline-start:0}.float-right .menu-box,.menu-box--anchor-right,.pull-right .menu-box{inset-inline-end:0}.menu-box .separator,.menu-box [role=separator],.menu-box hr{display:block;margin:0;padding:0;height:0;border:0;border-top:1px solid #ebebeb}.menu-box--border-separators>*{border-bottom:1px solid #ebebeb}.menu-box--border-separators>:last-child{border-bottom:0}.menu-box--border-separators>hr{display:none}.menu-box .sub,.menu-box [role*=button],.menu-box [role=box],.menu-box li{padding:10px;list-style:none;position:relative;line-height:1.4;clear:both;min-height:40px;display:block}.menu-box [role=box]{cursor:default}.menu-box [role*=button]{-webkit-padding-start:35px;padding-inline-start:35px;-webkit-border-start:2px solid transparent;border-inline-start:2px solid transparent;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;text-align:start}.menu-box--multiline [role*=button]{white-space:normal}.menu-box--noicons li:not([role=button]){-webkit-padding-start:0;padding-inline-start:0}.menu-box--noicons [role=button]{-webkit-padding-start:10px;padding-inline-start:10px;color:inherit}.menu-box [role=button]:hover{border-left-color:#a66bbe}.menu-box .disabled[role=button]{cursor:not-allowed;background:0 0;border-color:transparent!important;opacity:.5}.menu-box li.menu-box-sub{-webkit-padding-end:34px;padding-inline-end:34px}.menu-box .menu-box-sub>.sub,.menu-box .menu-box-sub>ul{display:none}.menu-box .menu-box-sub:hover>.sub,.menu-box .menu-box-sub:hover>ul{display:block}.menu-box [role*=button]>.icon,.menu-box li>.icon{font-size:16px;width:16px;height:16px;text-align:center;position:absolute;inset-inline-start:8px;top:50%;margin-top:-8px}.menu-box .menu-box-sub>.icon{inset-inline-start:auto;inset-inline-end:10px}.menu-box .menu-box-sub .sub,.menu-box .menu-box-sub ul{cursor:default;position:absolute;top:0;inset-inline-start:100%}.menu-box .meta{font-size:.93em;display:block}.menu-box .empty{font-size:1em;text-align:center;padding:40px 20px}.menu-box .empty>.icon{font-size:64px;margin-bottom:10px;display:block;color:#ebebeb;position:static}.arrow-navigator a{color:var(--colorAccent);display:block;text-decoration:none;text-align:center;height:40px;width:40px;position:absolute;top:50%;margin-top:-20px;opacity:.7;padding:10px}.arrow-navigator a.disabled{display:none}.arrow-navigator a:hover{opacity:1}.arrow-navigator a span{display:inline-block;font-size:20px;width:1em;height:1em;text-align:center}.growl{word-break:break-word;color:var(--alertText);font-size:1.1em;line-height:1.2;background:var(--alertBackground);padding:1em;-webkit-padding-end:2em;padding-inline-end:2em;text-align:center;overflow:visible;position:fixed;width:630px;inset-inline-start:50%;top:45px;z-index:9999;cursor:default;-webkit-border-start:5px solid var(--alertAccent);border-inline-start:5px solid var(--alertAccent);box-shadow:0 0 15px 5px rgba(0,0,0,.15);border-radius:4px;-webkit-margin-start:-315px;margin-inline-start:-315px}.growl:empty{display:none}.phone .growl{left:10px;right:10px;width:auto;-webkit-margin-start:auto;margin-inline-start:auto}.growl.static{-webkit-margin-start:auto;margin-inline-start:auto;position:static;-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:30px;padding-inline-end:30px;box-shadow:none;z-index:initial;margin:auto;width:auto}.growl.static.inline{margin:initial;text-align:start;display:inline-block;-webkit-padding-end:1em;padding-inline-end:1em;-webkit-padding-start:1em;padding-inline-start:1em}.growl .icon{font-size:14px;text-align:center;position:absolute;inset-inline-end:5px;top:7px;cursor:pointer;padding:10px;color:var(--alertText)}.growl-debug-message{text-align:start}.growl-debug-trace{overflow-x:auto;font-size:80%;margin-top:10px}.growl-debug-status{font-style:italic;margin-top:10px;margin-bottom:10px}#growl-placeholder{position:relative}#fullscreen-modal-box #growl-placeholder .growl{overflow:auto;text-align:start}.flex-center{margin:auto}.width-full{width:100%}.height-full{height:100%}.width-min-full{min-width:100%}.height-min-full{min-height:100%}.fullscreen{position:fixed;top:0;inset-inline-start:0;width:100%;height:100%;overflow:auto;z-index:1000;opacity:0;transition:opacity 350ms linear}.fullscreen.black,.fullscreen.white{-webkit-backdrop-filter:blur(35px) saturate(1.8);backdrop-filter:blur(35px) saturate(1.8)}.black-bkg,.fullscreen.black{background:var(--backgroundDarkAlpha)}.fullscreen.white,.white-bkg{background:var(--backgroundLightAlpha)}.fullscreen.soft-white,.soft-white-bkg{background:rgba(255,255,255,.6)}.ie9 .fullscreen{-webkit-filter:none;filter:none}.fullscreen-loader{width:150px;height:150px;text-align:center;border-radius:10px;color:#fff;margin-top:-75px;-webkit-margin-start:-75px;margin-inline-start:-75px;position:absolute;top:50%;inset-inline-start:50%;zoom:1}.loading-txt{position:absolute;bottom:15px;inset-inline-start:0;text-align:center;width:100%}#fullscreen-modal{display:none}#fullscreen-modal.--show{display:grid;align-items:center}.ie9 #fullscreen-modal{-webkit-filter:none;filter:none}#fullscreen-modal-box{width:670px;margin:0 auto;padding:20px;position:relative;box-shadow:0 0 50px 6px rgba(0,0,0,.25);border-radius:10px;background:var(--modalBackground);color:var(--modalText)}.--has-scrollbar #fullscreen-modal-box{border-radius:0}.phone #fullscreen-modal-box{width:100%;margin:0;max-height:100%;-webkit-overflow-scrolling:touch;border-radius:0;padding:20px}#fullscreen-modal-box .modal-box-title,#fullscreen-modal-box h1{display:block;margin-top:0;margin-bottom:20px;font-size:20px;line-height:1.2;-webkit-padding-end:32px;padding-inline-end:32px}#fullscreen-modal-box h2{font-size:1.14em}#fullscreen-modal-box h2 *{font-weight:400}#fullscreen-modal-box .or-separator{margin-top:16px}#fullscreen-modal-box p{font-size:1em;line-height:160%;margin-top:10px;margin-bottom:10px}#fullscreen-modal-box p:firt-child{margin-top:0}#fullscreen-modal-box .btn-container{margin-bottom:0}#fullscreen-modal-box .close-modal.icon--close{position:absolute;inset-inline-end:10px;top:15px;cursor:pointer;display:block;padding:10px}.phone #fullscreen-modal-box .close-modal.icon--close,.phone #fullscreen-modal-box .close-modal.icon--close:hover{inset-inline-end:10px}.modal-form textarea{height:70px;resize:none}.fancy-box{padding:20px;background:var(--bodyBackground);box-shadow:0 0 50px 6px rgb(0 0 0 / 25%);border-radius:10px}.fancy-box p{-webkit-margin-before:1em;margin-block-start:1em;-webkit-margin-after:1em;margin-block-end:1em}.fancy-box .or-separator{height:1px;margin:0}#fullscreen-changes-confirm{background:var(--bodyBackground);padding:40px 0;margin-top:75px;position:absolute;text-align:center;top:50%;width:100%;box-shadow:0 4px 16px rgba(0,0,0,.25)}#fullscreen-changes-confirm h2{font-size:18px;line-height:18px;color:inherit}.fullscreen-viewer{background:#000;background:rgba(0,0,0,.9);color:#bbb;display:none}.fullscreen-viewer-top{height:50px;width:100%;background:#000}.fullscreen-viewer-navigation,.fullscreen-viewer-top-user{margin-top:8px}.fullscreen-viewer-top-user img{width:34px;height:34px;-webkit-margin-end:10px;margin-inline-end:10px}.fullscreen-viewer-navigation{font-size:16px;font-size:1.143rem;height:26px;position:relative;z-index:100}.fullscreen-viewer-navigation a{display:inline-block;color:#bbb;color:rgba(255,255,255,.7);text-decoration:none;padding:8px}.fullscreen-viewer-navigation a:hover{color:#fff}.fullscreen-viewer-navigation a.disabled{color:#bbb;color:rgba(255,255,255,.4);cursor:default}.fullscreen-viewer-content{text-align:center;height:100%;position:relative;display:none}.fullscreen-viewer-content img{max-width:100%;max-height:100%;box-shadow:0 0 6px 0 #000}#cookie-law-banner{position:fixed;padding:20px;width:100%;bottom:0;background:rgba(0,0,0,.8);color:#fff;font-size:1.2em;z-index:1000}#cookie-law-banner p{font-size:85%;-webkit-padding-end:20px;padding-inline-end:20px}a.cookie-law-close{color:inherit;text-decoration:none;position:absolute;inset-inline-end:0;top:0;opacity:.5}a.cookie-law-close:hover{opacity:1}.badge--paid{text-transform:uppercase;text-align:center;border-radius:3px;padding:2px 5px;display:inline-block;line-height:1;border:1px solid var(--buttonDefaultBorder);color:var(--buttonDefaultHoverText);background-color:var(--buttonDefaultHoverBackground);border-color:var(--buttonDefaultHoverBorder);font-weight:400}.pop-box-menu li .badge{position:absolute;inset-inline-end:8px;top:8px}.badge{vertical-align:text-bottom;font-size:.7143em;transform-origin:right;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.badge+label,.btn .badge{-webkit-margin-start:5px;margin-inline-start:5px}.pop-box-menu li.paid a{-webkit-padding-end:52px;padding-inline-end:52px}.r1{height:30px}.r2{height:70px}.r3{height:110px}.r4{height:150px}.r5{height:190px}.r6{height:230px}.r7{height:270px}.r8{height:310px}.r9{height:350px}.r10{height:390px}.r11{height:430px}.r12{height:470px}.r13{height:510px}.r14{height:550px}.r15{height:590px}.r16{height:630px}.r17{height:670px}.r18{height:710px}.r19{height:750px}.r20{height:790px}.r11{height:830px}.r22{height:870px}.r23{height:910px}.r24{height:950px}.columns-container{overflow:auto}.grid-columns{display:block;float:left}[dir=rtl] .grid-columns{float:right}.gutter-margin-right,.gutter-margin-right-bottom{-webkit-margin-end:1px;margin-inline-end:1px}.gutter-margin-bottom,.gutter-margin-left-bottom,.gutter-margin-right-bottom{margin-bottom:1px}.gutter-margin-left,.gutter-margin-left-bottom{-webkit-margin-start:1px;margin-inline-start:1px}.gutter-width{width:5px}.col-1-min{min-width:30px}.col-2-min{min-width:70px}.col-3-min{min-width:110px}.col-4-min{min-width:150px}.col-5-min{min-width:190px}.col-6-min{min-width:230px}.col-7-min{min-width:270px}.col-8-min{min-width:310px}.col-9-min{min-width:350px}.col-10-min{min-width:390px}.col-11-min{min-width:430px}.col-12-min{min-width:470px}.col-13-min{min-width:510px}.col-14-min{min-width:550px}.col-15-min{min-width:590px}.col-16-min{min-width:630px}.col-17-min{min-width:670px}.col-18-min{min-width:710px}.col-19-min{min-width:750px}.col-20-min{min-width:790px}.col-21-min{min-width:830px}.col-22-min{min-width:870px}.col-23-min{min-width:910px}.col-24-min{min-width:950px}.col-1-max{max-width:30px}.col-2-max{max-width:70px}.col-3-max{max-width:110px}.col-4-max{max-width:150px}.col-5-max{max-width:190px}.col-6-max{max-width:230px}.col-7-max{max-width:270px}.col-8-max{max-width:310px}.col-9-max{max-width:350px}.col-10-max{max-width:390px}.col-11-max{max-width:430px}.col-12-max{max-width:470px}.col-13-max{max-width:510px}.col-14-max{max-width:550px}.col-15-max{max-width:590px}.col-16-max{max-width:630px}.col-17-max{max-width:670px}.col-18-max{max-width:710px}.col-19-max{max-width:750px}.col-20-max{max-width:790px}.col-21-max{max-width:830px}.col-22-max{max-width:870px}.col-23-max{max-width:910px}.col-24-max{max-width:950px}@media (min-width:768px){.c1{width:30px}.c2{width:70px}.c3{width:110px}.c4{width:150px}.c5{width:190px}.c6{width:230px}.c7{width:270px}.c8{width:310px}.c9{width:350px}.c10{width:390px}.c11{width:430px}.c12{width:470px}.c13{width:510px}.c14{width:550px}.c15{width:590px}.c16{width:630px}.c17{width:670px}.c18{width:710px}.fluid-column.c1{width:3.157%}.fluid-column.c2{width:7.368%}.fluid-column.c3{width:11.578%}.fluid-column.c4{width:15.789%}.fluid-column.c5{width:20%}.fluid-column.c6{width:24.21%}.fluid-column.c7{width:28.421%}.fluid-column.c8{width:32.631%}.fluid-column.c9{width:36.842%}.fluid-column.c10{width:41.052%}.fluid-column.c11{width:45.263%}.fluid-column.c12{width:49.473%}.fluid-column.c13{width:53.684%}.fluid-column.c14{width:57.894%}.fluid-column.c15{width:62.105%}.fluid-column.c16{width:66.315%}.fluid-column.c17{width:70.526%}.fluid-column.c18{width:74.736%}}@media (min-width:992px){.content-width{width:100%;min-width:970px}.c19{width:750px}.c20{width:790px}.c21{width:830px}.c22{width:870px}.c23{width:910px}.c24{width:950px}.fluid-column.c19{width:78.947%}.fluid-column.c20{width:83.157%}.fluid-column.c21{width:87.368%}.fluid-column.c22{width:91.578%}.fluid-column.c23{width:95.789%}.fluid-column.c24{width:100%}.top-btn-text .btn-text{-webkit-margin-start:7px;margin-inline-start:7px}.pop-box .arrow-down{border-width:6px 6px 0 6px}}@media (min-width:992px) and (max-width:1920px){.content-width{max-width:1800px}}@media (min-width:1921px) and (max-width:2560px){.content-width{max-width:2440px}}@media (min-width:3840px){.content-width{max-width:3720px}}.color-body-text-subtle{color:var(--bodyTextSubtle)}.color-accent{color:var(--colorAccent)}.color-success{color:var(--colorSuccess)}.color-fail{color:var(--colorFail)}.color-white{color:#fff!important}.color-black{color:#333!important}.color-grey{color:#ccc!important}.color-green{color:#27ae61!important}.color-red{color:#e74c3c!important}.color-blue{color:var(--colorBlue)!important}.color-orange{color:#d35400!important}.color-purple{color:#8e44ad!important}.color-inherit{color:inherit!important}.color-initial{color:initial!important}.height-auto{height:auto}.width-auto{width:auto}.height-100p{height:100%}.width-100p{width:100%}.color-facebook{color:#3b5998}.color-twitter{color:#1da1f2}.color-google{color:#ea4335}.color-vk{color:#45668e}.border-color-facebook{border-color:#3b5998}.border-color-twitter{border-color:#1da1f2}.border-color-google{border-color:#ea4335}.border-color-vk{border-color:#45668e}.opacity-10{opacity:.1}.opacity-20{opacity:.2}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.opacity-100{opacity:1}.background-black{background:#000!important}.background-white{background:#fff!important}.background-transparent{background:0 0!important}.background-gradient-white-left{background:linear-gradient(to right,rgba(255,255,255,0) 0,rgba(255,255,255,1) 35%,rgba(255,255,255,1) 100%)}.background-gradient-white-right{background:linear-gradient(to right,rgba(255,255,255,1) 0,rgba(255,255,255,1) 80%,rgba(255,255,255,0) 100%)}.font-weight-bold{font-weight:700!important}.font-weight-normal{font-weight:400!important}.cursor-pointer{cursor:pointer!important}.cursor-grab{cursor:-webkit-grab;cursor:grab}.cursor-grabbing{cursor:-webkit-grabbing;cursor:grabbing}.cursor-default{cursor:default!important}.cursor-zoom-in{cursor:zoom-in}.cursor-zoom-out{cursor:zoom-out}.font-size-small{font-size:13px;font-size:.92857143rem!important}.font-size-medium{font-size:medium!important}.font-size-large{font-size:large!important}.font-size-inherit{font-size:inherit!important}.font-size-10{font-size:10px!important}.font-size-11{font-size:11px!important}.font-size-12{font-size:12px!important}.font-size-13{font-size:13px!important}.font-size-14{font-size:14px!important}.font-size-15{font-size:15px!important}.font-size-16{font-size:16px!important}.font-size-17{font-size:17px!important}.font-size-18{font-size:18px!important}.height-100p{height:100%!important}.height-120p{height:120%!important}.top-0{top:0}.top-10{top:10px}.top-20{top:20px}.top-30{top:30px}.top-40{top:40px}.right-0{inset-inline-end:0}.right-10{inset-inline-end:10px}.right-20{inset-inline-end:20px}.right-30{inset-inline-end:30px}.right-40{inset-inline-end:40px}.bottom-0{bottom:0}.bottom-10{bottom:10px}.bottom-20{bottom:20px}.bottom-30{bottom:30px}.bottom-40{bottom:40px}.left-0{inset-inline-start:0}.left-10{inset-inline-start:10px}.left-20{inset-inline-start:20px}.left-30{inset-inline-start:30px}.left-40{inset-inline-start:40px}.display-none{display:none}.display-none-forced{display:none!important}.display-block{display:block}.display-block-forced{display:block!important}.display-flex{display:-moz-flex;display:flex}.visibility-hidden{visibility:hidden}.clear-both{clear:both}.float-left{float:left}[dir=rtl] .float-left{float:right}.float-right{float:right}[dir=rtl] .float-right{float:left}.border-0,.no-border{border:none}.border-top-0{border-top:0}.border-right-0{-webkit-border-end:0;border-inline-end:0}.border-bottom-0{border-bottom:0}.border-left-0{-webkit-border-start:0;border-inline-start:0}.box-shadow-none{box-shadow:none}.word-break-break-all{word-break:break-all}.word-break-break-word{word-break:break-word}.margin-0{margin:0!important}.phone .phone-margin-0{margin:0!important}.margin-5{margin:5px!important}.margin-10{margin:10px!important}.margin-20{margin:20px!important}.margin-30{margin:20px!important}.margin-40{margin:20px!important}.margin-top-0,.phablet .phablet-margin-top-0,.phone .phone-margin-top-0{margin-top:0!important}.margin-top-5,.phablet .phablet-margin-top-5,.phone .phone-margin-top-5{margin-top:5px!important}.margin-top-10,.phablet .phablet-margin-top-10,.phone .phone-margin-top-10{margin-top:10px!important}.margin-top-20,.phablet .phablet-margin-top-20,.phone .phone-margin-top-20{margin-top:20px!important}.margin-top-30{margin-top:30px!important}.margin-top-40{margin-top:40px!important}.margin-right-auto{-webkit-margin-end:auto!important;margin-inline-end:auto!important}.margin-right-0,.phablet .phablet-margin-right-0,.phone .phone-margin-right-0{-webkit-margin-end:0!important;margin-inline-end:0!important}.margin-right-035em{-webkit-margin-end:.35em!important;margin-inline-end:.35em!important}.margin-right-5{-webkit-margin-end:5px!important;margin-inline-end:5px!important}.margin-right-10{-webkit-margin-end:10px!important;margin-inline-end:10px!important}.margin-right-20{-webkit-margin-end:20px!important;margin-inline-end:20px!important}.margin-right-30{-webkit-margin-end:30px!important;margin-inline-end:30px!important}.margin-right-40{-webkit-margin-end:40px!important;margin-inline-end:40px!important}.margin-bottom-0,.phablet .phablet-margin-bottom-0,.phone .phone-margin-bottom-0{margin-bottom:0!important}.margin-bottom-5{margin-bottom:5px!important}.margin-bottom-10,.phablet .phablet-margin-bottom-10,.phone .phone-margin-bottom-10{margin-bottom:10px!important}.margin-bottom-20,.phablet .phablet-margin-bottom-20,.phone .phone-margin-bottom-20{margin-bottom:20px!important}.margin-bottom-30{margin-bottom:30px!important}.margin-bottom-40{margin-bottom:40px!important}.margin-left-auto{-webkit-margin-start:auto!important;margin-inline-start:auto!important}.margin-left-0,.phablet .phablet-margin-left-0,.phone .phone-margin-left-0{-webkit-margin-start:0!important;margin-inline-start:0!important}.margin-right--10{-webkit-margin-end:-10px!important;margin-inline-end:-10px!important}.margin-left--10{-webkit-margin-start:-10px!important;margin-inline-start:-10px!important}.margin-left-5{-webkit-margin-start:5px!important;margin-inline-start:5px!important}.margin-left-10{-webkit-margin-start:10px!important;margin-inline-start:10px!important}.margin-left-20{-webkit-margin-start:20px!important;margin-inline-start:20px!important}.margin-left-30{-webkit-margin-start:30px!important;margin-inline-start:30px!important}.margin-left-40{-webkit-margin-start:40px!important;margin-inline-start:40px!important}.padding-0{padding:0!important}.phone .phone-padding-0{padding:0!important}.padding-5{padding:5px!important}.padding-10{padding:10px!important}.padding-20{padding:20px!important}.padding-30{padding:20px!important}.padding-40{padding:20px!important}.padding-top-5{padding-top:5px!important}.padding-top-0{padding-top:0!important}.padding-top-10{padding-top:10px!important}.padding-top-20{padding-top:20px!important}.padding-top-30{padding-top:30px!important}.padding-top-40{padding-top:40px!important}.padding-right-5{-webkit-padding-end:5px!important;padding-inline-end:5px!important}.padding-right-0{-webkit-padding-end:0!important;padding-inline-end:0!important}.padding-right-10{-webkit-padding-end:10px!important;padding-inline-end:10px!important}.padding-right-20{-webkit-padding-end:20px!important;padding-inline-end:20px!important}.padding-right-30{-webkit-padding-end:30px!important;padding-inline-end:30px!important}.padding-right-40{-webkit-padding-end:40px!important;padding-inline-end:40px!important}.padding-bottom-5{padding-bottom:5px!important}.padding-bottom-0{padding-bottom:0!important}.padding-bottom-10{padding-bottom:10px!important}.padding-bottom-20{padding-bottom:20px!important}.padding-bottom-30{padding-bottom:30px!important}.padding-bottom-40{padding-bottom:40px!important}.padding-left-5{-webkit-padding-start:5px!important;padding-inline-start:5px!important}.padding-left-0{-webkit-padding-start:0!important;padding-inline-start:0!important}.padding-left-10{-webkit-padding-start:10px!important;padding-inline-start:10px!important}.padding-left-20{-webkit-padding-start:20px!important;padding-inline-start:20px!important}.padding-left-30{-webkit-padding-start:30px!important;padding-inline-start:30px!important}.padding-left-40{-webkit-padding-start:40px!important;padding-inline-start:40px!important}.position-sticky{position:-webkit-sticky;position:sticky}.position-static{position:static}.position-relative{position:relative}.position-absolute{position:absolute}.position-fixed{position:fixed}.text-align-left{text-align:start}.text-align-center{text-align:center}.text-align-right{text-align:end}.text-align-justify{text-align:justify}.text-decoration-none{text-decoration:none!important}.display-block{display:block}.display-inline{display:inline}.display-inline-table{display:inline-table}.display-inline-block{display:inline-block}.display-table-cell{display:table-cell}.word-break-break-all{word-break:break-all}.list-style-position-inside li{list-style-position:inside!important}.list-style-position-outside li{list-style-position:outside!important}.list-style-type-disc li{list-style-type:disc!important}.list-style-type-decimal li{list-style-type:decimal!important}.center-box{-webkit-margin-end:auto!important;margin-inline-end:auto!important;-webkit-margin-start:auto!important;margin-inline-start:auto!important}.display-inline-block,.display-table-cell{zoom:1}.vertical-align-middle{vertical-align:middle!important}.resize-vertical{resize:vertical!important}.no-resize,.resize-none{resize:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.overflow-x-auto{overflow-x:auto!important}.overflow-y-auto{overflow-y:auto!important}.overflow-x-hidden{overflow-x:hidden!important}.overflow-y-hidden{overflow-y:hidden!important}.overflow-x-visible{overflow-x:visible!important}.overflow-y-visible{overflow-y:visible!important}.overflow-x-scroll{overflow-x:scroll!important}.overflow-y-scroll{overflow-y:scroll!important}.text-transform-capitalize{text-transform:capitalize}.text-transform-uppercase{text-transform:uppercase}.default-margin-top{margin-top:20px}.default-margin-bottom{margin-bottom:20px}.float-none{float:none!important;clear:both!important}.desktop .desktop-hide,.laptop .laptop-hide,.largescreen .desktop-hide,.phablet .phablet-hide,.phone .phone-hide,.tablet .tablet-hide{display:none!important}.desktop .desktop-display-block,.desktop .desktop-show,.laptop .laptop-display-block,.laptop .laptop-show,.largescreen .desktop-display-block,.largescreen .desktop-show,.phablet .phablet-display-block,.phablet .phablet-show,.phone .phone-display-block,.phone .phone-show,.tablet .tablet-display-block,.tablet .tablet-show{display:block!important}.desktop .desktop-display-inline,.laptop .laptop-display-inline,.phablet .phablet-display-inline,.phone .phone-display-inline,.tablet .tablet-display-inline{display:inline!important}.desktop .desktop-display-inline-block,.laptop .laptop-display-inline-block,.phablet .phablet-display-inline-block,.phone .phone-display-inline-block,.tablet .tablet-display-inline-block{display:inline-block!important}.image-responsive{max-width:100%!important;width:auto!important}.desktop .desktop-float-none,.laptop .laptop-float-none,.phablet .phablet-float-none,.phone .phone-float-none,.tablet .tablet-float-none{float:none;clear:both}.phablet .grid-columns,.phone .grid-columns{float:none;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0;margin-inline-end:0}.phablet .phablet-float-left,.phone .phone-float-left{float:left!important}[dir=rtl].phablet .phablet-float-left,[dir=rtl].phone .phone-float-left{float:right!important}.phablet .phablet-c1,.phone .fluid-column.phablet-c1,.phone .fluid-column.phone-c1,.phone .phone-c1{width:100%}.phablet .phablet-text-align-left,.phone .phone-text-align-left{text-align:left!important}.phablet .phablet-text-align-center,.phone .phone-text-align-center{text-align:center!important}#tiptip_holder{display:none;position:absolute;top:0;inset-inline-start:0;z-index:99999}#tiptip_holder.tip_top{padding-bottom:5px}#tiptip_holder.tip_bottom{padding-top:5px}#tiptip_holder.tip_right{-webkit-padding-start:5px;padding-inline-start:5px}#tiptip_holder.tip_left{-webkit-padding-end:5px;padding-inline-end:5px}#tiptip_content{font-size:12px;color:#fff;padding:6px 8px;background-color:#333;background-color:rgba(0,0,0,.8);word-break:break-word}#tiptip_arrow,#tiptip_arrow_inner{position:absolute;border-color:transparent;border-style:solid;border-width:6px;height:0;width:0}#tiptip_holder.tip_top #tiptip_arrow_inner{margin-top:-6px;-webkit-margin-start:-7px;margin-inline-start:-7px;border-top-color:#333;border-top-color:rgba(0,0,0,.8)}#tiptip_holder.tip_bottom #tiptip_arrow_inner{margin-top:-6px;-webkit-margin-start:-7px;margin-inline-start:-7px;border-bottom-color:#333;border-bottom-color:rgba(0,0,0,.8)}#tiptip_holder.tip_right #tiptip_arrow_inner{margin-top:-6px;-webkit-margin-start:-6px;margin-inline-start:-6px;border-right-color:#333;border-right-color:rgba(0,0,0,.8)}#tiptip_holder.tip_left #tiptip_arrow_inner{margin-top:-6px;-webkit-margin-start:-6px;margin-inline-start:-6px;border-left-color:#333;border-left-color:rgba(0,0,0,.8)}.antiscroll-wrap{display:block;position:relative;overflow:hidden}.antiscroll-scrollbar{background:gray;background:rgba(0,0,0,.5);border-radius:7px;box-shadow:0 0 1px #fff;position:absolute;opacity:0;-webkit-transition:linear 350ms opacity;-moz-transition:linear 350ms opacity;-o-transition:linear 350ms opacity}.antiscroll-scrollbar-shown{opacity:1}.antiscroll-scrollbar-horizontal{height:7px;-webkit-margin-start:2px;margin-inline-start:2px;bottom:2px;inset-inline-start:0}.antiscroll-scrollbar-vertical{width:7px;margin-top:2px;inset-inline-end:2px;top:0}.antiscroll-inner{overflow:scroll}.antiscroll-inner::-webkit-scrollbar{width:0;height:0}.antiscroll-inner::scrollbar{width:0;height:0}#recaptcha_table.recaptcha_theme_clean #recaptcha_image{border:0!important}#recaptcha_response_field{height:auto}.copy-hover-display button.copy-input,.copy-hover-display button.input-action{visibility:hidden}.copy-hover-display:hover button.copy-input,.copy-hover-display:hover button.input-action,.phablet button.copy-input,.phablet button.input-action,.phone button.copy-input,.phone button.input-action{visibility:visible}button.copy-input,button.input-action{position:absolute;inset-inline-end:7px;top:.8181em;text-transform:uppercase;cursor:pointer;line-height:1;font-size:11px;padding:4px 6px;border-radius:4px;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:0}button.copy-input,button.input-action{background:var(--buttonDefaultBackground);color:var(--buttonDefaultText)}button:hover.copy-input,button:hover.input-action{background:var(--buttonDefaultHoverBackground);color:var(--buttonDefaultHoverText)}.shake{-webkit-animation:shake .82s cubic-bezier(.36,.07,.19,.97) both;animation:shake .82s cubic-bezier(.36,.07,.19,.97) both}@-webkit-keyframes shake{10%,90%{transform:translate3d(-1px,0,0)}20%,80%{transform:translate3d(2px,0,0)}30%,50%,70%{transform:translate3d(-4px,0,0)}40%,60%{transform:translate3d(4px,0,0)}}@keyframes shake{10%,90%{transform:translate3d(-1px,0,0)}20%,80%{transform:translate3d(2px,0,0)}30%,50%,70%{transform:translate3d(-4px,0,0)}40%,60%{transform:translate3d(4px,0,0)}}.key-feedback{line-height:1;background:rgba(0,0,0,.7);position:fixed;z-index:10000;-webkit-backdrop-filter:blur(30px);backdrop-filter:blur(30px);bottom:1.5em;transition:all .5s;opacity:0;text-align:center;color:#fff;font-weight:700;font-size:45px;padding:1em;border-radius:.5em;inset-inline-start:50%;transform:translateX(-50%);border:4px solid rgba(255,255,255,.9);box-shadow:0 0 50px 6px rgb(0 0 0 / 25%);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}img.qr{display:inline-block}.fa-vkontakte:before{content:"\f189"}.fab.fa-mailru{font-family:"Font Awesome 5 Free";font-weight:900}.fa-mailru:before{content:"\f1fa"}.fa-stackexchange:before{content:"\f18d"}.fa-twitchtv:before{content:"\f1e8"}.fa-wechat:before{content:"\f1d7"}.clearfix:after{clear:both;display:table;content:''}
\ No newline at end of file
diff --git a/content/legacy/themes/Peafowl/snippets/anywhere_upload.php b/content/legacy/themes/Peafowl/snippets/anywhere_upload.php
index 497c0ae..d684a7d 100644
--- a/content/legacy/themes/Peafowl/snippets/anywhere_upload.php
+++ b/content/legacy/themes/Peafowl/snippets/anywhere_upload.php
@@ -19,13 +19,11 @@ if (!defined('ACCESS') || !ACCESS) {
}
if (Login::isLoggedUser()) {
$user_albums = [];
- if (Login::getUser()['album_count'] > 0) {
- $user_albums = Handler::cond('owner')
- && Handler::var('user_items_editor') !== null
- && isset(Handler::var('user_items_editor')['user_albums'])
- ? Handler::var('user_items_editor')['user_albums']
- : User::getAlbums(Login::getUser());
- }
+ $user_albums = Handler::cond('owner')
+ && Handler::var('user_items_editor') !== null
+ && isset(Handler::var('user_items_editor')['user_albums'])
+ ? Handler::var('user_items_editor')['user_albums']
+ : User::getAlbums(Login::getUser());
}
?>
@@ -164,16 +162,23 @@ if (Login::isLoggedUser()) {
0) {
+ if (Login::isLoggedUser()) {
+ $isSelectedAlbum = Handler::var('album') !== [] && isset(Handler::var('album')['id_encoded']);
?>
+ >
+
%name', [
- '%selected' => (Handler::var('album') !== [] && isset(Handler::var('album')['id_encoded']) && Handler::var('album')['id_encoded'] == $album['id_encoded']) ? ' selected' : '',
+ '%selected' => ($isSelectedAlbum && isset(Handler::var('album')['id_encoded']) && Handler::var('album')['id_encoded'] == $album['id_encoded']) ? ' selected' : '',
'%id' => $album['id_encoded'],
'%name' => $album['indent_string'] . $album['name_with_privacy_readable_html']
]);
diff --git a/content/legacy/themes/Peafowl/views/dashboard/settings/email.php b/content/legacy/themes/Peafowl/views/dashboard/settings/email.php
index 6b6ce42..f7cb461 100644
--- a/content/legacy/themes/Peafowl/views/dashboard/settings/email.php
+++ b/content/legacy/themes/Peafowl/views/dashboard/settings/email.php
@@ -38,31 +38,52 @@ echo read_the_docs_settings('email', _s('Email')); ?>
_s('SMTP'),
+ 'mail' => _s('PHP mail() func.'),
+ 'ahasend' => 'AhaSend',
+ 'ses' => 'Amazon SES',
+ 'azure' => 'Azure',
+ 'brevo' => 'Brevo',
+ 'infobip' => 'Infobip',
+ 'mailersend' => 'MailerSend',
+ 'mailgun' => 'Mailgun',
+ 'mailjet' => 'Mailjet',
+ 'mailomat' => 'Mailomat',
+ 'mailpace' => 'MailPace',
+ 'mailtrap' => 'Mailtrap',
+ 'mandrill' => 'Mandrill',
+ 'microsoftgraph' => 'Microsoft Graph',
+ 'postal' => 'Postal',
+ 'postmark' => 'Postmark',
+ 'resend' => 'Resend',
+ 'scaleway' => 'Scaleway',
+ 'sendgrid' => 'SendGrid',
+ 'sweego' => 'Sweego',
];
-if(env()['CHEVERETO_SERVICING'] === 'server') {
- $mailOptions['mail'] = _s('PHP mail() func.');
+if (env()['CHEVERETO_SERVICING'] !== 'server') {
+ unset($mailOptions['mail']);
}
-$mailComboClass = '';
-if (count($mailOptions) == 2 && (Handler::var('safe_post')
- ? Handler::var('safe_post')['email_mode']
- : Settings::get('email_mode')) !== 'smtp'
-) {
- $mailComboClass = ' soft-hidden';
+if (env()['CHEVERETO_CONTEXT'] === 'saas') {
+ unset($mailOptions['smtp'], $mailOptions['mail']);
+}
+$currentEmailMode = Handler::var('safe_post') ? Handler::var('safe_post')['email_mode'] : Settings::get('email_mode');
+if(!array_key_exists($currentEmailMode, $mailOptions)) {
+ $currentEmailMode = array_key_first($mailOptions);
}
?>
- ' . nl2br($GLOBALS['SMTPDebug']) . '';
- } ?>
-
+ ' . nl2br($GLOBALS['SMTPDebug']) . '';
+ } ?>
+
diff --git a/content/legacy/themes/Peafowl/views/dashboard/settings/homepage.php b/content/legacy/themes/Peafowl/views/dashboard/settings/homepage.php
new file mode 100644
index 0000000..858ace8
--- /dev/null
+++ b/content/legacy/themes/Peafowl/views/dashboard/settings/homepage.php
@@ -0,0 +1,151 @@
+
'
+ . _s('These settings do not have any effect as "%s" is overriding / (root).', [
+ '%s' => '
' . _s('%s routing', _s('Single profile')) . ' ',
+ ])
+ . '
';
+}
+echo read_the_docs_settings('homepage', _s('Homepage')); ?>
+
+
+
+ $v) {
+ $cover_index = $k + 1;
+ $cover_label = 'homepage_cover_image_' . $k;
+ $coverName = _s('Cover image') . ' (' . $cover_index . ')'; ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+