diff --git a/.github/banner/chevereto-ultimate-remix.png b/.github/banner/chevereto-ultimate-remix.png new file mode 100644 index 0000000..e884c8c Binary files /dev/null and b/.github/banner/chevereto-ultimate-remix.png differ diff --git a/.github/banner/chevereto-ultimate.png b/.github/banner/chevereto-ultimate.png deleted file mode 100644 index 24de8e8..0000000 Binary files a/.github/banner/chevereto-ultimate.png and /dev/null differ diff --git a/.gitignore b/.gitignore index bd2bbba..b1bf083 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ .DS_Store /.env /.idea +/app/.upgrading +/app/CHEVERETO_LICENSE_KEY /app/vendor /app/build /app/.phpunit.cache diff --git a/.package/4.0.10.txt b/.package/4.0.10.txt deleted file mode 100644 index acb0b1a..0000000 --- a/.package/4.0.10.txt +++ /dev/null @@ -1,17 +0,0 @@ -Chevereto 4.0.10 (2024-02-07) - -- ✅ Added version CLI command -- ✅ Improved error display on CLI install -- 🐞 Fixed bug in AWS open_basedir restriction -- 🐞 Fixed bug in banners settings page -- 🐞 Fixed bug in comments implementation -- 🐞 Fixed bug in file size handling -- 🐞 Fixed bug in notifications missing links -- 🐞 Fixed bug in NSFW display -- 🐞 Fixed bug in Spanish translation -- 🐞 Fixed bug in update database query -- 🐞 Fixed bug in upload file title -- 🐞 Fixed bug in user interface for iOS -- 💅 Disabled listing viewer by default -- 💅 Improved arrow style navigation -- 💅 Improved notifications display (default avatar) diff --git a/.package/4.0.11.txt b/.package/4.0.11.txt new file mode 100644 index 0000000..d0cb3e1 --- /dev/null +++ b/.package/4.0.11.txt @@ -0,0 +1,8 @@ +Chevereto 4.0.11 (2024-02-21) + +- ✅ Added one-click upgrade system +- ✅ Added license key configuration +- ✅ Added /dashboard/?license +- ✅ Added /dashboard/?installed +- ✅ Added /dashboard/?upgrade +- 💅 Improved software version at dashboard diff --git a/README.md b/README.md index 8b2f8fc..a18a35b 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,14 @@ -# Chevereto: Ultimate image sharing software 🦄 +# Chevereto: Ultimate image sharing software > 🔔 [Subscribe](https://chv.to/newsletter) to don't miss any update regarding Chevereto.

- Chevereto + Chevereto

-![CHUISS](.github/banner/chevereto-ultimate.png) +[![CHUISS](.github/banner/chevereto-ultimate-remix.png)](https://chevereto.com) + +[![Community](https://img.shields.io/badge/chv.to-community-blue?style=flat-square)](https://chv.to/community) [![Community](https://img.shields.io/badge/chv.to-community-blue?style=flat-square)](https://chv.to/community) [![AGPL-3.0-only](https://img.shields.io/github/license/chevereto/chevereto?style=flat-square)](LICENSE) diff --git a/app/composer.lock b/app/composer.lock index b982ccd..a3ebc33 100644 --- a/app/composer.lock +++ b/app/composer.lock @@ -5378,16 +5378,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.57", + "version": "1.10.59", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "1627b1d03446904aaa77593f370c5201d2ecc34e" + "reference": "e607609388d3a6d418a50a49f7940e8086798281" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/1627b1d03446904aaa77593f370c5201d2ecc34e", - "reference": "1627b1d03446904aaa77593f370c5201d2ecc34e", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e607609388d3a6d418a50a49f7940e8086798281", + "reference": "e607609388d3a6d418a50a49f7940e8086798281", "shasum": "" }, "require": { @@ -5436,7 +5436,7 @@ "type": "tidelift" } ], - "time": "2024-01-24T11:51:34+00:00" + "time": "2024-02-20T13:59:13+00:00" }, { "name": "phpunit/php-code-coverage", diff --git a/app/env-default.php b/app/env-default.php index 35f24cd..2367770 100644 --- a/app/env-default.php +++ b/app/env-default.php @@ -87,4 +87,5 @@ return [ 'CHEVERETO_SERVICING' => 'server', 'CHEVERETO_SESSION_SAVE_HANDLER' => 'files', 'CHEVERETO_SESSION_SAVE_PATH' => '/tmp', + 'CHEVERETO_EDITION' => 'pro', ]; diff --git a/app/legacy/entrypoints/cli.php b/app/legacy/entrypoints/cli.php index c264acc..821649e 100644 --- a/app/legacy/entrypoints/cli.php +++ b/app/legacy/entrypoints/cli.php @@ -43,6 +43,7 @@ if ($opts === []) { } define('ACCESS', $access); require_once __DIR__ . '/../load/php-boot.php'; +require_once __DIR__ . '/../load/loader.php'; require_once loaderHandler( $_COOKIE, $_ENV, diff --git a/app/legacy/entrypoints/index.php b/app/legacy/entrypoints/index.php index 23d216b..0d78619 100644 --- a/app/legacy/entrypoints/index.php +++ b/app/legacy/entrypoints/index.php @@ -13,7 +13,17 @@ use function Chevereto\Legacy\loaderHandler; define('ACCESS', 'web'); -require_once __DIR__ . '/../load/php-boot.php'; +$appDir = __DIR__ . '/../..'; +$loadDir = __DIR__ . '/../load'; +require_once $loadDir . '/php-boot.php'; +$uri = $_SERVER['REQUEST_URI'] ?? ''; +$parseUri = parse_url($uri); +if (in_array($parseUri['path'], ['/upgrading', '/upgrading/']) + && file_exists($appDir . '/.upgrading/upgrading.lock')) { + require $appDir . '/upgrading.php'; + exit; +} +require_once $loadDir . '/loader.php'; require_once loaderHandler( $_COOKIE, $_ENV, diff --git a/app/legacy/install/installer.php b/app/legacy/install/installer.php index 66d43ae..f5465b7 100644 --- a/app/legacy/install/installer.php +++ b/app/legacy/install/installer.php @@ -594,6 +594,7 @@ $settings_updates = [ '4.0.10' => [ 'listing_viewer' => 0, ], + '4.0.11' => null, ]; $cheveretoFreeMap = [ '1.0.0' => '3.8.3', diff --git a/app/legacy/load/app.php b/app/legacy/load/app.php index 703465c..069c236 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.0.10'; +const APP_VERSION = '4.0.11'; const APP_VERSION_AKA = 'macanudo'; diff --git a/app/legacy/routes/api.php b/app/legacy/routes/api.php index 1be3c18..2e8f093 100644 --- a/app/legacy/routes/api.php +++ b/app/legacy/routes/api.php @@ -33,7 +33,6 @@ use function Chevereto\Legacy\G\is_url; use function Chevereto\Legacy\G\json_error; use function Chevereto\Legacy\G\json_output; use function Chevereto\Legacy\G\random_string; -use function Chevereto\Legacy\G\timing_safe_compare; use function Chevereto\Legacy\getSetting; use function Chevereto\Vars\env; use function Chevereto\Vars\files; @@ -66,7 +65,7 @@ return function (Handler $handler) { if ((getSetting('api_v1_key') ?? '') == '') { throw new Exception("API V1 public key can't be null. Go to your dashboard and set the Guest API key.", 0); } - if (!timing_safe_compare(getSetting('api_v1_key'), $key)) { + if (!hash_equals(getSetting('api_v1_key'), $key)) { throw new Exception("Invalid guest API key.", 100); } } else { @@ -124,7 +123,7 @@ return function (Handler $handler) { throw new Exception('Upload using base64 source must be done using POST method.', 130); } $source = trim(preg_replace('/\s+/', '', $source)); - if (!timing_safe_compare(base64_encode(base64_decode($source)), $source)) { + if (!hash_equals(base64_encode(base64_decode($source)), $source)) { throw new Exception('Invalid base64 string.', 120); } $api_temp_file = tempnam(sys_get_temp_dir(), 'chvtemp'); diff --git a/app/legacy/routes/dashboard.php b/app/legacy/routes/dashboard.php index b0474b9..b1d87b5 100644 --- a/app/legacy/routes/dashboard.php +++ b/app/legacy/routes/dashboard.php @@ -9,6 +9,7 @@ * file that was distributed with this source code. */ +use function Chevere\String\randomString; use Chevereto\Config\Config; use function Chevereto\Legacy\badgePaid; use Chevereto\Legacy\Classes\Akismet; @@ -45,11 +46,11 @@ use function Chevereto\Legacy\G\is_valid_url; use function Chevereto\Legacy\G\redirect; use function Chevereto\Legacy\G\sanitize_relative_path; use function Chevereto\Legacy\G\starts_with; -use function Chevereto\Legacy\G\timing_safe_compare; use function Chevereto\Legacy\G\unlinkIfExists; use function Chevereto\Legacy\get_available_languages; use function Chevereto\Legacy\get_chv_default_setting; use function Chevereto\Legacy\get_share_links; +use function Chevereto\Legacy\getLicenseKey; use function Chevereto\Legacy\getSetting; use function Chevereto\Legacy\getSettings; use function Chevereto\Legacy\getSystemNotices; @@ -73,6 +74,34 @@ return function (Handler $handler) { return; } + if (env()['CHEVERETO_CONTEXT'] !== 'saas' + && ($handler->request()[0] ?? null) === 'upgrade' + ) { + if (!$handler::checkAuthToken(request()['auth_token'] ?? '')) { + $handler->issueError(403); + + return; + } + $upgradingDir = PATH_APP . '.upgrading/'; + if (!is_dir($upgradingDir)) { + mkdir($upgradingDir); + } + $upgradingLock = $upgradingDir . 'upgrading.lock'; + unlinkIfExists($upgradingLock); + $token = randomString(128); + touch($upgradingLock); + file_put_contents($upgradingLock, $token); + $params = [ + 'action' => 'download', + 'token' => $token, + 'return' => 'dashboard/?installed', + ]; + $query = http_build_query($params); + redirect( + get_base_url('upgrading/?' . $query), + 302, + ); + } $doing = $handler->request()[0] ?? 'stats'; $logged_user = Login::getUser(); if ($logged_user === []) { @@ -91,7 +120,7 @@ return function (Handler $handler) { } $route_prefix = 'dashboard'; $routes = [ - 'stats' => _s('Stats'), + 'stats' => _s('Home'), 'images' => _s('Images'), 'albums' => _n('Album', 'Albums', 20), 'users' => _n('User', 'Users', 20), @@ -118,7 +147,7 @@ return function (Handler $handler) { } } $icons = [ - 'stats' => 'fas fa-chart-bar', + 'stats' => 'fas fa-home', 'images' => 'fas fa-image', 'albums' => 'fas fa-images', 'users' => 'fas fa-users', @@ -212,6 +241,7 @@ return function (Handler $handler) { if ($doing == '') { $doing = $default_route; } + $route_menu = []; foreach ($routes as $route => $label) { $aux = str_replace('_', '-', $route); $handler::setCond($route_prefix . '_' . $aux, $doing == $aux); @@ -285,24 +315,34 @@ return function (Handler $handler) { 'files' => get_app_version(), 'db' => getSetting('chevereto_version_installed') ?? '' ]; + $links = []; $linksButtons = ''; - $links = [ - [ - 'label' => _s('Documentation'), - 'icon' => 'fas fa-book', - 'href' => $handler::var('docsBaseUrl') - ], - [ - 'label' => _s('%s docs', _s('Admin')), - 'icon' => 'fas fa-user-tie', - 'href' => 'https://v4-admin.chevereto.com' - ], - [ - 'label' => _s('%s docs', _n('User', 'Users', 1)), - 'icon' => 'fas fa-user', - 'href' => 'https://v4-user.chevereto.com' - ], - ]; + $licenseKey = getLicenseKey(); + $handler::setVar('licenseKey', $licenseKey); + if (env()['CHEVERETO_CONTEXT'] !== 'saas') { + $upgradeClass = 'hidden'; + $upgradeLink = get_base_url('dashboard/upgrade/?auth_token=' . $handler::getAuthToken()); + if ($licenseKey !== '' && env()['CHEVERETO_EDITION'] === 'free') { + $upgradeClass = ''; + } + $upgradeTitle = ' ' . _s('Upgrade now'); + $links = array_merge($links, [ + [ + 'label' => _s('Upgrade now'), + 'icon' => 'fas fa-download', + 'class' => 'green ' . $upgradeClass, + 'attr' => 'data-action="upgrade" data-options=\'{"title":"' . $upgradeTitle . '"}\' href="' . $upgradeLink . '" data-confirm="' . _s("The latest release will be downloaded and extracted in the filesystem.") . '"', + ], + ]); + $links = array_merge($links, [ + [ + 'label' => _s("License key"), + 'icon' => 'fas fa-key', + 'class' => 'accent outline', + 'attr' => 'data-action="license" data-modal="edit" data-target="modal-license-key"' + ], + ]); + } if (env()['CHEVERETO_CONTEXT'] === 'saas') { $links = array_merge($links, [ [ @@ -311,33 +351,12 @@ return function (Handler $handler) { 'href' => 'https://chevereto.cloud/support' ], ]); - } else { - $links = array_merge($links, [ - [ - 'label' => _s("Releases"), - 'icon' => 'fas fa-rocket', - 'href' => 'https://releases.chevereto.com' - ], - [ - 'label' => _s('Support'), - 'icon' => 'fas fa-medkit', - 'href' => 'https://chevereto.com/support' - ], - [ - 'label' => _s('Community'), - 'icon' => 'fas fa-users', - 'href' => 'https://chevereto.com/community' - ], - [ - 'label' => _s("License"), - 'icon' => 'fas fa-key', - 'href' => 'https://chevereto.com/panel/license' - ] - ]); } foreach ($links as $link) { - $linksButtons .= strtr(' %label%', [ - '%href%' => $link['href'], + $attr = $link['attr'] ?? 'href="%href%" target="_blank"'; + $class = $link['class'] ?? 'default'; + $linksButtons .= strtr('%label%', [ + '%href%' => $link['href'] ?? '', '%icon%' => $link['icon'], '%label%' => $link['label'], ]); @@ -351,7 +370,7 @@ return function (Handler $handler) { if (version_compare($chv_version['files'], $chv_version['db'], '>')) { $install_update_button = $chv_version['db'] . ' DB ' . _s('install update') . ''; } - $version_check .= ' ' . _s("Check updates") . ''; + $version_check .= ' ' . _s("Check upgrades") . ''; if (datetime_diff($cron_last_ran, null, 'm') > 5) { $cronRemark .= ' — ' . _s('not running') . ''; } @@ -365,11 +384,11 @@ return function (Handler $handler) { $chv_version_minor = $chv_versioning[0] . '.' . $chv_versioning[1]; $system_values = [ 'chv_version' => [ - 'label' => '
', + 'label' => '
', 'content' => '
' - . '

' + . '

' . $chv_version['files'] - . ' ' . APP_VERSION_AKA . '

' + . '' . APP_VERSION_AKA . '

' . $install_update_button . '
' . $version_check . $linksButtons . '
' @@ -390,11 +409,48 @@ return function (Handler $handler) { 'content' => ' ' . get_client_ip() . ' ' . _s('Not your IP?') . '' ], ]; + + $cheveretoLinks = [ + [ + 'label' => _s('Docs'), + 'icon' => 'fas fa-book', + 'href' => $handler::var('docsBaseUrl') + ], + [ + 'label' => _s("Releases"), + 'icon' => 'fas fa-rocket', + 'href' => 'https://releases.chevereto.com' + ], + [ + 'label' => _s('Support'), + 'icon' => 'fas fa-medkit', + 'href' => 'https://chevereto.com/support' + ], + [ + 'label' => _s('Community'), + 'icon' => 'fas fa-users', + 'href' => 'https://chevereto.com/community' + ], + ]; + $cheveretoLinksButtons = ''; + foreach ($cheveretoLinks as $link) { + $attr = $link['attr'] ?? 'href="%href%" target="_blank"'; + $cheveretoLinksButtons .= strtr('%label%', [ + '%href%' => $link['href'] ?? '', + '%icon%' => $link['icon'], + '%label%' => $link['label'], + ]); + } + if (env()['CHEVERETO_CONTEXT'] !== 'saas') { $mysqlVersion = $db->getAttr(PDO::ATTR_SERVER_VERSION); $db->closeCursor(); $mysqlServerInfo = $db->getAttr(PDO::ATTR_SERVER_INFO); $system_values_more = [ + 'links' => [ + 'label' => _s('Links'), + 'content' => $cheveretoLinksButtons, + ], 'cli' => [ 'label' => 'CLI', 'content' => ' ' . PATH_PUBLIC . 'app/bin/legacy', @@ -1412,7 +1468,7 @@ return function (Handler $handler) { if (isset($page['id']) && $page['id'] == $v['page_id']) { continue; // Skip on same thing } - if (timing_safe_compare($v[$kk], $POST[$kk])) { + if (hash_equals($v[$kk], $POST[$kk])) { $input_errors[$kk] = sprintf($vv, $v['page_id']); } } @@ -1427,7 +1483,7 @@ return function (Handler $handler) { try { Page::writePage(['file_path' => $POST['page_file_path'], 'code' => $page_write_code]); - if ($handler->request()[2] == 'edit' && isset($page['file_path']) && !timing_safe_compare($page['file_path'], $POST['page_file_path'])) { + if ($handler->request()[2] == 'edit' && isset($page['file_path']) && !hash_equals($page['file_path'], $POST['page_file_path'])) { unlinkIfExists(Page::getPath($page['file_path'])); } if (isset($page['id'])) { @@ -1445,7 +1501,7 @@ return function (Handler $handler) { foreach ($page_fields as $v) { $postPage = $POST['page_' . $v]; if ($handler->request()[2] == 'edit') { - if (timing_safe_compare($page[$v] ?? '', $postPage ?? '')) { + if (hash_equals($page[$v] ?? '', $postPage ?? '')) { continue; } // Skip not updated values } diff --git a/app/legacy/routes/json.php b/app/legacy/routes/json.php index 0bf9380..b3827a9 100644 --- a/app/legacy/routes/json.php +++ b/app/legacy/routes/json.php @@ -54,6 +54,7 @@ use function Chevereto\Legacy\isDebug; use function Chevereto\Legacy\isShowEmbedContent; use function Chevereto\Legacy\send_mail; use function Chevereto\Legacy\time_elapsed_string; +use function Chevereto\Vars\env; use function Chevereto\Vars\files; use function Chevereto\Vars\post; use function Chevereto\Vars\request; @@ -1536,6 +1537,24 @@ return function (Handler $handler) { User::update($user_id, ['status' => $doing == 'user_ban' ? 'banned' : 'valid']); $json_array['status_code'] = 200; + break; + case 'set-license-key': + if (env()['CHEVERETO_CONTEXT'] === 'saas') { + throw new Exception('Not found', 404); + } + if (!Login::isAdmin()) { + throw new Exception(_s('Request denied'), 403); + } + $licenseKey = $POST['key'] ?? ''; + $licenseFile = PATH_APP . 'CHEVERETO_LICENSE_KEY'; + touch($licenseFile); + if (file_put_contents($licenseFile, $licenseKey)) { + $json_array['status_code'] = 200; + $json_array['success'] = ['message' => _s('License key updated'), 'code' => 200]; + } else { + throw new Exception('Error updating license key', 500); + } + break; case 'deny': throw new Exception(_s('Request denied'), 403); diff --git a/app/legacy/routes/settings.php b/app/legacy/routes/settings.php index 34c7754..4f20aae 100644 --- a/app/legacy/routes/settings.php +++ b/app/legacy/routes/settings.php @@ -31,7 +31,6 @@ use function Chevereto\Legacy\G\is_url_web; use function Chevereto\Legacy\G\nullify_string; use function Chevereto\Legacy\G\redirect; use function Chevereto\Legacy\G\safe_html; -use function Chevereto\Legacy\G\timing_safe_compare; use function Chevereto\Legacy\generate_hashed_token; use function Chevereto\Legacy\get_available_languages; use function Chevereto\Legacy\getIpButtonsArray; @@ -251,11 +250,11 @@ return function (Handler $handler) { continue; } } - if (timing_safe_compare($row['user_username'], $POST['username']) and $user['username'] !== $row['user_username']) { + if (hash_equals($row['user_username'], $POST['username']) and $user['username'] !== $row['user_username']) { $input_errors['username'] = 'Username already being used'; } if ( - !empty($POST['email']) && timing_safe_compare($row['user_email'], $POST['email']) && + !empty($POST['email']) && hash_equals($row['user_email'], $POST['email']) && $user['email'] !== $row['user_email'] ) { $input_errors['email'] = _s('Email already being used'); @@ -266,7 +265,7 @@ return function (Handler $handler) { } } } - if (!$is_error && $is_email_required && !empty($POST['email']) && !timing_safe_compare($user['email'] ?? '', $POST['email'])) { + if (!$is_error && $is_email_required && !empty($POST['email']) && !hash_equals($user['email'] ?? '', $POST['email'])) { Confirmation::delete(['type' => 'account-change-email', 'user_id' => $user['id']]); $hashed_token = generate_hashed_token((int) $user['id']); Confirmation::insert([ diff --git a/app/legacy/routes/signup.php b/app/legacy/routes/signup.php index 5e680a2..39d75d4 100644 --- a/app/legacy/routes/signup.php +++ b/app/legacy/routes/signup.php @@ -23,7 +23,6 @@ use function Chevereto\Legacy\G\get_public_url; use Chevereto\Legacy\G\Handler; use function Chevereto\Legacy\G\redirect; use function Chevereto\Legacy\G\safe_html; -use function Chevereto\Legacy\G\timing_safe_compare; use function Chevereto\Legacy\generate_hashed_token; use function Chevereto\Legacy\get_email_body_str; use function Chevereto\Legacy\getSetting; @@ -136,10 +135,10 @@ return function (Handler $handler) { continue; } } - if (timing_safe_compare($row['user_username'], $POST['username'])) { + if (hash_equals($row['user_username'], $POST['username'])) { $input_errors['username'] = 'Username already being used'; } - if (timing_safe_compare($row['user_email'], $POST['email'])) { + if (hash_equals($row['user_email'], $POST['email'])) { $input_errors['email'] = _s('Email already being used'); } if (!$show_resend_activation) { diff --git a/app/src/Legacy/G/Handler.php b/app/src/Legacy/G/Handler.php index d00f68e..98cfbb8 100644 --- a/app/src/Legacy/G/Handler.php +++ b/app/src/Legacy/G/Handler.php @@ -424,7 +424,7 @@ class Handler return false; } - return timing_safe_compare(session()['G_auth_token'], $token); + return hash_equals(session()['G_auth_token'], $token); } public static function setVar(string $var, mixed $value): void diff --git a/app/src/Legacy/functions.php b/app/src/Legacy/functions.php index 35fed17..0a75ef2 100644 --- a/app/src/Legacy/functions.php +++ b/app/src/Legacy/functions.php @@ -1032,6 +1032,7 @@ function loaderHandler( 'CHEVERETO_ENABLE_UPLOAD_WATERMARK' => '0', 'CHEVERETO_ENABLE_USERS' => '0', 'CHEVERETO_MAX_USERS' => '1', + 'CHEVERETO_EDITION' => 'free', )); new EnvVar($envVar); new ServerVar(array_merge($envDefault, $env, $_server)); @@ -1314,3 +1315,14 @@ function adjustBrightness(string $hexCode, float $adjustPercent) return '#' . implode($hexCode); } + +function getLicenseKey(): string +{ + $licenseKey = env()['CHEVERETO_LICENSE_KEY'] ?? ''; + $licenseFile = PATH_APP . 'CHEVERETO_LICENSE_KEY'; + if ($licenseKey === '' && file_exists($licenseFile)) { + $licenseKey = file_get_contents($licenseFile); + } + + return $licenseKey; +} diff --git a/app/upgrading.php b/app/upgrading.php new file mode 100644 index 0000000..7ddb32b --- /dev/null +++ b/app/upgrading.php @@ -0,0 +1,451 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + +Download (auto license): + php app/upgrading.php + +Download (with license): + CHEVERETO_LICENSE_KEY=your_license_key php app/upgrading.php + +* .upgrading/upgrading.lock +This setting affects non CLI (HTTP calls only). +It exists when the upgrade has been authorized at dashboard. +It contains the token for upgrade process, must be checked against request. + +* .upgrading/downloading.lock +It exists when the upgrade is downloading the new version. + +* .upgrading/extracting.lock +It exists when the upgrade is extracting the new version. + +*/ +namespace Chevereto; + +use Exception; +use RuntimeException; +use stdClass; +use Throwable; +use ZipArchive; + +require_once __DIR__ . '/legacy/load/php-boot.php'; + +const ZIP_BALL = 'https://chevereto.com/api/download/%tag%'; +const LOGGER = __DIR__ . '/.upgrading/process.log'; +if (!file_exists(LOGGER)) { + touch(LOGGER); +} +ob_start('ob_gzhandler'); +ob_implicit_flush(true); +$rootDir = __DIR__ . '/..'; +$workingDir = __DIR__ . '/.upgrading'; +if (is_file($workingDir)) { + unlink($workingDir); +} +$runtimeTable = [ + 'log_errors' => ini_set('log_errors', true), + 'display_errors' => ini_set('display_errors', true), + 'error_log' => ini_set('error_log', $workingDir . '/error.log'), + 'ignore_user_abort' => ignore_user_abort(true), + 'time_limit' => @set_time_limit(0), + 'ini_set' => ini_set('default_charset', 'utf-8'), + 'setlocale' => setlocale(LC_ALL, 'en_US.UTF8'), + 'output_buffering' => ini_set('output_buffering', 'off'), + 'zlib.output_compression' => ini_set('zlib.output_compression', false), +]; +$logProcess = $workingDir . '/process.log'; +$lockUpgrading = $workingDir . '/upgrading.lock'; +$lockDownloading = $workingDir . '/downloading.lock'; +$lockExtracting = $workingDir . '/extracting.lock'; +$upgradingKey = $rootDir . '/app/CHEVERETO_LICENSE_KEY'; +if (PHP_SAPI !== 'cli') { + header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0'); + echo <<
+    HTML;
+}
+if (!is_dir($workingDir)) {
+    mkdir($workingDir, 0755, true);
+}
+if (!is_writable($workingDir)) {
+    abort('[!] Working dir is not writable', 500);
+}
+$envFile = __DIR__ . '/env.php';
+$env = [];
+if (file_exists($envFile)) {
+    $env = require $envFile;
+}
+$env = array_merge($_ENV, $_SERVER, $env);
+if (!class_exists('ZipArchive')) {
+    abort('[!] ZipArchive is not available');
+}
+$licenseKey = $env['CHEVERETO_LICENSE_KEY'] ?? '';
+if ($licenseKey === '' && file_exists($upgradingKey)) {
+    $licenseKey = file_get_contents($upgradingKey);
+}
+$return = $_GET['return'] ?? '';
+$parseUri = parse_url($_SERVER['REQUEST_URI'] ?? '');
+$query = $parseUri['query'] ?? '';
+$pathUrl = $parseUri['path'] ?? '';
+$rootUrl = rtrim(dirname($pathUrl), '/') . '/';
+$actions = ['download', 'extract'];
+$filePath = $workingDir . '/' . 'chevereto.zip';
+if (PHP_SAPI === 'cli') {
+    echo <<getMessage(), 400);
+    }
+    logger($response->message);
+    logger('Unlock downloading process');
+    unlink($lockDownloading);
+    $query = str_replace('action=download', 'action=extract', $query);
+    if (PHP_SAPI !== 'cli') {
+        $continueUri = $pathUrl . '?' . $query;
+        logger('Continue extraction in 3s at... ' . $continueUri);
+        sleep(3);
+    }
+}
+if ($singleStep || $action === 'extract') {
+    if (PHP_SAPI !== 'cli') {
+        echo file_get_contents(LOGGER);
+    }
+    if (file_exists($lockExtracting)) {
+        abort('[!] Extracting is already in progress', 400);
+    }
+    if (!file_exists($filePath)) {
+        abort('[!] Package not downloaded', 400);
+    }
+    logger('Lock extracting process');
+    file_put_contents($lockExtracting, $upgradeToken);
+
+    try {
+        $response = extractAction($rootDir, $filePath);
+    } catch (Throwable $e) {
+        logger('Unlock extracting process');
+        unlink($lockExtracting);
+        abort($e->getMessage(), $e->getCode());
+    }
+    logger($response->message);
+    unlink($filePath);
+    logger('Unlock extracting process');
+    unlink($lockExtracting);
+    logger('Chevereto filesystem upgraded');
+    unlinkIfExists($lockUpgrading);
+    $safeResult = false;
+    $command = $rootDir . '/app/bin/legacy -C update';
+    if (passthruEnabled()) {
+        logger('Command passthru');
+        $safeResult = passthru($command);
+    }
+    if ($safeResult === false) {
+        logger('Continue with database update');
+    }
+    if (PHP_SAPI !== 'cli') {
+        $continueUri = $rootUrl . $return;
+        logger('Redirecting in 3s...');
+        sleep(3);
+    }
+    unlink(LOGGER);
+}
+if (PHP_SAPI !== 'cli') {
+    echo '
'; + if (isset($continueUri)) { + echo <<goToUrl("{$continueUri}") + HTML; + } + echo ''; +} + +function logger(string $message): void +{ + $hour = gmdate('H:i:s'); + $message = $hour . ' * ' . $message . PHP_EOL; + fwrite(fopen('php://output', 'r+'), $message); + fwrite(fopen(LOGGER, 'a+'), $message); + ob_flush(); +} + +function curl(string $url, array $curlOpts = []): object +{ + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_AUTOREFERER, 1); + curl_setopt($ch, CURLOPT_TIMEOUT, 60); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); + curl_setopt($ch, CURLOPT_HEADER, 0); + curl_setopt($ch, CURLOPT_FAILONERROR, 0); + curl_setopt($ch, CURLOPT_VERBOSE, 0); + curl_setopt($ch, CURLOPT_USERAGENT, 'Chevereto Upgrade'); + $fp = false; + foreach ($curlOpts as $k => $v) { + if (CURLOPT_FILE == $k) { + $fp = $v; + } + curl_setopt($ch, $k, $v); + } + $file_get_contents = curl_exec($ch); + $transfer = curl_getinfo($ch); + if (curl_errno($ch)) { + $curl_error = curl_error($ch); + curl_close($ch); + + throw new Exception('Curl error ' . $curl_error, 500); + } + curl_close($ch); + $return = new stdClass(); + if (is_resource($fp)) { + rewind($fp); + $return->raw = stream_get_contents($fp); + } else { + $return->raw = $file_get_contents; + } + if (false !== strpos($transfer['content_type'], 'application/json')) { + $return->json = json_decode($return->raw); + if (is_resource($fp)) { + $meta_data = stream_get_meta_data($fp); + unlink($meta_data['uri']); + } + } + $code = $transfer['http_code']; + if (200 != $code && !isset($return->json)) { + $return->json = new stdClass(); + $return->json->error = new stdClass(); + $return->json->error->message = 'Error performing HTTP request'; + $return->json->error->code = $code; + } + $return->transfer = $transfer; + + return $return; +} + +function getFormatBytes($bytes, int $round = 1): string +{ + if (!is_numeric($bytes)) { + return (string) $bytes; + } + if ($bytes < 1000) { + return "$bytes B"; + } + $units = ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; + foreach ($units as $k => $v) { + $multiplier = pow(1000, $k + 1); + $threshold = $multiplier * 1000; + if ($bytes < $threshold) { + $size = round($bytes / $multiplier, $round); + + return "$size $v"; + } + } +} + +function getBytesToMb($bytes, int $round = 2): float +{ + $mb = $bytes / pow(10, 6); + if ($round) { + $mb = round($mb, $round); + } + + return $mb; +} + +function downloadFile(string $url, array $params, string $filePath, bool $post = true): object +{ + $fp = fopen($filePath, 'wb+'); + if (!$fp) { + throw new Exception("Can't open temp file " . $filePath . ' (wb+)'); + } + $ops = [ + CURLOPT_FILE => $fp, + ]; + if ($params !== []) { + $ops[CURLOPT_POSTFIELDS] = http_build_query($params); + } + if ($post) { + $ops[CURLOPT_POST] = true; + } + $curl = curl($url, $ops); + fclose($fp); + + return $curl; +} + +function downloadAction(string $workingDir, array $params): Response +{ + $fileBasename = 'chevereto.zip'; + $filePath = $workingDir . '/' . $fileBasename; + unlinkIfExists($filePath); + $isPost = false; + $zipBall = ZIP_BALL; + $tag = $params['tag'] ?? 'latest'; + $zipBall = str_replace('%tag%', $tag, $zipBall); + $isPost = true; + $curl = downloadFile($zipBall, $params, $filePath, $isPost); + if (isset($curl->json->error)) { + throw new RuntimeException($curl->json->error->message, $curl->json->status_code); + } + if ($curl->transfer['http_code'] !== 200) { + $error = '[HTTP ' . $curl->transfer['http_code'] . '] ' . $zipBall; + + throw new RuntimeException($error, $curl->transfer['http_code']); + } + $fileSize = filesize($filePath); + + return new Response( + strtr('Downloaded %f (%w @%s)', [ + '%f' => $fileBasename, + '%w' => getFormatBytes($fileSize), + '%s' => getBytesToMb($curl->transfer['speed_download']) . 'MB/s.', + ]), + [ + 'fileBasename' => $fileBasename, + 'filePath' => $filePath, + ] + ); +} + +function extractAction(string $pathTo, string $filePath): Response +{ + if (!file_exists($pathTo) && !mkdir($pathTo)) { + throw new Exception(sprintf("Working path %s doesn't exists and can't be created", $pathTo), 500); + } + if (!is_readable($pathTo)) { + throw new Exception(sprintf('Working path %s is not readable', $pathTo), 500); + } + if (!is_readable($filePath)) { + throw new Exception(sprintf("Can't read %s", basename($filePath)), 500); + } + $zip = new ZipArchive(); + $timeStart = microtime(true); + $zipOpen = $zip->open($filePath); + if ($zipOpen !== true) { + throw new Exception(strtr("Can't extract %f - %m (ZipArchive #%z)", [ + '%f' => $filePath, + '%m' => 'ZipArchive ' . $zipOpen . ' error', + '%z' => $zipOpen, + ]), 500); + } + $numFiles = $zip->numFiles - 1; + $extraction = $zip->extractTo($pathTo); + if (!$extraction) { + throw new Exception("Unable to extract to"); + } + $zip->close(); + $timeTaken = round(microtime(true) - $timeStart, 2); // + clearstatcache(true, $pathTo); + + return new Response( + strtr('Extraction completed for %n files in %ss', ['%n' => $numFiles, '%s' => $timeTaken]), + [ + 'numFiles' => $numFiles, + 'timeTaken' => $timeTaken, + ] + ); +} + +function abort(string $message) +{ + logger($message); + die(255); +} + +function passthruEnabled(): bool +{ + if (!function_exists('passthru')) { + return false; + } + $disabled = explode(',', ini_get('disable_functions')); + + return !in_array('passthru', $disabled); +} + +function unlinkIfExists(string $file): void +{ + if (!file_exists($file)) { + return; + } + unlink($file); +} + +class Response +{ + public string $message; + + public array $data; + + public function __construct(string $message, array $data = []) + { + $this->message = $message; + $this->data = $data; + } +} diff --git a/content/legacy/themes/Peafowl/lib/chevereto.js b/content/legacy/themes/Peafowl/lib/chevereto.js index f06aa05..ccad89c 100644 --- a/content/legacy/themes/Peafowl/lib/chevereto.js +++ b/content/legacy/themes/Peafowl/lib/chevereto.js @@ -2161,20 +2161,27 @@ $(function () { ) == -1 ) { PF.fn.modal.simple({ - title: ' ' + PF.fn._s("Update available v%s", data.current_version), + title: ' ' + PF.fn._s("Chevereto v%s available", data.current_version), message: "

" + - PF.fn._s("There is an update available for this system.") + - "

" + + PF.fn._s("There is a new Chevereto version available with the following release notes.") + + ' ' + + PF.fn._s("Check %s for a complete changelog since you last upgrade.", '' + CHV.obj.system_info.version + '') + + '

' + '" + + '

' + + PF.fn._s("Check the %s for alternative update methods.", '' + PF.fn._s('documentation') + '') + + '

' + '
' + - '' + - '' + + '' + + '' + '' + - PF.fn._s("Update instructions") + + PF.fn._s("Upgrade now") + '' + - '
', + ' ' + + '', html: true, }); } else { @@ -2189,7 +2196,30 @@ $(function () { }); if (typeof PF.fn.get_url_var("checkUpdates") !== typeof undefined) { - $("[data-action=check-for-updates]").click(); + $("[data-action=check-for-updates]").trigger("click"); + } + if (typeof PF.fn.get_url_var("upgrade") !== typeof undefined) { + $("[data-action=upgrade]").trigger("click"); + } + if (typeof PF.fn.get_url_var("license") !== typeof undefined) { + $("[data-action='license']").trigger("click"); + } + if (typeof PF.fn.get_url_var("installed") !== typeof undefined) { + PF.fn.modal.simple({ + title: ' ' + PF.fn._s("Chevereto v%s installed", CHV.obj.system_info.version), + message: "

" + + PF.fn._s('Usage of Chevereto Software must be in compliance with the software license terms known as "The Chevereto License".') + + '

' + + '
' + + '' + + '' + + '' + + PF.fn._s("License agreement") + + '' + + ' ' + + '
', + html: true, + }); } $(document).on("click", "[data-action=system-update]", function (e) { if (!$("input#system-update").prop("checked")) { @@ -2832,7 +2862,31 @@ $(function () { $icon.addClass(iconClass); }); - + $(document).on("click", "[href^='https://chevereto.com/']", function(e) { + let hasBadge = $(this).find(".badge--paid").exists(); + if(!hasBadge) { + return; + } + let href = $(this).attr("href"); + let buyFrom = PF.fn._s('Get a license from %s to unlock all features and support.', 'chevereto.com'); + let instructions = PF.fn._s('You can enter your license key in the dashboard panel.'); + e.preventDefault(); + e.stopPropagation(); + PF.fn.modal.simple({ + html: true, + title: ' Upgrade Chevereto', + message: "

" + buyFrom + + " " + instructions + "

" + + '
' + + '' + + '' + + '' + + PF.fn._s("Enter license") + + '' + + ' ' + + '
', + }); + }) }); if (typeof CHV == "undefined") { @@ -3198,7 +3252,6 @@ CHV.fn.listingViewer = { var object = this.getObject(true); var template = this.getEl("template").html(); var matches = template.match(/%(\S+)%/g); - console.log(object) if (matches) { $.each(matches, function (i, v) { var handle = v.slice(1, -1).split("."); @@ -4715,7 +4768,6 @@ CHV.fn.resource_privacy_toggle = function (privacy) { } }; -// Album stuff CHV.fn.submit_create_album = function () { var $modal = $(PF.obj.modal.selectors.root); if ($("[name=form-album-name]", $modal).val() == "") { @@ -6424,3 +6476,43 @@ CHV.fn.Palettes = { }, 400); } } + +CHV.fn.license = { + set: { + submit: function () { + var $modal = $(PF.obj.modal.selectors.root), + submit = true; + $.each($(":input", $modal), function (i, v) { + if ($(this).val() == "" && $(this).attr("required")) { + $(this).highlight(); + submit = false; + } + }); + if (!submit) { + PF.fn.growl.call(PF.fn._s("Please fill all the required fields.")); + return false; + } + PF.obj.modal.form_data = { + action: "set-license-key", + key: $("[name=chevereto-license-key]", $modal).val(), + }; + return true; + }, + complete: { + success: function (XHR) { + let response = XHR.responseJSON; + let $trigger = $("[data-action=upgrade]"); + if(CHV.obj.system_info.edition === 'free') { + $trigger.removeClass("hidden"); + $trigger.trigger("click"); + return; + } + PF.fn.growl.call(PF.fn._s(response.success.message)); + }, + error: function (XHR) { + var response = XHR.responseJSON; + PF.fn.growl.call(PF.fn._s(response.error.message)); + }, + }, + }, +}; diff --git a/content/legacy/themes/Peafowl/lib/chevereto.min.js b/content/legacy/themes/Peafowl/lib/chevereto.min.js index 997c621..15744e4 100644 --- a/content/legacy/themes/Peafowl/lib/chevereto.min.js +++ b/content/legacy/themes/Peafowl/lib/chevereto.min.js @@ -1,4 +1,4 @@ $(function(){function e(e){e=e.originalEvent;var t=!1;if(e.dataTransfer.types)for(var a=0;ae&&(a.height(e),a.closest(".antiscroll-wrap").antiscroll())}}function a(e){e.addClass("list-item-play-gif--loading");var t=e.closest(PF.obj.listing.selectors.list_item),a=$(".image-container",t),o=$("img",a),i=o.attr("src"),n=".md",s=i.lastIndexOf(n);if(-1==s)n=".th",s=i.lastIndexOf(n);var r=i.substr(0,s)+i.substr(s+n.length,i.length);a.append(a.html()),$load=t.find(".image-container img").eq(1).attr("src",r).addClass("hidden"),$load.imagesLoaded(function(){e.remove(),o.remove(),$("img",a).show(),$(this.elements).removeClass("hidden")})}function o(e,t){var a=$(e).closest(PF.obj.listing.selectors.list_item);CHV.fn.list_editor.blink(a),CHV.fn.list_editor.toggleSelectItem(a),PF.fn.keyFeedback.spawn(t),t.preventDefault(),t.stopPropagation()}var i,n=$(window).width();$(window).height();if($(window).resize(function(e){clearTimeout(i),i=setTimeout(function(){$("body#image").exists()&&n!=$(window).width()&&CHV.fn.image_viewer_full_fix(),CHV.fn.uploader.boxSizer(),CHV.fn.bindSelectableItems(),CHV.fn.listingViewer.placeholderSizing(),n=$(window).width(),$(window).height()},250)}),window.opener&&($(window).on("load",function(e){window.opener.postMessage({id:window.name,requestAction:"postSettings"},"*")}),$(window).on("message",function(e){var t=e.originalEvent.data;void 0!==t.id&&void 0!==t.settings&&window.name===t.id&&(CHV.obj.opener.uploadPlugin[t.id]=t.settings)})),$("#home-cover, #maintenance-wrapper, #login").exists()){var s=$("#maintenance-wrapper").exists()?$("#maintenance-wrapper").css("background-image").slice(4,-1).replace(/^\"|\"$/g,""):$(".home-cover-img","#home-cover-slideshow").first().attr("data-src");function r(){$("body").addClass("load"),$("#maintenance-wrapper").exists()||$(".home-cover-img","#home-cover-slideshow").first().css("background-image","url("+s+")").addClass("animate-in--alt").removeAttr("data-src"),setTimeout(function(){setTimeout(function(){$("body").addClass("loaded")},1200),setTimeout(function(){d()},7e3)},600)}var l=function(){setTimeout(function(){d()},8e3)};function d(){var e=$(".home-cover-img[data-src]","#home-cover-slideshow").first(),t=$(".home-cover-img","#home-cover-slideshow");if(0==e.length){if(1==t.length)return;t.first().removeClass("animate-in"),$("#home-cover-slideshow").append(t.first()),setTimeout(function(){$(".home-cover-img:last","#home-cover-slideshow").addClass("animate-in")},20),setTimeout(function(){$(".home-cover-img:not(:last)","#home-cover-slideshow").removeClass("animate-in")},4e3),l()}else{var a=e.attr("data-src");$("").attr("src",a).on("load error",function(){$(this).remove(),e.css("background-image","url("+a+")").addClass("animate-in").removeAttr("data-src"),setTimeout(function(){$(".home-cover-img:not(:last)","#home-cover-slideshow").removeClass("animate-end animate-in--alt")},2e3),l()})}}s?$("").attr("src",s).on("load error",function(){$(this).remove(),r()}):r()}var c,u=CHV.fn.uploader.selectors.root,m=CHV.fn.uploader.selectors.queue,f=$(u),p=$(m);if($(document).on("click","[data-action=top-bar-upload]",function(e){$("body").is("#upload")||"js"!==$(this).data("link")||CHV.fn.uploader.toggle({reset:!1}),"page"!==$(this).data("link")&&(e.preventDefault(),e.stopPropagation())}),$(document).on("click mouseover mouseout","[data-action=palette]",function(e){clearTimeout(c),e.preventDefault();var t=$(this).data("palette");switch(e.type){case"mouseover":c=setTimeout(function(){CHV.fn.Palettes.preview(t)},1e3);break;case"mouseout":t=$("html").attr("data-palette")||"",CHV.fn.Palettes.set(t);break;case"click":e.stopPropagation(),$("[data-action=palette]","[data-content=palettes]").removeClass("current"),$(this).addClass("current"),CHV.fn.Palettes.set(t),CHV.fn.Palettes.save()}}),$(document).on("change","#palettes",function(e){CHV.fn.Palettes.set(this.value),CHV.fn.Palettes.save()}),$("[data-action=close-upload]",f).click(function(){f.is(":animated")||$("[data-action=top-bar-upload]","#top-bar").trigger("click")}),$("[data-action=reset-upload]",f).click(function(){CHV.fn.uploader.isUploading&&$("[data-action=cancel-upload-remaining], [data-action=cancel-upload]",f).trigger("click"),CHV.fn.uploader.reset()}),$("[data-action=cancel-upload-remaining], [data-action=cancel-upload]",f).click(function(){CHV.fn.uploader.isUploading=!1,$("[data-action=cancel]",p).click(),Object.size(CHV.fn.uploader.results.success)>0?CHV.fn.uploader.displayResults():CHV.fn.uploader.reset()}),$(document).on("click","[data-action=upload-privacy]:not(disabled)",function(e){e.isDefaultPrevented()||(current_privacy=$(this).data("privacy"),target_privacy="public"==current_privacy?"private":"public",this_lock=$(".icon",this).data("lock"),this_unlock=$(".icon",this).data("unlock"),$(".icon",this).removeClass(this_lock+" "+this_unlock).addClass("public"==current_privacy?this_lock:this_unlock),$(this).data("privacy",target_privacy),$("[data-action=upload-privacy-copy]").html($("[data-action=upload-privacy]").html()),$upload_button=$("[data-action=upload]",f),$upload_button.text($upload_button.data(target_privacy)),$(this).tipTip("hide"))}),$(CHV.fn.uploader.selectors.file+", "+CHV.fn.uploader.selectors.camera).on("change",function(e){$(CHV.fn.uploader.selectors.root).data("shown")?CHV.fn.uploader.add(e):CHV.fn.uploader.toggle({callback:function(e){CHV.fn.uploader.add(e)}},e)}).on("click",function(e){!$(this).data("login-needed")||PF.fn.is_user_logged()}),$(CHV.fn.uploader.selectors.root).exists()&&($("body").on({dragenter:function(t){if(t.preventDefault(),!e(t))return!1;$(CHV.fn.uploader.selectors.dropzone).exists()||$("body").append($('
').css({width:"100%",height:"100%",position:"fixed",zIndex:1e3,left:0,top:0}))}}),$(document).on({dragover:function(t){if(t.preventDefault(),!e(t))return!1;$(CHV.fn.uploader.selectors.root).data("shown")||CHV.fn.uploader.toggle({reset:!1})},dragleave:function(e){$(CHV.fn.uploader.selectors.dropzone).remove(),$.isEmptyObject(CHV.fn.uploader.files)&&CHV.fn.uploader.toggle()},drop:function(e){e.preventDefault(),CHV.fn.uploader.add(e),$(CHV.fn.uploader.selectors.dropzone).remove()}},CHV.fn.uploader.selectors.dropzone)),$(document).on("keyup change","[data-action=resize-combo-input]",function(e){var t=$(this).closest("[data-action=resize-combo-input]"),a=$("[name=form-width]",t),o=$("[name=form-height]",t),i=a.data("initial")/o.data("initial"),n={width:Math.round(a.prop("value")/i),height:Math.round(o.prop("value")*i)};$(e.target).is(a)?o.prop("value",Math.round(n.width)):a.prop("value",Math.round(n.height))}),$(document).on("click",m+" [data-action=edit]",function(){for(var e=$(this).closest("li"),t=(e.closest("ul"),e.data("id")),a=CHV.fn.uploader.files[t],o=PF.obj.modal.selectors.root,i=$.extend({},a.formValues||a.parsedMeta),n=["album_id","category_id","nsfw"],s=0;se.height&&(n.height=e.height,n.width=Math.round(n.height*s)),n.width>e.width&&(n.width=e.width,n.height=Math.round(n.width/s)),$.each(i,function(e,t){var i="[name=form-"+e.replace(/_/g,"-")+"]",s=$(i,o);if(!s.exists())return!0;if(s.is(":checkbox"))s.prop("checked",s.attr("value")==t);else if(s.is("select")){var r=s.find("[value="+t+"]");r.exists()||(r=s.find("option:first")),r.prop("selected",!0)}else s.prop("value",t);if("width"==e||"height"==e){var l=n[e],d=a.parsedMeta[e]>l?l:a.parsedMeta[e];s.prop("max",d).data("initial",a.parsedMeta[e]).prop("value",d)}}),"image/gif"!==a.parsedMeta.mimetype&&$("[ data-content=animated-gif-warning]",o).remove(),$(".image-preview",o).append($("",{class:"canvas checkered-background"}));var r=$(".queue-item[data-id="+t+"] .preview .canvas")[0],l=$(".image-preview .canvas",o)[0];l.width=r.width,l.height=r.height;var d=l.getContext("2d");d.drawImage(r,0,0)},confirm:function(){if(PF.fn.form_modal_has_changed()){var e=!1;return $.each(["width","height"],function(t,a){var i=$("[name=form-"+a+"]",o),n=parseInt(i.val()),s=parseInt(i.attr("min")),r=parseInt(i.attr("max"));if(n>r||n-1&&CHV.fn.uploader.clipboardImages.splice(s,1)}delete CHV.fn.uploader.files[a],CHV.fn.uploader.queueSize(),0==Object.size(CHV.fn.uploader.files)?"success"in CHV.fn.uploader&&"results"in CHV.fn.uploader&&(0!=Object.size(CHV.fn.uploader.results.success)||0!=Object.size(CHV.fn.uploader.results.error))||CHV.fn.uploader.reset():i&&0!==$("li.waiting",t).first().length&&CHV.fn.uploader.upload($("li.waiting",t).first())}}),$(document).on("click","[data-action=upload]",function(){void 0!==CHV.obj.logged_user||!1!==$("#upload-tos").prop("checked")?($("[data-group=upload], [data-group=upload-queue-ready]",f).hide(),f.removeClass("queueReady").addClass("queueUploading").find("[data-group=uploading]").show(),CHV.fn.uploader.queueSize(),CHV.fn.uploader.canAdd=!1,$queue_items=$("li",p),$queue_items.addClass("uploading waiting"),CHV.fn.uploader.timestamp=(new Date).getTime(),CHV.fn.uploader.upload($queue_items.first("li"))):PF.fn.growl.call("You must agree to the terms and privacy policy")}),$("body#user").exists()&&PF.obj.listing.query_string.page>1){var g=History.getState();if(g.data&&void 0!==g.data.scrollTop)$(window).scrollTop()!==g.data.scrollTop&&$(window).scrollTop(g.data.scrollTop);else{var h=$("#background-cover").height()-160;$("html, body").animate({scrollTop:h},0)}}$("#top-bar-shade").exists()&&$("#top-bar-shade").css("opacity")&&$("#top-bar-shade").data("initial-opacity",Number($("#top-bar-shade").css("opacity"))),CHV.fn.bindSelectableItems(),$("body#image").exists()&&($(CHV.obj.image_viewer.selector+" [data-load=full]").length>0&&($(document).on("click",CHV.obj.image_viewer.loader,function(e){CHV.fn.viewerLoadImage()}),$(CHV.obj.image_viewer.loader).data("size")>CHV.obj.config.image.load_max_filesize.getBytes()?$(CHV.obj.image_viewer.loader).css("display","block"):CHV.fn.viewerLoadImage()),new MutationObserver(()=>{$("html").height()>$(window).innerHeight()&&!$("html").hasClass("scrollbar-y")&&($("html").addClass("scrollbar-y"),$(document).data({width:$(this).width(),height:$(this).height()}))}).observe(document,{childList:!0}),$(document).on("keyup",function(e){var t=$(e.target),a=e.originalEvent;if(!t.is(":input")&&CHV.obj.image_viewer.$navigation.exists()&&("ArrowLeft"==a.key||"ArrowRight"==a.key)){var o=$("[data-action="+("ArrowLeft"==a.key?"prev":"next")+"]",CHV.obj.image_viewer.$navigation).attr("href");void 0!==o&&""!==o&&(window.location=$("[data-action="+("ArrowLeft"==a.key?"prev":"next")+"]",CHV.obj.image_viewer.$navigation).attr("href"))}})),$(document).on("click",CHV.obj.image_viewer.container+" img",function(e){if($(this).hasClass("cursor-zoom-in")||$(this).hasClass("cursor-zoom-out")){var t=$(this).hasClass("cursor-zoom-in");if($(this).removeClass("cursor-zoom-in cursor-zoom-out"),t){var a,o=$(this).attr("width"),i=$(this).attr("height"),n=o/i;o>$(window).width()?($(this).css("width","100%"),a=$(this).width(),$(this).css("width",o)):a=$(this).attr("width"),$(this).addClass("cursor-zoom-out").css({width:a,height:a/n+"px"}),$("#image-viewer-container").css("height","")}else $(this).addClass("cursor-zoom-in"),image_viewer_full_fix();e.preventDefault()}}).on("contextmenu",CHV.obj.image_viewer.container,function(e){if(!CHV.obj.config.image.right_click)return e.preventDefault(),!1}),$(document).on("contextmenu","html.device-mobile a.image-container",function(e){e.preventDefault(),e.stopPropagation()}),$(document).on("keyup","input[data-dashboard-tool]",function(e){if(13==e.keyCode){var t=$("[data-action="+$(this).data("dashboard-tool")+"]");t.click()}}),$(document).on("click","[data-action=dashboardTool]",function(e){e.preventDefault();var t=$(this).data("tool"),a=$(this).data("data"),o=$.extend({},a),i={};for(var n in o){var s=$(o[n]).val();if($(o[n]).prop("disabled")||!s)return;i[n]=$(o[n]),o[n]=s}o.action=t;var r={type:"GET",cache:!1};r.data=o;var l,d=$(this).closest(".input-label"),c=!0;if(0!=c){for(var n in i);PF.fn.loading.inline($(".loading",d),{size:"small",valign:"middle"}),d.find(".btn .text").hide(),$.ajax(r).complete(function(e){var t=e.responseJSON;$(".loading",d).empty(),d.find(".btn .text").show(),200!=t.status_code||void 0===t.success.redirURL?PF.fn.growl.call(t[200==t.status_code?"success":"error"].message):window.location.href=t.success.redirURL})}else PF.fn.growl.expirable(l)}),$(document).on("click","[data-action=openerPostMessage]",function(e){if(window.opener){e.preventDefault();var t="data-action-target",a=$($(this).is("["+t+"]")?$(this).attr(t):this),o=a[a.is(":input")?"val":"html"]();window.opener.postMessage({id:window.name,message:o},"*")}}),$(document).on("click","[data-action=list-tools] [data-action]",function(e){var t=$(e.target),a=t.closest("[data-id]");a&&a.find("[data-action=select]").exists()&&(e.ctrlKey||e.metaKey)&&e.altKey&&(CHV.fn.list_editor.toggleSelectItem(a,!a.hasClass("selected")),e.preventDefault(),e.stopPropagation())}),PF.fn.listing.ajax.callback=function(e){200===e.status&&CHV.fn.list_editor.listMassActionSet("select")},$(document).on("click","[data-action=list-select-all]",function(e){if($(this).closest(".disabled").exists())return!1;CHV.fn.list_editor.selectAll(e)}),$(document).on("click","[data-action=list-clear-all]",function(){CHV.fn.list_editor.clearSelection()}),$(document).on("click","[data-action=share]",function(e){if(!$(PF.obj.modal.selectors.box).exists()){var t,a,o,i,n,s;t=$(".viewer:visible").exists()?$(PF.obj.listing.selectors.list_item+"[data-id="+$(".viewer").attr("data-id")+"]",".content-listing").first():$(this).closest(PF.obj.listing.selectors.list_item).first();var r="#modal-share";if(t.exists()){if(s=CHV.fn.modal.getTemplateWithPreview(r,t),void 0===t.attr("data-type"))return void console.log("Error: data-type not defined");n=t.find(".list-item-desc-title-link").first(),o=t.find(".image-container img").first().attr("src"),a=t.attr("data-url-short")}else s=$(r).html(),dealing_with=CHV.obj.resource.type,a=window.location.href,o=$("#image-viewer-container").find("img").first().attr("src"),n=$(".header > h1 > a");i=PF.fn.htmlEncode(n.text());var l=t.data("privacy")||CHV.obj.resource.privacy,d="";switch(l){case"private_but_link":d=PF.fn._s("Note: This content is private but anyone with the link will be able to see this.");break;case"password":d=PF.fn._s("Note: This content is password protected. Remember to pass the content password to share.");break;case"private":d=PF.fn._s('Note: This content is private. Change privacy to "public" to share.')}s=s.replaceAll("__url__",a).replaceAll("__image__",o).replaceAll("__title__",i).replaceAll("__privacy__",l).replaceAll("__privacy_notes__",d),PF.fn.modal.call({type:"html",buttons:!1,template:s})}}),$(document).on("click","[data-action=list-tools] [data-action]",function(e){if(e.isPropagationStopped())return!1;var t;t=$(".viewer:visible").exists()?$(PF.obj.listing.selectors.list_item+"[data-id="+$(".viewer").attr("data-id")+"]",".content-listing").first():$(this).closest(PF.obj.listing.selectors.list_item).first();var a=t.attr("data-id");if(void 0!==t.attr("data-type")){o=t.attr("data-type");var o,i=$("[data-type="+o+"][data-id="+a+"]");switch($(this).data("action")){case"select":CHV.fn.list_editor.toggleSelectItem(t,!t.hasClass("selected"));break;case"edit":var n="[data-modal=form-edit-single]";switch(o){case"image":$("[name=form-image-title]",n).attr({value:t.attr("data-title"),autocomplete:"off"}),$("[name=form-image-description]",n).html(PF.fn.htmlEncode(t.data("description"))),$("[name=form-album-id]",n).find("option").removeAttr("selected"),$("[name=form-album-id]",n).find("[value="+t.data("image"==o?"album-id":"id")+"]").attr("selected",!0),$("[name=form-category-id]",n).find("option").removeAttr("selected"),$("[name=form-category-id]",n).find("[value="+t.data("category-id")+"]").attr("selected",!0),$("[name=form-nsfw]",n).attr("checked","unsafe"==t.data("flag")),$("[name=form-album-name]",n).attr({value:"",autocomplete:"off"}),$("[name=form-album-description]",n).html(""),$("[name=form-privacy]",n).find("option").removeAttr("selected");break;case"album":$("[data-action=album-switch]",n).remove(),$("[name=form-album-name]",n).attr({value:t.data("name"),autocomplete:"off"}),$("[name=form-album-description]",n).html(PF.fn.htmlEncode(t.data("description"))),$("[name=form-privacy]",n).find("option").removeAttr("selected"),$("[name=form-privacy]",n).find("[value="+t.data("privacy")+"]").attr("selected",!0),"password"==t.data("privacy")?($("[data-combo-value=password]").show(),$("[name=form-album-password]",n).attr("value",t.data("password"))):($("[data-combo-value=password]").hide(),$("[name=form-album-password]",n).attr("value",""))}PF.fn.modal.call({type:"html",template:CHV.fn.modal.getTemplateWithPreview(n,t),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){CHV.fn.list_editor.updateItem("[data-type="+o+"][data-id="+a+"]",e.responseJSON[o],"edit")}}},confirm:function(){var e=$(PF.obj.modal.selectors.root);if(("image"==o||"album"==o)&&$("[data-content=form-new-album]",e).is(":visible")&&""==$("[name=form-album-name]",e).val())return PF.fn.growl.call(PF.fn._s("You must enter the album name.")),$("[name=form-album-name]",e).highlight(),!1;if(PF.fn.form_modal_has_changed()){switch(PF.obj.modal.form_data={action:"edit",edit:t.data("type"),single:!0,owner:CHV.obj.resource.user.id,editing:{id:a,description:$("[name=form-"+o+"-description]",e).val()}},o){case"image":PF.obj.modal.form_data.editing.title=$("[name=form-image-title]",e).val(),PF.obj.modal.form_data.editing.category_id=$("[name=form-category-id]",e).val()||null,PF.obj.modal.form_data.editing.nsfw=$("[name=form-nsfw]",e).prop("checked")?1:0;break;case"album":PF.obj.modal.form_data.editing.name=$("[name=form-album-name]",e).val(),PF.obj.modal.form_data.editing.privacy=$("[name=form-privacy]",e).val(),"password"==PF.obj.modal.form_data.editing.privacy&&(PF.obj.modal.form_data.editing.password=$("[name=form-album-password]",e).val())}return PF.obj.modal.form_data.editing.new_album=$("[data-content=form-new-album]",e).is(":visible"),PF.obj.modal.form_data.editing.new_album?(PF.obj.modal.form_data.editing.album_name=$("[name=form-album-name]",e).val(),PF.obj.modal.form_data.editing.album_privacy=$("[name=form-privacy]",e).val(),"password"==PF.obj.modal.form_data.editing.album_privacy&&(PF.obj.modal.form_data.editing.album_password=$("[name=form-album-password]",e).val()),PF.obj.modal.form_data.editing.album_description=$("[name=form-album-description]",e).val()):PF.obj.modal.form_data.editing.album_id=$("[name=form-album-id]",e).val(),!0}PF.fn.modal.close()}});break;case"create-album":case"move":var s="move"==$(this).data("action")?"form-move-single":"form-create-album";n="[data-modal="+s+"]";$("[name=form-album-id]",n).find("option").removeAttr("selected"),$("[name=form-album-id]",n).find("[value="+t.data("image"==o?"album-id":"id")+"]").attr("selected",!0),$("[name=form-album-name]",n).attr({value:"",autocomplete:"off"}),$("[name=form-album-description]",n).html(""),$("[name=form-privacy]",n).find("option").removeAttr("selected"),PF.fn.modal.call({type:"html",template:CHV.fn.modal.getTemplateWithPreview(n,i),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){CHV.fn.list_editor.updateMoveItemLists(e.responseJSON,o,i)}}},load:function(){},confirm:function(){var e=$(PF.obj.modal.selectors.root);return $("[data-content=form-new-album]",e).is(":visible")&&""==$("[name=form-album-name]",e).val()?(PF.fn.growl.call(PF.fn._s("You must enter the album name.")),$("[name=form-album-name]",e).highlight(),!1):PF.fn.form_modal_has_changed()?(PF.obj.modal.form_data={action:"edit",edit:t.data("type"),single:!0,owner:CHV.obj.resource.user.id,editing:{id:a}},PF.obj.modal.form_data.editing.new_album=$("[data-content=form-new-album]",e).is(":visible"),PF.obj.modal.form_data.editing.new_album?(PF.obj.modal.form_data.editing.album_name=$("[name=form-album-name]",e).val(),PF.obj.modal.form_data.editing.album_privacy=$("[name=form-privacy]",e).val(),"password"==PF.obj.modal.form_data.editing.album_privacy&&(PF.obj.modal.form_data.editing.album_password=$("[name=form-album-password]",e).val()),PF.obj.modal.form_data.editing.album_description=$("[name=form-album-description]",e).val()):PF.obj.modal.form_data.editing.album_id=$("[name=form-album-id]",e).val(),!0):void PF.fn.modal.close()}});break;case"approve":PF.fn.modal.call({type:"html",template:CHV.fn.modal.getTemplateWithPreview("[data-modal=form-approve-single]",t),button_submit:PF.fn._s("Confirm"),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){CHV.fn.list_editor.removeFromList(t,PF.fn._s("The content has been approved."))}}},confirm:function(){return PF.obj.modal.form_data={action:"approve",single:!0,approve:t.data("type"),approving:{id:a}},!0}});break;case"delete":PF.fn.modal.call({type:"html",template:CHV.fn.modal.getTemplateWithPreview("[data-modal=form-delete-single]",t),button_submit:PF.fn._s("Confirm"),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){"album"==o&&($("[name=form-album-id]","[data-modal]").find("[value="+a+"]").remove(),CHV.fn.list_editor.updateUserCounters("image",e.responseJSON.success.affected,"-")),CHV.fn.list_editor.deleteFromList(t),CHV.fn.listingViewer.close()}}},confirm:function(){return PF.obj.modal.form_data={action:"delete",single:!0,delete:t.data("type"),deleting:{id:a}},!0}});break;case"flag":$.ajax({type:"POST",data:{action:"edit",edit:"image",single:!0,editing:{id:a,nsfw:"unsafe"==t.data("flag")?0:1}}}).complete(function(e){var t=e.responseJSON;if(200==t.status_code){var a=1==t.image.nsfw?"unsafe":"safe";i.attr("data-flag",a).data("flag",a)}else PF.fn.growl.call(t.error.message);CHV.fn.list_editor.selectionCount()})}}else console.log("Error: data-type not defined")}),$(".pop-box-menu a","[data-content=list-selection]").click(function(e){var t=$(PF.obj.listing.selectors.content_listing_visible);if(void 0!==t.data("list")){dealing_with=t.data("list");var a=$(PF.obj.listing.selectors.list_item+".selected",t),o=$.map(a,function(e,t){return $(e).data("id")});switch(PF.fn.close_pops(),"list-select-all"!==$(this).data("action")&&e.stopPropagation(),$(this).data("action")){case"get-embed-codes":var i="[data-modal=form-embed-codes]",n=[];$("textarea",i).html(""),a.each(function(){var e={image:JSON.parse(decodeURIComponent($(this).data("object")))};"url"in e.image&&n.push(e)}),CHV.fn.fillEmbedCodes(n,i,"html"),PF.fn.modal.call({type:"html",template:CHV.fn.modal.getTemplateWithPreviews(i,a),buttons:!1});break;case"clear":CHV.fn.list_editor.clearSelection();break;case"list-select-all":CHV.fn.list_editor.selectAll(e);break;case"move":case"create-album":i="move"==$(this).data("action")?"form-move-multiple":"form-create-album";var s="[data-modal="+i+"]",r=/image/.test(dealing_with)?"album-id":"id";$("[name=form-album-id]",s).find("[value=null]").remove(),$("[name=form-album-id]",s).find("option").removeAttr("selected"),$("[name=form-album-name]",s).attr({value:"",autocomplete:"off"}),$("[name=form-album-description]",s).html(""),$("[name=form-privacy]",s).find("option").removeAttr("selected");var l=a.first().data(r),d=!0;a.each(function(){if($(this).data(r)!==l)return d=!1,!1}),d||$("[name=form-album-id]",s).prepend('"),$("[name=form-album-id]",s).find("[value="+(d?a.first().data(r):"null")+"]").attr("selected",!0),PF.fn.modal.call({type:"html",template:CHV.fn.modal.getTemplateWithPreviews(s,a),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){CHV.fn.list_editor.updateMoveItemLists(e.responseJSON,dealing_with,a)}}},load:function(){},confirm:function(){var e=$(PF.obj.modal.selectors.root),t=!1;if($("[data-content=form-new-album]",e).is(":visible")&&""==$("[name=form-album-name]",e).val())return PF.fn.growl.call(PF.fn._s("You must enter the album name.")),$("[name=form-album-name]",e).highlight(),!1;if($("[data-content=form-new-album]",e).is(":visible")&&(t=!0),PF.fn.form_modal_has_changed()){return PF.obj.modal.form_data={action:t?"create-album":"move",type:dealing_with,owner:CHV.obj.resource.user.id,multiple:!0,album:{ids:o,new:t}},t?(PF.obj.modal.form_data.album.name=$("[name=form-album-name]",e).val(),PF.obj.modal.form_data.album.privacy=$("[name=form-privacy]",e).val(),"password"==PF.obj.modal.form_data.album.privacy&&(PF.obj.modal.form_data.album.password=$("[name=form-album-password]",e).val()),PF.obj.modal.form_data.album.description=$("[name=form-album-description]",e).val()):PF.obj.modal.form_data.album.id=$("[name=form-album-id]",e).val(),!0}PF.fn.modal.close()}});break;case"approve":PF.fn.modal.call({template:CHV.fn.modal.getTemplateWithPreviews("[data-modal=form-approve-multiple]",a),button_submit:PF.fn._s("Confirm"),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){CHV.fn.list_editor.removeFromList(a,PF.fn._s("The content has been approved."))}}},confirm:function(){return PF.obj.modal.form_data={action:"approve",from:"list",approve:dealing_with,multiple:!0,approving:{ids:o}},!0}});break;case"delete":PF.fn.modal.call({template:CHV.fn.modal.getTemplateWithPreviews("[data-modal=form-delete-multiple]",a),button_submit:PF.fn._s("Confirm"),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){"albums"==dealing_with&&(a.each(function(){$("[name=form-album-id]","[data-modal]").find("[value="+$(this).data("id")+"]").remove()}),CHV.fn.list_editor.updateUserCounters("image",e.responseJSON.success.affected,"-")),CHV.fn.list_editor.deleteFromList(a)}}},confirm:function(){return PF.obj.modal.form_data={action:"delete",from:"list",delete:dealing_with,multiple:!0,deleting:{ids:o}},!0}});break;case"assign-category":var c=a.first().data("category-id"),u=!0;a.each(function(){if($(this).data("category-id")!==c)return u=!1,!1}),PF.fn.modal.call({type:"html",template:CHV.fn.modal.getTemplateWithPreviews("[data-modal=form-assign-category]",a),forced:!0,ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){a.each(function(){var t=e.responseJSON;$(this).data("category-id",t.category_id)}),CHV.fn.list_editor.clearSelection()}}},confirm:function(){var e=$(PF.obj.modal.selectors.root),t=$("[name=form-category-id]",e).val()||null;return u&&c==t?(PF.fn.modal.close(function(){CHV.fn.list_editor.clearSelection()}),!1):(PF.obj.modal.form_data={action:"edit-category",from:"list",multiple:!0,editing:{ids:o,category_id:t}},!0)}});break;case"flag-safe":case"flag-unsafe":var m=$(this).data("action"),f="flag-safe"==m?"safe":"unsafe";PF.fn.modal.call({template:CHV.fn.modal.getTemplateWithPreviews("[data-modal=form-"+m+"]",a),button_submit:PF.fn._s("Confirm"),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){a.each(function(){$(this).removeClass("safe unsafe").addClass(f).removeAttr("data-flag").attr("data-flag",f).data("flag",f)}),CHV.fn.list_editor.clearSelection()}}},confirm:function(){return PF.obj.modal.form_data={action:m,from:"list",multiple:!0,editing:{ids:o,nsfw:"flag-safe"==m?0:1}},!0}})}return!PF.fn.isDevice(["phone","phablet"])&&void 0}console.log("Error: data-list not defined")}),$(document).on("click","[data-action=disconnect]",function(){var e=$(this),t=e.data("connection");PF.fn.modal.confirm({message:e.data("confirm-message"),ajax:{data:{action:"disconnect",disconnect:t,user_id:CHV.obj.resource.user.id},deferred:{success:function(e){var a=e.responseJSON;$("[data-connection="+t+"]").fadeOut(function(){$($("[data-connect="+t+"]")).fadeIn(),$(this).remove(),0==$("[data-connection]").length&&$("[data-content=empty-message]").show(),PF.fn.growl.expirable(a.success.message)}),""!==a.success.redirect&&(window.location.href=a.success.redirect)},error:function(e){var t=e.responseJSON;PF.fn.growl.call(t.error.message)}}}})}),$(document).on("click","[data-action=delete-avatar]",function(){var e=$(".user-settings-avatar"),t=$(".loading-placeholder",e),a=$("#top-bar");t.removeClass("hidden"),PF.fn.loading.inline(t,{center:!0}),$.ajax({type:"POST",data:{action:"delete",delete:"avatar",owner:CHV.obj.resource.user.id}}).complete(function(o){t.addClass("hidden").empty(),200==o.status?(CHV.obj.logged_user.id==CHV.obj.resource.user.id&&($("img.user-image",a).hide(),$(".default-user-image",a).removeClass("hidden")),$(".default-user-image",e).removeClass("hidden").css({opacity:0}),$('[data-action="delete-avatar"]',e).parent().addClass("soft-hidden"),$("img.user-image",e).fadeOut(function(){$(".default-user-image",e).animate({opacity:1})})):PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."))})}),$(document).on("change","[data-content=user-avatar-upload-input]",function(e){e.preventDefault(),e.stopPropagation();var t=$(this),a=$(".user-settings-avatar"),o=$(".loading-placeholder",".user-settings-avatar"),i=$("#top-bar"),n=$(this)[0].files[0];if(!t.data("uploading"))if(0!=/^image\/.*$/.test(n.type))if(n.size>CHV.obj.config.user.avatar_max_filesize.getBytes())PF.fn.growl.call(PF.fn._s("Please select a picture of at most %s size.",CHV.obj.config.user.avatar_max_filesize));else{var s=$('[data-action="delete-avatar"]');o.removeClass("hidden"),PF.fn.loading.inline(o,{center:!0}),t.data("uploading",!0);var r=new FormData;r.append("source",n),r.append("action","upload"),r.append("type","file"),r.append("what","avatar"),r.append("owner",CHV.obj.resource.user.id),r.append("auth_token",PF.obj.config.auth_token),avatarXHR=new XMLHttpRequest,avatarXHR.open("POST",PF.obj.config.json_api,!0),avatarXHR.send(r),avatarXHR.onreadystatechange=function(){if(4==this.readyState){var e="json"!==this.responseType?JSON.parse(this.response):this.response,n=e.success.image;o.addClass("hidden").empty(),200==this.status?(change_avatar=function(e){s.parent().removeClass("soft-hidden"),$("img.user-image",e).attr("src",n.url).removeClass("hidden").show()},hide_default=function(e){ -$(".default-user-image",e).addClass("hidden")},hide_default(a),$(".btn-alt",a).closest("div").show(),change_avatar(a),CHV.obj.logged_user.id==CHV.obj.resource.user.id&&(change_avatar(i),hide_default(i)),PF.fn.growl.expirable(PF.fn._s("Profile image updated."))):PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later.")),t.data("uploading",!1)}}}else PF.fn.growl.call(PF.fn._s("Please select a valid image file type."))}),$(document).on("change","[data-content=user-background-upload-input]",function(e){e.preventDefault(),e.stopPropagation();var t=$(this),a=$("[data-content=user-background-cover]"),o=$("[data-content=user-background-cover-src]"),i=$(".loading-placeholder",a),n=($("#top-bar"),$(this)[0].files[0]);if(!t.data("uploading"))if(0!=/^image\/.*$/.test(n.type))if(n.size>CHV.obj.config.user.background_max_filesize.getBytes())PF.fn.growl.call(PF.fn._s("Please select a picture of at most %s size.",CHV.obj.config.user.background_max_filesize));else{i.removeClass("hidden"),PF.fn.loading.inline(i,{center:!0,size:"big",color:"#FFF"}),t.data("uploading",!0);var s=new FormData;s.append("source",n),s.append("action","upload"),s.append("type","file"),s.append("what","background"),s.append("owner",CHV.obj.resource.user.id),s.append("auth_token",PF.obj.config.auth_token),avatarXHR=new XMLHttpRequest,avatarXHR.open("POST",PF.obj.config.json_api,!0),avatarXHR.send(s),avatarXHR.onreadystatechange=function(){if(4==this.readyState){var e="json"!==this.responseType?JSON.parse(this.response):this.response,n=e.success.image;if(200==this.status){var s=$("");s.attr("src",n.url).imagesLoaded(function(){i.addClass("hidden").empty(),o.css("background-image","url("+n.url+")").hide().fadeIn(),$("[data-content=user-change-background]",a).removeClass("hidden"),$(a).removeClass("no-background"),$(".top-user").removeClass("no-background"),$("[data-content=user-upload-background]").hide(),$("[data-content=user-change-background]").show(),PF.fn.growl.expirable(PF.fn._s("Profile background image updated.")),s.remove()})}else i.addClass("hidden").empty(),PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."));t.data("uploading",!1)}}}else PF.fn.growl.call(PF.fn._s("Please select a valid image file type."))}),CHV.fn.user_background={delete:{submit:function(){return PF.obj.modal.form_data={action:"delete",delete:"background",owner:CHV.obj.resource.user.id},!0},deferred:{success:{before:function(e){$("[data-content=user-background-cover-src]").css("background-image","none"),$("[data-content=user-background-cover], .top-user").addClass("no-background"),$("[data-content=user-background-cover]").height(""),$("[data-content=user-upload-background]").removeClass("hidden").show(),$("[data-content=user-change-background]").hide()},done:function(e){PF.fn.modal.close(function(){PF.fn.growl.expirable(PF.fn._s("Profile background image deleted."))})}},error:function(e){PF.fn.growl.expirable(PF.fn._s("Error deleting profile background image."))}}}},CHV.fn.user_api={delete:{submit:function(){return PF.obj.modal.form_data={action:"delete",delete:"api_key",owner:CHV.obj.resource.user.id},!0},deferred:{success:{before:function(e){},done:function(e){PF.fn.modal.close(function(){location.reload()})}},error:function(e){PF.fn.growl.expirable(e.responseJSON.error.message)}}}},CHV.fn.user_two_factor={delete:{submit:function(){return PF.obj.modal.form_data={action:"delete",delete:"two_factor",owner:CHV.obj.resource.user.id},!0},deferred:{success:{before:function(e){},done:function(e){PF.fn.modal.close(function(){location.reload()})}},error:function(e){PF.fn.growl.expirable(e.responseJSON.error.message)}}}},CHV.str.mainform="[data-content=main-form]",CHV.obj.timezone={selector:"[data-content=timezone]",input:"#timezone-region"},$(document).on("keyup change",CHV.str.mainform+" :input",function(){$(this).is("[name=username]")&&$("[data-text=username]").text($(this).val())}),$(document).on("change",CHV.obj.timezone.input,function(){var e=$(this).val(),t=$("#timezone-combo-"+e);t.find("option:first").prop("selected",!0),$(CHV.obj.timezone.selector).val(t.val()).change()}),$(document).on("change","[id^=timezone-combo-]",function(){var e=$(this).val();$(CHV.obj.timezone.selector).val(e).change()}),$(document).on("keyup change blur","[name^=new-password]",function(){var e=$("[name=new-password]"),t=$("[name=new-password-confirm]"),a=e.val()==t.val(),o=t.closest(".input-password").find(".input-warning");0==o.exists()&&(o=$("[data-message=new-password-confirm]")),$(this).is(t)&&t.data("touched",!0),t.data("touched")&&o.text(a?"":o.data("text"))[a?"addClass":"removeClass"]("hidden-visibility")}),$(document).on("submit",CHV.obj.mainform,function(){switch($(this).data("type")){case"password":var e=$("[name=new-password]",this),t=$("[name=new-password-confirm]",this);if((""!==e.val()||""!==t.val())&&e.val()!==t.val())return e.highlight(),t.highlight(),PF.fn.growl.expirable(PF.fn._s("Passwords don't match")),!1}}),$(document).on("click","[data-action=check-for-updates]",function(){PF.fn.loading.fullscreen(),CHV.fn.system.checkUpdates(function(e){if(PF.fn.loading.destroy("fullscreen"),200===e.status){var t=e.responseJSON.software;-1==PF.fn.versionCompare(CHV.obj.system_info.version,t.current_version)?PF.fn.modal.simple({title:' '+PF.fn._s("Update available v%s",t.current_version),message:"

"+PF.fn._s("There is an update available for this system.")+'

",html:!0}):PF.fn.growl.call(PF.fn._s("This website is running latest %s version",CHEVERETO.edition))}else PF.fn.growl.call(PF.fn._s("An error occurred. Please try again later."))})}),void 0!==PF.fn.get_url_var("checkUpdates")&&$("[data-action=check-for-updates]").click(),$(document).on("click","[data-action=system-update]",function(e){if(!$("input#system-update").prop("checked"))return PF.fn.growl.call(PF.fn._s("Please review the system requirements before proceeding")),void e.preventDefault()}),$(document).on("click","[data-action=toggle-storage-https]",function(){CHV.fn.storage.toggleHttps($(this).closest("[data-content=storage]").data("storage-id"))}),$(document).on("click","[data-action=toggle-storage-active]",function(){CHV.fn.storage.toggleActive($(this).closest("[data-content=storage]").data("storage-id"))}),$(CHV.fn.uploader.selectors.root).exists()&&(CHV.fn.uploader.$pasteCatcher=$("
",{contenteditable:"true",id:CHV.fn.uploader.selectors.paste.replace(/#/,"")}),$("body").append(CHV.fn.uploader.$pasteCatcher),$(document).on("keydown",function(e){!e.ctrlKey&&!e.metaKey||"KeyV"!=e.originalEvent.code||$(e.target).is(":input")||(PF.fn.keyFeedback.spawn(e),CHV.fn.uploader.$pasteCatcher.focus(e))}),document.addEventListener("dragover",function(e){e.preventDefault()}),document.addEventListener("drop",function(e){if(CHV.obj.config.upload.url){e.preventDefault();var t,a=e.dataTransfer.getData("text/html"),o=/src="?([^"\s]+)"?\s*/;t=o.exec(a),t&&(CHV.fn.uploader.toggle({show:!0}),CHV.fn.uploader.add({},t[1]))}}),window.addEventListener("paste",CHV.fn.uploader.pasteImageHandler)),$(document).on("click","[data-action=like]",function(){if(PF.fn.is_user_logged()){var e=$(this);if(!e.data("XHR")){e.data("XHR",!0);var t=$(this).is("[data-liked]")?$(this):$(this).closest("[data-liked]"),a=!t.closest("[data-list], .viewer").exists()&&void 0!==CHV.obj.resource,o=t.is("[data-liked=1]"),i=o?"dislike":"like",n={id:a?CHV.obj.resource.id:$(this).closest("[data-id]").attr("data-id"),type:a?CHV.obj.resource.type:$(this).closest("[data-type]").attr("data-type")},s=a?e:$("[data-type="+n.type+"][data-id="+n.id+"]"),r={type:"POST",data:{action:i},cache:!1};r.data[i]={object:n.type,id:n.id},$.ajax(r).complete(function(t){var i=t.responseJSON;e.data("XHR",!1),200===i.status_code?(a&&void 0!==i.content&&$("[data-text=likes-count]").html(i.content.likes),s.closest("[data-liked]").attr("data-liked",o?0:1)):PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."))})}}else window.location.href=CHV.obj.vars.urls.login}),$(document).on("click","[data-action=album-cover]",function(){var e=$(this);if(!e.data("XHR")){e.data("XHR",!0);var t=$(this).is("[data-cover]")?$(this):$(this).closest("[data-cover]"),a=t.is("[data-cover=1]"),o=a?"album-cover-unset":"album-cover-set",i=(CHV.obj.resource.id,e.closest("[data-cover]")),n={type:"POST",data:{action:o},cache:!1};n.data[o]={album_id:i.data("album-id"),image_id:i.data("id")},$.ajax(n).complete(function(t){var o=t.responseJSON;e.data("XHR",!1),200===o.status_code?i.attr("data-cover",a?0:1):PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."))})}}),$(document).on("click","[data-action=follow]",function(){if(PF.fn.is_user_logged()){var e=$(this);if(!e.data("XHR")){e.data("XHR",!0);var t=$(this).is("[data-followed]")?$(this):$(this).closest("[data-followed]"),a=void 0!==CHV.obj.resource,o=t.is("[data-followed=1]"),i=o?"unfollow":"follow",n={id:a?CHV.obj.resource.id:$(this).closest("[data-id]").data("id"),type:a?CHV.obj.resource.type:$(this).closest("[data-type]").data("type")},s={type:"POST",data:{action:i},cache:!1};s.data[i]={object:n.type,id:n.id},$.ajax(s).complete(function(i){var n=i.responseJSON;if(e.data("XHR",!1),200===n.status_code){if(a&&void 0!==n.user_followed){var s=$("[data-text=followers-label]"),r={single:s.data("label-single"),plural:s.data("label-plural")};$("[data-text=followers-count]").html(n.user_followed.followers),s.html(PF.fn._n(r.single,r.plural,n.user_followed.followers))}t.attr("data-followed",o?0:1)}else PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."))})}}else PF.fn.modal.call({type:"login"})}),$(document).on("click","[data-action=user_ban],[data-action=user_unban]",function(){var e=$(this);if(!e.data("XHR")){e.data("XHR",!0);var t=$(this).closest("[data-banned]"),a=!0,o=t.is("[data-banned=1]"),i=e.attr("data-action"),n={id:a?CHV.obj.resource.id:$(this).closest("[data-id]").data("id"),type:a?CHV.obj.resource.type:$(this).closest("[data-type]").data("type")},s={type:"POST",data:{action:i},cache:!1};s.data[i]={user_id:n.id},$.ajax(s).complete(function(a){var i=a.responseJSON;e.data("XHR",!1),200===i.status_code?t.attr("data-banned",o?0:1):PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."))})}}),$(document).on("click","[data-action=top-bar-notifications]",function(e){var a=this,o=$(this),i=$(".top-bar-notifications-container",o),n=$(".top-bar-notifications-list",o),s=$("ul",n),r=$(".loading",i);o.data("XHR")||(r.removeClass("hidden"),PF.fn.loading.inline(r,{size:"small",message:PF.fn._s("loading")}),$.ajax({type:"POST",data:{action:"notifications"},cache:!1}).complete(function(e){var l=e.responseJSON;if(200!==l.status_code)return PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later.")),o.data("XHR",!1),void r.addClass("hidden").html("");if(o.data("XHR",!0),r.remove(),l.html){n.removeClass("hidden"),s.html(l.html),t();var d=$("li.new",s);d.addClass("transition"),setTimeout(function(){d.removeClass("new"),$("[data-content=notifications-counter]",a).removeClass("on").html("0"),setTimeout(function(){d.removeClass("transition")},150)},1500)}else $(".empty",i).removeClass("hidden")}))}),$("#g-recaptcha").is(":empty")&&CHV.obj.config.captcha.enabled&&CHV.obj.config.captcha.sitekey&&("3"!=CHV.obj.config.captcha.version&&CHV.obj.config.captcha.isNeeded||$('label[for="recaptcha_response_field"]').remove()),$(document).on("click",PF.obj.listing.selectors.list_item+" a.image-container",function(e){var t=$(this).closest(PF.obj.listing.selectors.list_item),o=t.find("[data-action=load-image]");o.length>0&&(a(o),e.preventDefault())}),$(document).on("click",PF.obj.listing.selectors.list_item+" [data-action=load-image]",function(e){a($(this)),e.preventDefault(),e.stopPropagation()}),$(document).on("click","#album [data-tab=tab-embeds]",function(e){e.preventDefault,CHV.fn.album.showEmbedCodes()}),$("body").is("#upload")&&CHV.fn.uploader.toggle({show:!0}),$(document).on("keyup",function(e){if(!($(e.target).is(":input")||e.ctrlKey||e.metaKey||e.altKey)){var t=$("#fullscreen-modal:visible").exists(),a=$(".viewer"),o=$(".list-selection:visible"),i=o.find("[data-content=pop-selection]:visible:not(.disabled)"),n=$("body").hasClass("--viewer-shown"),s=$(CHV.fn.uploader.selectors.root+CHV.fn.uploader.selectors.show).exists(),r=e.originalEvent.code;if("Escape"===e.originalEvent.code){if(t)return;s&&CHV.fn.uploader.toggle({reset:!1})}if(a.exists()&&n){if(r in CHV.fn.listingViewer.keys){var l=["KeyW","Escape","ArrowLeft","ArrowRight"],d=CHV.fn.listingViewer.keys[r];-1==l.indexOf(r)?$("[data-action="+d+"]",CHV.fn.listingViewer.selectors.root).click():d in CHV.fn.listingViewer&&CHV.fn.listingViewer[d](),PF.fn.keyFeedback.spawn(e)}}else{var c,u={Period:"list-select-all",KeyK:"get-embed-codes",KeyZ:"clear",KeyA:"create-album",KeyM:"move",KeyO:"approve",Delete:"delete",KeyC:"assign-category",KeyV:"flag-safe",KeyF:"flag-unsafe",KeyH:"album-cover"},m={KeyE:"edit",KeyL:"like",KeyS:"share",KeyJ:"sub-album",KeyP:"upload-to-album"};d=u[r]||m[r];void 0!==d&&(o.exists()&&(n||t||parseInt($("[data-text=selection-count]:visible",i).text())>0&&(c=$("[data-action="+d+"]",o.closest(".list-selection")))),void 0===c&&(c=$("[data-action="+d+"]:visible").not("#content-listing-tabs *")),c instanceof jQuery&&c.length>0&&(c.first().trigger("click"),PF.fn.keyFeedback.spawn(e)))}}}),$(document).on("click",CHV.fn.listingViewer.selectors.root+" [data-action^=viewer-]",function(){var e=$(this).data("action").substring("viewer-".length);e in CHV.fn.listingViewer&&CHV.fn.listingViewer[e]()}),$(document).on("click","a[data-href]:not([rel=popup-link]):not(.popup-link)",function(){var e=$(this).attr("data-href"),t=$(this).attr("href");(e||t)&&(location.href=t||e)});var b,v=PF.obj.listing.selectors.list_item+", .image-container";($(document).on("contextmenu click",v,function(e){$(".list-selection:visible").exists()&&!$(this).closest(CHV.fn.listingViewer.selectors.root).exists()&&("click"!=e.type||e.ctrlKey||e.metaKey)&&o(this,e)}),navigator.userAgent.match(/(iPad|iPhone|iPod)/i))&&$(document).on("mouseup mousemove",v,function(e){return clearTimeout(b),!1}).on("mousedown",v,function(e){var t=this,a=e;return b=window.setTimeout(function(){$(".list-selection:visible").exists()&&!$(t).closest(CHV.fn.listingViewer.selectors.root).exists()&&o(t,a)},500),!1});void 0!==CHV.obj.config&&CHV.obj.config.listing.viewer&&$(document).on("click",PF.obj.listing.selectors.list_item+"[data-type=image] .image-container",function(e){if(e.preventDefault(),e.stopPropagation(),0!==e.clientX||0!==e.clientY){var t=$(this).closest(PF.obj.listing.selectors.list_item);t.exists()&&(e.ctrlKey||e.metaKey||CHV.fn.listingViewer.open(t))}else PF.fn.keyFeedback.spawn(e)}),$(document).on("contextmenu",CHV.fn.listingViewer.selectors.root,function(e){return e.preventDefault(),CHV.fn.listingViewer.zoom(),PF.fn.keyFeedback.spawn(e),!1});var _,w=PF.fn.deparam(window.location.search);if(w&&"viewer"in w){var C=$(PF.obj.listing.selectors.content_listing_visible);if("images"==C.data("list")){var H=$(PF.obj.listing.selectors.list_item,C)["next"==w.viewer?"first":"last"]();CHV.fn.listingViewer.open(H)}}$(window).on("DOMContentLoaded load resize scroll",function(){clearTimeout(_),_=setTimeout(function(){$(PF.obj.listing.selectors.list_item+":visible").each(function(){var e=$(this).find('[data-action="load-image"]').first(),t=PF.fn.deparam($(PF.obj.listing.selectors.list_item+"[data-id="+$(this).attr("data-id")+"]").closest(".content-listing").data("params-hidden")),o=t&&"is_animated"in t?t.is_animated:$(this).data("size")<=CHV.obj.config.image.load_max_filesize.getBytes();e.exists()&&o&&$(this).is_within_viewport(50)&&a(e)})},1e3)}),$(document).on("click","[data-action=logout]",function(){let e=$("form#form-logout");e.submit()}),Boolean(window.navigator.vibrate)&&$(document).on("click","button, .btn, .pop-btn, .top-btn-el, [data-action], .content-tabs a, .top-bar-logo a, .login-provider-button, .panel-share-networks li a, #image-viewer-loader",function(e){$(this).is("[data-action=top-bar-menu-full]")||(window.navigator.vibrate(0),window.navigator.vibrate(15))}),$(document).on("change keyup",CHV.fn.ctaForm.selectors.rows+" input[name^='cta-']",function(){CHV.fn.ctaForm.update($(this))}),$(document).on("click",CHV.fn.ctaForm.selectors.rows+" [data-action=cta-add]",function(){CHV.fn.ctaForm.insert($(this))}),$(document).on("click",CHV.fn.ctaForm.selectors.rows+" [data-action=cta-remove]",function(){CHV.fn.ctaForm.remove($(this)),0==CHV.fn.ctaForm.array.length&&$(CHV.fn.ctaForm.selectors.root+" "+CHV.fn.ctaForm.selectors.enable).prop("checked",!1).trigger("change")}),$(document).on("change",CHV.fn.ctaForm.selectors.root+" "+CHV.fn.ctaForm.selectors.enable,function(){let e=$(CHV.fn.ctaForm.selectors.combo,CHV.fn.ctaForm.selectors.root),t=$(this).is(":checked");e.toggleClass("soft-hidden",!t),t&&(0==CHV.fn.ctaForm.array.length&&CHV.fn.ctaForm.add(),CHV.fn.ctaForm.render()),CHV.fn.ctaForm.setEnable(t?1:0)}),$(document).on("change keyup",CHV.fn.ctaForm.selectors.root+" input[name^='cta-icon_']",function(){let e=CHV.fn.ctaForm.getRow($(this)),t=e.find("label[for^='cta-icon_'] [data-content=icon]");t.removeClass();let a=CHV.fn.ctaForm.getIconClass($(this).val());t.addClass(a)})}),"undefined"==typeof CHV&&(CHV={obj:{},fn:{},str:{}}),window.opener&&(CHV.obj.opener={uploadPlugin:{}}),CHV.fn.ctaButtons={selectors:{container:"[data-contains=cta-album]"},render:function(e=""){$(this.selectors.container).each(function(){$(this).html(e)})}},CHV.fn.ctaForm={enable:0,array:[],selectors:{root:"#cta-form",rows:"#cta-rows",enable:"#cta-enable",template:"#cta-row-template",combo:"#cta-combo",row:".cta-row"},update:function(e){let t=this.getPos(e),a=e.attr("name").match(/cta-(.*)?_\d+/)[1];this.array[t-1][a]=e.val()},add:function(e="",t="",a=""){this.array.push(this.getRowObject(e,t,a)),this.render()},insert:function(e){let t=this.getPos(e);this.array.splice(t,0,this.getRowObject()),this.render()},remove:function(e){let t=this.getPos(e);this.array.splice(t-1,1),this.render()},getRowObject:function(e="",t="",a=""){return{label:e,icon:t,href:a}},getIconClass:function(e){return/\s/g.test(e)?e:"fa-solid fa-"+e},getRow:function(e){return e.closest(this.selectors.row)},getPos:function(e){return this.getRow(e).data("pos")},getTemplateHtml:function(){return $(this.selectors.template).html()},getRowHtml:function(e,t){return this.getTemplateHtml().replaceAll(/%pos%/g,e).replaceAll(/%label%/g,t.label).replaceAll(/%href%/g,t.href).replaceAll(/%icon%/g,t.icon).replaceAll(/%iconClass%/g,this.getIconClass(t.icon))},render:function(){let e=$(this.selectors.root),t=e.find(this.selectors.rows),a=this;this.destroy(),$.each(this.array,function(e,o){t.append(a.getRowHtml(e+1,o))}),this.setEnable(this.enable),t.sortable({cursor:"grabbing",axis:"y",update:function(){let e=[];$(this).find(a.selectors.row).each(function(){let t=a.getPos($(this));e.push(a.array[t-1])}),a.array=e,a.render()}})},setEnable:function(e){let t=$(this.selectors.rows,this.selectors.root);this.enable=e;let a=1===this.enable;$("input[data-required]",t).each(function(){$(this).attr("required",a)})},destroy:function(){let e=$(this.selectors.root),t=e.find(this.selectors.rows);try{t.sortable("destroy")}catch(e){}t.empty()}},CHV.fn.album={showEmbedCodes:function(){var e=$(".content-listing-loading","#tab-embeds");if(e.exists()){var t=$("#embed-codes");$.ajax({url:PF.obj.config.json_api,type:"POST",dataType:"json",data:{action:"get-album-contents",albumid:CHV.obj.resource.id,auth_token:PF.obj.config.auth_token},cache:!1}).always(function(a){PF.fn.loading.destroy(e),200==a.status_code&&(CHV.fn.fillEmbedCodes(a.contents,"#tab-embeds"),$("#tab-embeds").addClass("visible"),t.removeClass("soft-hidden"))})}}},CHV.fn.modal={getTemplateWithPreview:function(e,t){var a=$(e).html(),o=$("
"),i="",n=t.find(".image-container img").attr("src");return void 0!==n&&(i+='';var e=$(this).find(".image-container img");e.exists()?n+='':(n+='',n+=''),n+="",s++}),i.html(o).find(".image-preview").html(n),i.html()}},CHV.fn.listingViewer={selectors:{bodyShown:".--viewer-shown",content:".viewer-content",template:"#viewer-template",root:".viewer",rootShow:".viewer--show",rootHide:".viewer--hide",rootZero:".viewer--zero",rootNavPrev:".viewer--nav-prev",rootNavNext:".viewer--nav-next",src:".viewer-src",tools:".viewer-tools",loader:".viewer-loader",owner:".viewer-owner",ownerGuest:".viewer-owner--guest",ownerUser:".viewer-owner--user",inputMap:".viewer-kb-input"},keys:{ArrowLeft:"prev",ArrowRight:"next",Delete:"delete",Escape:"close",KeyA:"create-album",KeyE:"edit",KeyF:"flag",KeyL:"like",KeyM:"move",KeyO:"approve",KeyS:"share",KeyW:"zoom",Period:"select"},keymap:{"create-album":["A",PF.fn._s("Create album")],approve:["O",PF.fn._s("Approve")],close:["Esc",PF.fn._s("Close")],delete:["Del",PF.fn._s("Delete")],edit:["E",PF.fn._s("Edit")],flag:["F",PF.fn._s("Toggle flag")],like:["L",PF.fn._s("Like")],move:["M",PF.fn._n("Move")],next:["►",PF.fn._s("Next")],prev:["◄",PF.fn._s("Previous")],select:[".",PF.fn._s("Toggle select")],share:["S",PF.fn._s("Share")],zoom:["W",PF.fn._s("Zoom")]},loading:null,idleTimer:0,$item:null,show:function(){PF.fn.deparam(this.$item.closest(PF.obj.listing.selectors.content_listing_visible).data("params-hidden"));this.getEl("root").removeClass(this.selectors.rootHide.substring(1)).addClass(this.selectors.rootShow.substring(1)),$("body").addClass(this.selectors.bodyShown.substring(1));var e=new Hammer($(CHV.fn.listingViewer.selectors.root).get(0),{direction:Hammer.DIRECTION_VERTICAL});e.on("swipeleft swiperight",function(e){var t="left"==e.type.substring("swipe".length)?"next":"prev";CHV.fn.listingViewer[t]()}),this.getEl("root")[(PF.fn.isDevice(["phone","phablet"])?"add":"remove")+"Class"]("--over")},getItem:function(){return this.$item},getEl:function(e){var t=!e.startsWith("template")&&!e.startsWith("root")&&this.selectors.root;return t?$(this.selectors[e],t):$(this.selectors[e])},getObject:function(e){if(e||void 0===this.object){var t=decodeURIComponent(this.getItem().attr("data-object"));this.object=JSON&&JSON.parse(t)||$.parseJSON(t)}return this.object},placeholderSizing:function(){if(this.getEl("root").exists()){var e=Math.max(document.documentElement.clientWidth,window.innerWidth||0),t=Math.max(document.documentElement.clientHeight,window.innerHeight||0),a=e/t,o=this.getEl("src")[0],i=o.getAttribute("width"),n=o.getAttribute("height"),s=i/n,r=a0?"add":t.getItem()[o]().exists()?"add":"remove";a[n+"Class"](i.substring(1))}),$.each(this.getItem().get(0).attributes,function(e,t){if(!t.name.startsWith("data-"))return!0;a.attr(t.name,t.value)});var n=void 0===this.object.user?"user":"guest";n="owner"+(n.charAt(0).toUpperCase()+n.slice(1).toLowerCase()),this.getEl(n).remove(),void 0!==this.object.user&&$(this.object.user.avatar?".default-user-image":"img.user-image",this.getEl("ownerUser")).remove();var s=this.getItem().find(".list-item-image-tools[data-action='list-tools']");this.getEl("tools").append(s.html());let r=this;this.getEl("tools").find(".list-tool[data-action]").each(function(){$(this).attr("title",$(this).attr("title")+" ("+r.keymap[$(this).attr("data-action")][0]+")")}),this.placeholderSizing(),this.trickyLoad()},zoom:function(){this.getEl("root").attr("data-cover","1"==this.getEl("root").attr("data-cover")?"0":"1")},remove:function(){this.getEl("root").remove()},getParsedTemplate:function(){var e=this.getObject(!0),t=this.getEl("template").html(),a=t.match(/%(\S+)%/g);return console.log(e),a&&$.each(a,function(a,o){var i,n=o.slice(1,-1).split(".");n.map(function(t){var a=i||e;t in a&&(i=a[t])});var s=new RegExp(o,"g");i=void 0===i?"":i,t=t.replace(s,i)}),t},insertEl:function(){var e=this.getParsedTemplate();this.getEl("rootZero").remove(),$(e).appendTo("body")},toggleIdle:function(e,t){var a=this;t=void 0===t||t;$("html")[(e?"add":"remove")+"Class"]("--idle"),e||(clearTimeout(a.idleTimer),t&&(a.idleTimer=setTimeout(function(){var e=$(".fullscreen"),t=a.getEl("root");a.toggleIdle(t.length>0&&0==e.length)},5e3)))},open:function(e){if(e.exists()){this.setItem(e),this.insertEl(),this.filler(),this.show(),this.toggleIdle(!1);var t=this;this.getEl("root").on("mousemove mouseout",function(){t.toggleIdle(!1)})}else this.getEl("rootZero").remove()},setItem:function(e){this.$item=e},trickyLoad:function(){if(this.object.image.url!=this.object.display_url){var e=this.getEl("src").parent().html(),t=$(e).attr("src",this.object.image.url);t.insertBefore(this.getEl("src")),t.imagesLoaded(function(){t.next().remove()})}},close:function(){var e=this;$(this.selectors.root).removeClass(this.selectors.rootShow.substring(1)).addClass(this.selectors.rootHide.substring(1)),$("body").removeClass(this.selectors.bodyShown.substring(1)),this.toggleIdle(!1,!1),null!==this.getItem()&&$(window).scrollTop(this.getItem().offset().top);var t=$("#top-bar, .follow-scroll");t.attr("data-scroll-lock","1"),setTimeout(function(){e.remove()},250),setTimeout(function(){t.removeAttr("data-scroll-lock")},300)},browse:function(e){var t=this.getItem()[e]();if(t.exists()){this.setItem(t),this.filler(!0);var a=$(PF.obj.listing.selectors.content_listing_visible).find("[data-action=load-more]"),o=t[e+"All"]().length;a.length>0&&o<=5&&!PF.obj.listing.calling&&"next"==e&&$("[data-action=load-more]").click()}else{var i=$("[data-pagination="+e+"]",PF.obj.listing.selectors.content_listing_pagination+":visible"),n=i.attr("href");if(!n)return;PF.fn.deparam(window.location.search);window.location.href=n+"&viewer="+e}},prev:function(){this.browse("prev")},next:function(){this.browse("next")}},CHV.obj.image_viewer={selector:"#image-viewer",container:"#image-viewer-container",navigation:".image-viewer-navigation",loading:"#image-viewer-loading",loader:"#image-viewer-loader"},CHV.obj.image_viewer.$container=$(CHV.obj.image_viewer.container),CHV.obj.image_viewer.$navigation=$(CHV.obj.image_viewer.navigation),CHV.obj.image_viewer.$loading=$(CHV.obj.image_viewer.loading),CHV.fn.system={checkUpdates:function(e){$.ajax({url:CHEVERETO.api.get.info+"/",data:{id:CHEVERETO.id},cache:!1}).always(function(t,a,o){"function"==typeof e&&e(o)})}},("MacIntel"===navigator.platform&&navigator.maxTouchPoints>0||"iPad"===navigator.platform)&&$("html").removeClass("device-nonmobile"),CHV.fn.bindSelectableItems=function(){var e="content-listing-wrapper",t="#"+e;$(t).exists()?$(t).hasClass("ui-selectable")&&$(t).selectable("destroy"):$("#content-listing-tabs").wrap("
"),$("[data-content=list-selection]").exists()&&$("html.device-nonmobile "+t).selectable({delay:150,filter:PF.obj.listing.selectors.list_item,cancel:".content-empty, .header, #tab-share, #tab-info, .viewer-title, .header-link, .top-bar, .content-listing-pagination *, #fullscreen-modal, #top-user, #background-cover, .list-item-desc, .list-item-image-tools, [data-action=load-image], #tab-embeds",classes:{"ui-selected":"selected"},selected:function(e,t){$(t.selected).removeClass("ui-selected")},selecting:function(e,t){var a=$(t.selecting),o=a.hasClass("selected");CHV.fn.list_editor[(o?"unselect":"select")+"Item"](a)},unselecting:function(e,t){CHV.fn.list_editor.unselectItem($(t.unselecting))}})},CHV.fn.isCachedImage=function(e){var t=new Image;return t.src=e,t.complete||t.width+t.height>0},CHV.fn.viewerLoadImage=function(){if(CHV.obj.image_viewer.$loading.exists()&&(CHV.obj.image_viewer.$loading.removeClass("soft-hidden").css({zIndex:2}),PF.fn.loading.inline(CHV.obj.image_viewer.$loading,{color:"white",size:"small",center:!0,valign:!0}),CHV.obj.image_viewer.$loading.hide().fadeIn("slow")),$(CHV.obj.image_viewer.loader).remove(),CHV.obj.image_viewer.image.is_360)return PF.fn.loading.destroy(CHV.obj.image_viewer.$loading),pannellum.viewer("image-viewer-360",{autoLoad:!0,type:"equirectangular",panorama:CHV.obj.image_viewer.image.url,preview:CHV.obj.image_viewer.$container.find("img").eq(0).attr("src"),pitch:2.3,yaw:-135.4,hfov:120}),$("#image-viewer-360").removeClass("soft-hidden"),void CHV.obj.image_viewer.$container.find("img").eq(0).remove();CHV.obj.image_viewer.image.html=CHV.obj.image_viewer.$container.html(),CHV.obj.image_viewer.$container.prepend($(CHV.obj.image_viewer.image.html).css({top:0,zIndex:0,opacity:0,position:"absolute"})),CHV.obj.image_viewer.$container.find("img").eq(0).css("zIndex",1),CHV.obj.image_viewer.$container.find("img").eq(1).attr("src",CHV.obj.image_viewer.image.url),CHV.obj.image_viewer.$container.find("img").eq(1).imagesLoaded(function(){CHV.obj.image_viewer.$container.find("img").eq(1).css({position:"",display:""}),CHV.obj.image_viewer.$container.find("img").eq(0).remove(),PF.fn.loading.destroy(CHV.obj.image_viewer.$loading)})},CHV.obj.embed_share_tpl={},CHV.obj.embed_upload_tpl={},CHV.obj.topBar={transparencyScrollToggle:function(){var e=$(window).scrollTop();$("#top-bar")[(e>0?"remove":"add")+"Class"]("transparent")}},CHV.obj.uploaderReset={isUploading:!1,canAdd:!0,queueStatus:"ready",uploadThreads:0,uploadParsedIds:[],uploadProcessedIds:[],files:{},results:{success:{},error:{}},toggleWorking:0,filesAddId:0,clipboardImages:[]},CHV.fn.uploader={files:{},selectors:{root:"#anywhere-upload",show:".upload-box--show",queue:"#anywhere-upload-queue",queue_complete:".queue-complete",queue_item:".queue-item",close_cancel:"[data-button=close-cancel]",file:"#anywhere-upload-input",camera:"#anywhere-upload-input-camera",upload_item_template:"#anywhere-upload-item-template",item_progress_bar:"[data-content=progress-bar]",failed_result:"[data-content=failed-upload-result]",fullscreen_mask:"#fullscreen-uploader-mask",dropzone:"#uploader-dropzone",paste:"#anywhere-upload-paste",input:"[data-action=anywhere-upload-input]"},toggle:function(e,t){this.queueSize();var a=$("[data-action=top-bar-upload]",".top-bar"),o=!$(CHV.fn.uploader.selectors.root).data("shown");e=$.extend({callback:null,reset:!0},e);if(void 0!==e.show&&e.show&&(o=!0),PF.fn.growl.close(!0),PF.fn.close_pops(),!(1==this.toggleWorking||$(CHV.fn.uploader.selectors.root).is(":animated")||CHV.fn.uploader.isUploading||a.data("login-needed")&&!PF.fn.is_user_logged())){this.toggleWorking=1;var i={time:500,easing:null},n=function(){!o&&e.reset&&CHV.fn.uploader.reset(),PF.fn.topMenu.hide(),"function"==typeof e.callback&&e.callback(t),CHV.fn.uploader.boxSizer(),CHV.fn.uploader.toggleWorking=0};if($(CHV.fn.uploader.selectors.root)[(o?"add":"remove")+"Class"](this.selectors.show.substring(1)),o){if($("html").data({ -"followed-scroll":$("html").hasClass("followed-scroll"),"top-bar-box-shadow-prevent":!0}).removeClass("followed-scroll").addClass("overflow-hidden top-bar-box-shadow-none"),$("#top-bar").data({stock_classes:$("#top-bar").attr("class")}).addClass("scroll-up"),$(".current[data-nav]",".top-bar").each(function(){$(this).is("[data-action=top-bar-menu-full]")||$(this).removeClass("current").attr("data-current",1)}),PF.fn.isDevice("mobile")){var s=$(".upload-box-heading",$(CHV.fn.uploader.selectors.root));s.css({position:"relative",top:.5*($(window).height()-s.height())+"px"})}CHV.fn.uploader.focus(function(){setTimeout(function(){n()},i.time)})}else{$("#top-bar")[0].className=$("#top-bar").data("stock_classes"),$("[data-nav][data-current=1]",".top-bar").each(function(){$(this).addClass("current")}),setTimeout(function(){$(CHV.fn.uploader.selectors.fullscreen_mask).css({opacity:0})},.1*i.time),setTimeout(function(){$(CHV.fn.uploader.selectors.fullscreen_mask).remove()},i.time);var r=$(CHV.fn.uploader.selectors.root).outerHeight(),l=r-parseInt($(CHV.fn.uploader.selectors.root).data("initial-height"))+"px";$(CHV.fn.uploader.selectors.root).css({transform:"translate(0,-"+l+")"}),setTimeout(function(){$(CHV.fn.uploader.selectors.root).css({top:""}),n(),$("html,body").removeClass("overflow-hidden").data({"top-bar-box-shadow-prevent":!1}),$("#top-bar *").trigger("blur")},i.time)}$(CHV.fn.uploader.selectors.root).data("shown",o),a.toggleClass("current").removeClass("opened")}},reset:function(){$.extend(this,$.extend(!0,{},CHV.obj.uploaderReset)),$("li",this.selectors.queue).remove(),$(this.selectors.root).height("").css({"overflow-y":"","overflow-x":""}),$(this.selectors.queue).addClass("queueEmpty").removeClass(this.selectors.queue_complete.substring(1)),$(this.selectors.input,this.selectors.root).each(function(){$(this).prop("value",null)}),$("[data-group=upload-result] textarea",this.selectors.root).prop("value",""),$.each(["upload-queue-ready","uploading","upload-result","upload-queue-ready","upload-queue"],function(e,t){$("[data-group="+t+"]").hide()}),$("[data-group=upload]",this.selectors.root).show(),$("[name=upload-album-id]",this.selectors.root).prop("value",function(){var e=$("option[selected]",this);if(e.exists())return e.attr("value")}),$(this.selectors.root).removeClass("queueCompleted queueReady queueHasResults").addClass("queueEmpty").attr("data-queue-size",0),$("[name=upload-category-id]",this.selectors.root).prop("value",""),$("[name=upload-nsfw]",this.selectors.root).prop("checked",this.defaultChecked),this.boxSizer(!0)},focus:function(e){$(this.selectors.fullscreen_mask).exists()||($("body").is("#upload")||$("body").append($("
",{id:this.selectors.fullscreen_mask.replace("#",""),class:"fullscreen black"}).css({top:PF.fn.isDevice("phone")?0:$(CHV.fn.uploader.selectors.root).data("top")})),setTimeout(function(){$("body").is("#upload")||$(CHV.fn.uploader.selectors.fullscreen_mask).css({opacity:1}),setTimeout(function(){"function"==typeof e&&e()},PF.fn.isDevice(["phone","phablet"])?0:250)},1))},boxSizer:function(e){var t=$(this.selectors.root).is(this.selectors.show),a=t||e;t&&$("html").addClass("overflow-hidden"),a&&($(this.selectors.root).height(""),!$("body").is("#upload")&&$(this.selectors.root).height()>$(window).height()?($(this.selectors.root).height($(window).height()-$("#top-bar").height()).css({"overflow-y":"scroll","overflow-x":"auto"}),$("body").addClass("overflow-hidden")):$(this.selectors.root).css("overflow-y",""))},pasteURL:function(){var e=$("[name=urls]",PF.obj.modal.selectors.root),t=e.val();t&&(CHV.fn.uploader.toggle({show:!0}),CHV.fn.uploader.add({},t))},pasteImageHandler:function(e){if(!$(e.target).is(":input")){if(void 0!==e.clipboardData&&e.clipboardData.items)var t=e.clipboardData.items;else setTimeout(function(){return e.clipboardData={},e.clipboardData.items=[],$.each($("img",CHV.fn.uploader.$pasteCatcher),function(t,a){e.clipboardData.items.push(PF.fn.dataURItoBlob($(this).attr("src")))}),$(CHV.fn.uploader.selectors.paste).html(""),CHV.fn.uploader.pasteImageHandler(e)},1);if(t){const e=new Array,i=new Array;let n=$(CHV.fn.uploader.selectors.root).data("shown");for(var a=0;ap||f==p){var h=pp&&$img.height(h).width(h*g)}if(f0){var v="";for(l=0;l"+PF.fn.htmlEncode(m[l].name)+"",delete CHV.fn.uploader.files[m[l].uid],$("li[data-id="+m[l].uid+"]",CHV.fn.uploader.selectors.queue).find("[data-action=cancel]").click();PF.fn.modal.simple({title:PF.fn._s("Some files couldn't be added"),message:"
    "+v+"
"})}else CHV.fn.uploader.focus();CHV.fn.uploader.boxSizer()}},$.extend({},C,{orientation:a.exif?a.exif.get("Orientation"):1})),setTimeout(function(){o(e+1)},25)}))}else PF.fn.loading.destroy("fullscreen")}var i;if(!this.canAdd){e=e.originalEvent;return e.preventDefault(),e.stopPropagation(),!1}$fileinput=$(this.selectors.file),$fileinput.replaceWith($fileinput=$fileinput.clone(!0));var n=$(this.selectors.upload_item_template).html();let s=[],r=[];if(void 0===t){e=e.originalEvent;e.preventDefault(),e.stopPropagation();var l=e.dataTransfer||e.target;if("items"in l)for(var d=l.items,c=0;cCHV.obj.config.image.max_filesize.getBytes()?m.push({uid:c,name:p.name.truncate_middle()+" - "+PF.fn._s("File too big.")}):-1!=CHV.obj.config.upload.image_types.indexOf(f)||0!=/android/i.test(navigator.userAgent)?(i&&(p.md5=i),p.fromClipboard=1==e.clipboard,p.uid=c):m.push({uid:c,name:p.name.truncate_middle()+" - "+PF.fn._s("Invalid or unsupported file format.")})}for(c=0;c0&&0==s.length){var h="";for(c=0;c"+PF.fn.htmlEncode(m[c].name)+"";return void PF.fn.modal.simple({title:PF.fn._s("Some files couldn't be added"),message:"
  • "+h+"
"})}if(0==s.length)return}else{if(t=t.replace(/(<([^>]+)>)/g,"").replace(/(\[([^\]]+)\])/g,""),s=t.match_urls(),!s)return;s=s.array_unique(),s=$.map(s,function(e,t){return{uid:t,name:e,url:e}})}if($.isEmptyObject(this.files))for(c=0;c0){var i=[];for(var o in this.results.error)"object"==typeof this.results.error[o]&&(i[o]=this.results.error[o].error.message);i.length>0&&$(this.selectors.failed_result).html("
  • "+i.join("
  • ")+"
  • ")}else $(a.error,this.selectors.root).hide();if(!window.opener&&0==CHV.obj.config.upload.moderation&&CHV.obj.config.upload.redirect_single_upload&&1==Object.size(this.results.success)&&0==Object.size(this.results.error))return window.location.href=this.results.success[Object.keys(this.results.success)[0]].image.path_viewer,!1;if($("[data-text=queue-progress]",this.selectors.root).text(100),$("[data-group=uploading]",this.selectors.root).hide(),$(this.selectors.root).removeClass("queueUploading queueHasResults").addClass("queueCompleted"),$(this.selectors.queue).addClass(this.selectors.queue_complete.substring(1)),Object.size(this.results.success)>0&&$("[data-group=upload-result] textarea",this.selectors.root).exists()&&CHV.fn.fillEmbedCodes(this.results.success,CHV.fn.uploader.selectors.root,"val"),Object.size(this.results.success)>0&&Object.size(this.results.error)>0?$(a.mixed+", "+a.success,this.selectors.root).show():Object.size(this.results.success)>0?$(a.success,this.selectors.root).show():Object.size(this.results.error)>0&&$(a.error,this.selectors.root).show(),$(a.success,this.selectors.root).is(":visible")){$(a.success,this.selectors.root).find("[data-group^=user], [data-group=guest]").hide(),$(a.success,this.selectors.root).find("[data-group="+(PF.fn.is_user_logged()?"user":"guest")+"]").show();var n=Object.keys(this.results.success)[0];if(void 0!==this.results.success[n].image.album){var s=[];for(var r in this.results.success){var l=this.results.success[r].image;l.album&&l.album.id_encoded&&-1==s.indexOf(l.album.id_encoded)&&s.push(l.album.id_encoded)}var d={link:null,text:null};if(s.length<=1?(d.link=this.results.success[n].image.album.url,d.text=this.results.success[n].image.album.name):(d.link=this.results.success[n].image.user.url_albums,d.text=PF.fn._s("%s's Albums",this.results.success[n].image.user.name_short_html)),$("[data-text=upload-target]",this.selectors.root).text(d.text),$("[data-link=upload-target]",this.selectors.root).attr("href",d.link),PF.fn.is_user_logged()){var c=s.length>0?"album":"stream";$("[data-group=user-"+c+"]",this.selectors.root).show()}}}if(this.boxSizer(),this.queueStatus="done",window.opener&&void 0!==CHV.obj.opener.uploadPlugin[window.name]){if($('[data-action="copy"]',this.selectors.root).remove(),CHV.obj.opener.uploadPlugin[window.name].hasOwnProperty("autoInsert")&&CHV.obj.opener.uploadPlugin[window.name].autoInsert){var u=$(':input[name="'+CHV.obj.opener.uploadPlugin[window.name].autoInsert+'"]',CHV.fn.uploader.selectors.root),m=u.val();if(m)return window.opener.postMessage({id:window.name,message:m},"*"),void window.close()}}else $('[data-action="openerPostMessage"]',this.selectors.root).remove()}},$.extend(CHV.fn.uploader,$.extend(!0,{},CHV.obj.uploaderReset)),CHV.fn.fillEmbedCodes=function(e,t,a){void 0===a&&(a="val");var o=CHV.fn.uploader.selectors.root==t?"embed_upload_tpl":"embed_share_tpl";$.each(e,function(e,i){if(void 0!==i){var n="id_encoded"in i?i:i.image;if(!n.medium){n.medium={};for(var s=["filename","name","width","height","extension","size","size_formatted","url"],r=0;r0&&$.each(CHV.obj.categories,function(o,i){return void 0!==e&&i.id==e||(i.url_key==$("[name=form-category-url_key]",t).val()?(a=!0,!1):void 0)}),!a||(PF.fn.growl.call(PF.fn._s("Category URL key already being used.")),$("[name=form-category-url_key]",t).highlight(),!1)))},edit:{before:function(e){var t=$(e.target),a=t.data("category-id"),o=CHV.obj.categories[a],i="[data-modal="+t.data("target")+"]";$.each(CHV.fn.category.formFields,function(e,t){e="form-category-"+t,t=o[t];var a=$("[name="+e+"]",i);a.is("textarea")?a.html(PF.fn.htmlEncode(t)):a.attr("value",t)})},submit:function(){var e=PF.obj.modal.selectors.root,t=$("[name=form-category-id]",e).val();return!!CHV.fn.category.validateForm(t)&&(PF.obj.modal.form_data={action:"edit",edit:"category",editing:{}},$.each(CHV.fn.category.formFields,function(t,a){PF.obj.modal.form_data.editing[a]=$("[name=form-category-"+a+"]",e).val()}),!0)},complete:{success:function(e){var t=e.responseJSON.category,a="[data-content=category][data-category-id="+t.id+"]";$.each(t,function(e,t){$("[data-content=category-"+e+"]",a).html(PF.fn.htmlEncode(t))}),$("[data-link=category-url]").attr("href",t.url),CHV.obj.categories[t.id]=t,PF.fn.growl.expirable(PF.fn._s("The content has been edited."))}}},delete:{before:function(e){var t=$(e.target),a=t.data("category-id"),o=CHV.obj.categories[a];t.attr("data-confirm",t.attr("data-confirm").replace("%s",'"'+o.name+'"'))},submit:function(e){return PF.obj.modal.form_data={action:"delete",delete:"category",deleting:{id:e}},!0},complete:{success:function(e){PF.fn.growl.expirable(PF.fn._s("Category successfully deleted."));var t=e.responseJSON.request.deleting.id;$("[data-content=category][data-category-id="+t+"]").remove(),delete CHV.obj.categories[t]}}},add:{submit:function(){var e=PF.obj.modal.selectors.root;return!!CHV.fn.category.validateForm()&&(PF.obj.modal.form_data={action:"add-category",category:{}},$.each(CHV.fn.category.formFields,function(t,a){"id"!=a&&(PF.obj.modal.form_data.category[a]=$("[name=form-category-"+a+"]",e).val())}),!0)},complete:{success:function(e){var t=e.responseJSON.category,a="[data-content=dashboard-categories-list]",o=$("[data-content=category-dashboard-template]").html();$.each(t,function(e,t){o=o.replace(new RegExp("%"+e.toUpperCase()+"%","g"),t||"")}),$(a).append(o),0==Object.size(CHV.obj.categories)&&(CHV.obj.categories={}),CHV.obj.categories[t.id]=t,PF.fn.growl.call(PF.fn._s("Category %s added.",'"'+t.name+'"'))}}}},CHV.fn.ip_ban={formFields:["id","ip","expires","message"],validateForm:function(e){var t=PF.obj.modal.selectors.root,a=!1,o=$("[name=form-ip_ban-ip]",t).val();return!!CHV.fn.common.validateForm(t)&&(""!==$("[name=form-ip_ban-expires]",t).val()&&0==/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/.test($("[name=form-ip_ban-expires]",t).val())?(PF.fn.growl.call(PF.fn._s("Invalid expiration date.")),$("[name=form-ip_ban-expires]",t).highlight(),!1):(Object.size(CHV.obj.ip_bans)>0&&$.each(CHV.obj.ip_bans,function(t,i){return void 0!==e&&i.id==e||(i.ip==o?(a=!0,!1):void 0)}),!a||(PF.fn.growl.call(PF.fn._s("IP %s already banned.",o)),$("[name=form-ip_ban-ip]",t).highlight(),!1)))},add:{submit:function(){var e=PF.obj.modal.selectors.root;return!!CHV.fn.ip_ban.validateForm()&&(PF.obj.modal.form_data={action:"add-ip_ban",ip_ban:{}},$.each(CHV.fn.ip_ban.formFields,function(t,a){"id"!=a&&(PF.obj.modal.form_data.ip_ban[a]=$("[name=form-ip_ban-"+a+"]",e).val())}),!0)},complete:{success:function(e){var t=e.responseJSON.ip_ban,a="[data-content=dashboard-ip_bans-list]",o=$("[data-content=ip_ban-dashboard-template]").html();void 0!==o&&($.each(t,function(e,t){o=o.replace(new RegExp("%"+e.toUpperCase()+"%","g"),t||"")}),$(a).append(o)),0==Object.size(CHV.obj.ip_bans)&&(CHV.obj.ip_bans={}),CHV.obj.ip_bans[t.id]=t,$("[data-content=ban_ip]").addClass("hidden"),$("[data-content=banned_ip]").removeClass("hidden"),PF.fn.growl.call(PF.fn._s("IP %s banned.",t.ip))},error:function(e){var t=e.responseJSON.error;PF.fn.growl.call(PF.fn._s(t.message))}}},edit:{before:function(e){var t=$(e.target),a=t.data("ip_ban-id"),o=CHV.obj.ip_bans[a],i="[data-modal="+t.data("target")+"]";$.each(CHV.fn.ip_ban.formFields,function(e,t){e="form-ip_ban-"+t,t=o[t];var a=$("[name="+e+"]",i);a.is("textarea")?a.html(PF.fn.htmlEncode(t)):a.attr("value",t)})},submit:function(){var e=PF.obj.modal.selectors.root,t=$("[name=form-ip_ban-id]",e).val();return!!CHV.fn.ip_ban.validateForm(t)&&(PF.obj.modal.form_data={action:"edit",edit:"ip_ban",editing:{}},$.each(CHV.fn.ip_ban.formFields,function(t,a){PF.obj.modal.form_data.editing[a]=$("[name=form-ip_ban-"+a+"]",e).val()}),!0)},complete:{success:function(e){var t=e.responseJSON.ip_ban,a="[data-content=ip_ban][data-ip_ban-id="+t.id+"]";$.each(t,function(e,t){$("[data-content=ip_ban-"+e+"]",a).html(PF.fn.htmlEncode(t))}),CHV.obj.ip_bans[t.id]=t},error:function(e){var t=e.responseJSON.error;PF.fn.growl.call(PF.fn._s(t.message))}}},delete:{before:function(e){var t=$(e.target),a=t.data("ip_ban-id"),o=CHV.obj.ip_bans[a];t.attr("data-confirm",t.attr("data-confirm").replace("%s",o.ip))},submit:function(e){return PF.obj.modal.form_data={action:"delete",delete:"ip_ban",deleting:{id:e}},!0},complete:{success:function(e){PF.fn.growl.expirable(PF.fn._s("IP ban successfully deleted."));var t=e.responseJSON.request.deleting.id;$("[data-content=ip_ban][data-ip_ban-id="+t+"]").remove(),delete CHV.obj.ip_bans[t]}}}},CHV.fn.storage={formFields:["id","name","api_id","bucket","server","service","capacity","region","key","secret","url","account_id","account_name"],calling:!1,validateForm:function(){var e=PF.obj.modal.selectors.root,t=$("[name=form-storage-id]",e).val(),a=!0;if($.each($(":input",e),function(e,t){$(this).is(":hidden")?$(this).attr("required")&&$(this).removeAttr("required").attr("data-required",1):1==$(this).attr("data-required")&&$(this).attr("required","required"),$(this).is(":visible")&&""==$(this).val()&&$(this).attr("required")&&($(this).highlight(),a=!1)}),!a)return PF.fn.growl.call(PF.fn._s("Please fill all the required fields.")),!1;var o,i=$("[name=form-storage-capacity]",e),n=i.val();return""!==n&&(0==/^[\d\.]+\s*[A-Za-z]{2}$/.test(n)||void 0===n.getBytes()?o=PF.fn._s("Invalid storage capacity value. Make sure to use a valid format."):void 0!==CHV.obj.storages[t]&&n.getBytes()0&&(t=String(t).formatBytes(2)),r.attr("value",t))}),$("[data-combo-value]").addClass("soft-hidden"),$(n).removeClass("soft-hidden")},submit:function(){var e=PF.obj.modal.selectors.root;$("[name=form-storage-id]",e).val();return!!CHV.fn.storage.validateForm()&&(PF.obj.modal.form_data={action:"edit",edit:"storage",editing:{}},$.each(CHV.fn.storage.formFields,function(t,a){var o;o="[name=form-storage-"+a+"]","hidden"!==$(o,e).attr("type")&&(o+=":visible"),PF.obj.modal.form_data.editing[a]=$(o,e).val()}),!0)},complete:{success:function(e){var t=e.responseJSON.storage,a="[data-content=storage][data-storage-id="+t.id+"]",o=$("[data-action=toggle-storage-https]",a);$.each(t,function(e,t){$("[data-content=storage-"+e+"]",a).html(PF.fn.htmlEncode(t))}),CHV.obj.storages[t.id]=t,CHV.fn.storage.toggleBoolDisplay(o,1==t.is_https)},error:function(e){var t=e.responseJSON,a=t.error.message;PF.fn.growl.call(a)}}},add:{submit:function(){if(!CHV.fn.storage.validateForm())return!1;var e=PF.obj.modal.selectors.root;return PF.obj.modal.form_data={action:"add-storage",storage:{}},$.each(CHV.fn.storage.formFields,function(t,a){var o;"id"!=a&&(o="[name=form-storage-"+a+"]","hidden"!==$(o,e).attr("type")&&(o+=":visible"),PF.obj.modal.form_data.storage[a]=$(o,e).val())}),!0},complete:{success:function(e){var t=e.responseJSON.storage,a="[data-content=dashboard-storages-list]",o=$("[data-content=storage-dashboard-template]").html();$.each(t,function(e,t){var a=e.toUpperCase();if("is_https"==e||"is_active"==e)t=CHV.obj.storageTemplate.icon.replace("%TITLE%",CHV.obj.storageTemplate.messages[e]).replace("%ICON%",CHV.obj.storageTemplate.checkboxes[t]).replace("%PROP%",e.replace("is_",""));o=o.replace(new RegExp("%"+a+"%","g"),t||"")}),$(a).append(o),PF.fn.bindtipTip($("[data-storage-id="+t.id+"]")),0==CHV.obj.storages.length&&(CHV.obj.storages={}),CHV.obj.storages[t.id]=t},error:function(e){var t=e.responseJSON,a=t.error.message;PF.fn.growl.call(a)}}},toggleBoolDisplay:function(e,t){var a={0:e.data("unchecked-icon"),1:e.data("checked-icon")};e.removeClass(a[0]+" "+a[1]).addClass(a[t?1:0])}},CHV.fn.common={validateForm:function(e){if(void 0===e)e=PF.obj.modal.selectors.root;var t=!0;return $.each($(":input:visible",e),function(e,a){""==$(this).val()&&$(this).attr("required")&&($(this).highlight(),t=!1)}),!!t||(PF.fn.growl.call(PF.fn._s("Please fill all the required fields.")),!1)},updateDoctitle:function(e){void 0!==CHV.obj.page_info&&(CHV.obj.page_info.pre_doctitle=e,CHV.obj.page_info.doctitle=CHV.obj.page_info.pre_doctitle+CHV.obj.page_info.pos_doctitle,document.title=CHV.obj.page_info.doctitle)}},CHV.fn.user={add:{submit:function(){var e=$(PF.obj.modal.selectors.root),t=!0;return $.each($(":input",e),function(e,a){""==$(this).val()&&$(this).attr("required")&&($(this).highlight(),t=!1)}),t?(PF.obj.modal.form_data={action:"add-user",user:{username:$("[name=form-username]",e).val(),email:$("[name=form-email]",e).val(),password:$("[name=form-password]",e).val(),role:$("[name=form-role]",e).val()}},!0):(PF.fn.growl.call(PF.fn._s("Please fill all the required fields.")),!1)},complete:{success:function(e){e.responseJSON;PF.fn.growl.expirable(PF.fn._s("%s added successfully.",PF.fn._n("User","Users",1)))},error:function(e){var t=e.responseJSON;PF.fn.growl.call(PF.fn._s(t.error.message))}}},delete:{submit:function(){return PF.obj.modal.form_data={action:"delete",delete:"user",owner:CHV.obj.resource.user.id,deleting:CHV.obj.resource.user},!0}},ban:{submit:function(){return PF.obj.modal.form_data={action:"ban",ban:"user",banning:CHV.obj.resource.user.id},!0},success:function(){}}},CHV.fn.submit_resource_approve=function(){return PF.obj.modal.form_data={action:"approve",approve:CHV.obj.resource.type,from:"resource",owner:void 0!==CHV.obj.resource.user?CHV.obj.resource.user.id:null,approving:CHV.obj.resource},!0},CHV.fn.complete_resource_approve={success:function(e){e.responseJSON;$("body").fadeOut("normal",function(){redir=CHV.obj.resource.url,window.location=redir})}},CHV.fn.submit_resource_delete=function(){return PF.obj.modal.form_data={action:"delete",delete:CHV.obj.resource.type,from:"resource",owner:void 0!==CHV.obj.resource.user?CHV.obj.resource.user.id:null,deleting:CHV.obj.resource},!0},CHV.fn.complete_resource_delete={success:function(e){e.responseJSON;$("body").fadeOut("normal",function(){var e;e="album"==CHV.obj.resource.type||"image"==CHV.obj.resource.type?CHV.obj.resource.parent_url:CHV.obj.resource.user?CHV.obj.resource.user.url:CHV.obj.resource.url,void 0!==e&&(window.location=e.replace(/\/?$/,"/")+"?deleted")})}},CHV.fn.list_editor={blink:function(e){e.addClass("ui-selecting"),setTimeout(function(){e.removeClass("ui-selecting")},200)},selectionCount:function(){var e=$(PF.obj.listing.selectors.content_listing);e.each(function(){var t=$("[data-content=pop-selection]","[data-content=list-selection][data-tab="+$(this).attr("id")+"]"),a=$(PF.obj.listing.selectors.list_item+".selected",this).length;if(all_count=$(PF.obj.listing.selectors.list_item,this).length,t.toggleClass("disabled",0==a),$("[data-text=selection-count]",t).text(a>0?a:""),"images"==e.data("list")&&a>0){var o=$(PF.obj.listing.selectors.list_item+".selected[data-flag=safe]",this).length>0,i=$(PF.obj.listing.selectors.list_item+".selected[data-flag=unsafe]",this).length>0;$("[data-action=flag-safe]",t)[(i?"remove":"add")+"Class"]("hidden"),$("[data-action=flag-unsafe]",t)[(o?"remove":"add")+"Class"]("hidden")}$(this).is(":visible")&&($("body").toggleClass("--has-selection",a>0),CHV.fn.list_editor.listMassActionSet(all_count==a?"clear":"select"))})},removeFromList:function(e,t){if(void 0!==e){e=e instanceof jQuery==0?$(e):e;var a=$(PF.obj.listing.selectors.content_listing_visible),o=e.length;e.fadeOut("fast");var i=e.first().data("type"),n=parseInt($("[data-text="+i+"-count]").text())-o;CHV.fn.list_editor.updateUserCounters(e.first().data("type"),o,"-"),e.promise().done(function(){$(document).removeClass(CHV.fn.listingViewer.selectors.bodyShown.substr(1));var i={};if(e.each(function(){$("[data-id="+$(this).data("id")+"]").each(function(){var e=$(this).closest(PF.obj.listing.selectors.content_listing).attr("id");i[e]||(i[e]=0),i[e]+=1})}),1==o?$("[data-id="+$(this).data("id")+"]").remove():e.each(function(){$("[data-id="+$(this).data("id")+"]").remove()}),PF.fn.listing.columnizerQueue(),PF.fn.listing.refresh(),CHV.fn.list_editor.selectionCount(),void 0!==t&&"string"==typeof t&&PF.fn.growl.expirable(t),$(PF.obj.listing.selectors.content_listing_pagination,a).exists()||0!=$(PF.obj.listing.selectors.list_item,a).length||(n=0),0==n)a.html(PF.obj.listing.template.empty),$(PF.obj.listing.selectors.content_listing+":not("+PF.obj.listing.selectors.content_listing_visible+")").data({empty:null,load:"ajax"}),$("[data-content=list-selection][data-tab="+a.attr("id")+"]").addClass("disabled");else if(0==$(PF.obj.listing.selectors.list_item,a).length){if($(PF.obj.listing.selectors.pad_content).height(0),$("[data-action=load-more]",a).exists())return $(PF.obj.listing.selectors.content_listing_visible).data("page",0),$("[data-action=load-more]",a).click(),void(PF.obj.listing.recolumnize=!0);var s=$("[data-pagination=next]",a);if(s.exists()){var r=s.attr("href"),l=PF.fn.deparam(r);return"page"in l&&l.page>1&&(r=r.changeURLParameterValue("page",l.page-1)),void(window.location=r)}}})}},deleteFromList:function(e){if(void 0===t)var t=!0;e=e instanceof jQuery==0?$(e):e;this.removeFromList(e,t?PF.fn._s("The content has been deleted."):null)},moveFromList:function(e,t){if(void 0===t)t=!0;e=e instanceof jQuery==0?$(e):e;this.removeFromList(e,t?PF.fn._s("The content has been moved."):null)},toggleSelectItem:function(e,t){if("boolean"!=typeof t)t=!e.hasClass("selected");var a,o,i,n=$(".viewer").is(":visible")?$("[data-type=image][data-id="+e.attr("data-id")+"]"):e,s=$("[data-action=select] .btn-icon",n);n.hasClass("unselect")||(n.addClass("unselect"),t?(Boolean(window.navigator.vibrate)&&window.navigator.vibrate([15,125,25]),n.addClass("selected"),a=s.data("icon-selected"),o=s.data("icon-unselected"),i=PF.fn._s("Unselect")):(n.removeClass("selected ui-selected"),a=s.data("icon-unselected"),o=s.data("icon-selected"),i=PF.fn._s("Select")),s.removeClass(o).addClass(a),setTimeout(function(){n.removeClass("unselect")},350),$("[data-action=select] .label",n).text(i),CHV.fn.list_editor.selectionCount())},selectItem:function(e){this.toggleSelectItem(e,!0)},unselectItem:function(e){this.toggleSelectItem(e,!1),e.removeClass("selected")},selectAll:function(e){this.selectItem($(PF.obj.listing.selectors.list_item+":visible:not(.selected)")),this.listMassActionSet("clear"),e.stopPropagation()},clearSelection:function(e){var t=$(PF.obj.listing.selectors.list_item+".selected",PF.obj.listing.selectors[e?"content_listing":"content_listing_visible"]);this.unselectItem(t),this.listMassActionSet("select")},listMassActionSet:function(e){var t="select"==e?"clear":"select",a=$("[data-text-select-all][data-action=list-"+t+"-all]:visible"),o=a.data("text-"+e+"-all");a.text(o).attr("data-action","list-"+e+"-all"),PF.fn.close_pops()},updateItem:function(e,t,a,o){if(e instanceof jQuery==0)e=$(e);var i=e.data("type"),n="image"==i?t.album:t;if(this.addAlbumtoModals(n),$("option[value="+n.id_encoded+"]","[name=form-album-id]").html(PF.fn.htmlEncode(n.name_with_privacy_readable_html)),void 0===a)a="edit";if("edit"==a||"move"==a){if("move"==a&&"album"==CHV.obj.resource.type)return void CHV.fn.list_editor.moveFromList(e,o);e.attr("data-description",t.description),"image"==i?(void 0!==t.title&&(e.attr("data-title",t.title),e.find("[title]").attr("title",t.title),$("[data-text=image-title]",e).text(PF.fn.htmlEncode(t.title))),void 0!==t.title_truncated&&$("[data-text=image-title-truncated]",e).html(PF.fn.htmlEncode(t.title_truncated)),void 0!==t.category_id&&e.attr("data-category-id",t.category_id),e.attr({"data-album-id":n.id_encoded,"data-flag":1==t.nsfw?"unsafe":"safe"}),$("[data-content=album-link]",e).attr("href",n.url)):e.attr({"data-privacy":n.privacy,"data-password":n.password,"data-name":n.name}),e.attr("data-privacy",n.privacy),$("[data-text=album-name]",e).html(PF.fn.htmlEncode(n.name)),PF.fn.growl.expirable("edit"==a?PF.fn._s("The content has been edited."):PF.fn._s("The content has been moved."))}},addAlbumtoModals:function(e){var t=!1;$("[name=form-album-id]","[data-modal]").each(function(){e.id_encoded&&!$("option[value="+e.id_encoded+"]",this).exists()&&($(this).append('"),t=!0)}),t&&CHV.fn.list_editor.updateUserCounters("album",1,"+")},updateAlbum:function(e){$("[data-id="+e.id_encoded+"]").each(function(){""!==e.html&&($(this).after(e.html),$(this).remove())})},updateUserCounters:function(e,t,a){if(void 0===a)a="+";var o,i,n=$("[data-text="+e+"-count]"),s=$("[data-text="+e+"-label]"),r=(t=parseInt(t),parseInt(n.html()));switch(a){case"+":o=r+t;break;case"-":o=r-t;break;case"=":o=t}i=o-r;var l=$("[data-text=total-"+n.data("text")+"]"),d=$("[data-text="+l.data("text")+"-label]"),c=parseInt(l.html()),u=c+i;n.text(o),l.text(u),s.text(s.data(1==o?"label-single":"label-plural")),d.text(s.data(1==u?"label-single":"label-plural"))},updateMoveItemLists:function(e,t,a){if(CHV.fn.list_editor.clearSelection(),/image/.test(t))"image"==t?CHV.fn.list_editor.updateItem("[data-type=image][data-id="+a.data("id")+"]",e.image,"move"):(a.each(function(){CHV.fn.list_editor.updateItem("[data-type=image][data-id="+$(this).data("id")+"]",e,"move",!1)}),PF.fn.growl.expirable(PF.fn._s("The content has been moved.")));else{if(CHV.fn.list_editor.moveFromList(a,!1),PF.fn.growl.expirable(PF.fn._s("The content has been moved.")),e.album)if(void 0!==e.albums_old?"true"==e.request.album.new:"true"==e.request.editing.new_album){CHV.fn.list_editor.addAlbumtoModals(e.album);var o=parseInt($("[data-text=album-count]").text())-1;$(PF.obj.listing.selectors.pad_content).each(function(){var t=$(this).find(PF.obj.listing.selectors.list_item).length;if(0!=t){var a=PF.fn.deparam($(this).closest(PF.obj.listing.selectors.content_listing).data("params"));"date_desc"!=a.sort&&o!=t||$(this)["date_desc"==a.sort?"prepend":"append"](e.album.html)}})}else CHV.fn.list_editor.updateAlbum(e.album);PF.fn.listing.columnizerQueue(),PF.fn.listing.refresh(0)}}},CHV.fn.import={errorHandler:function(e){PF.fn.growl.call(e.error.message)},reset:function(e){e=parseInt(e);CHV.obj.import.working[e].stats=$.ajax({type:"POST",data:{action:"importReset",id:e}}),CHV.obj.import.working[e].stats.complete(function(t){var a=t.responseJSON;if(a){var o=CHV.fn.import.parseTemplate(a.import);$("[data-id="+a.import.id+"]",CHV.obj.import.sel.root).replaceWith(o),"working"!=a.import.status&&clearInterval(CHV.obj.import.working[e].interval)}})},updateStats:function(e){e=parseInt(e);"readyState"in CHV.obj.import.working[e].stats&&4!=CHV.obj.import.working[e].stats.readyState?console.log("Aborting stats timeout call (previous call is still not ready)"):(CHV.obj.import.working[e].stats=$.ajax({type:"POST",data:{action:"importStats",id:e}}),CHV.obj.import.working[e].stats.complete(function(t){var a=t.responseJSON;if(a){var o=CHV.fn.import.parseTemplate(a.import);$("[data-id="+a.import.id+"]",CHV.obj.import.sel.root).replaceWith(o),"working"!=a.import.status&&clearInterval(CHV.obj.import.working[e].interval)}}))},delete:{submit:function(e){return PF.obj.modal.form_data={action:"importDelete",id:e},!0},deferred:{success:function(e){var t=e.responseJSON;PF.fn.growl.call(PF.fn._s("Import ID %s removed",t.import.id)),$("[data-id="+t.import.id+"]",CHV.obj.import.sel.root).remove(),1==$("li",CHV.obj.import.sel.root).size()&&$(CHV.obj.import.sel.root).addClass("hidden")},error:function(e){CHV.fn.import.errorHandler(e.responseJSON)}}},parseTemplate:function(e,t){var a=CHV.obj.import.rowTpl;for(var o in CHV.obj.import.importTr)void 0!==e[o]&&(a=a.replaceAll("%"+o+"%",e[o]));a=a.replaceAll("%parse%",e.options.root),a=a.replaceAll("%shortParse%",e.options.root.charAt(0)),a=a.replaceAll("%displayStatus%",CHV.obj.import.statusesDisplay[e.status]);var i=$($.parseHTML(a)).attr("data-object",JSON.stringify(e));return i}},CHV.fn.Palettes={timeout:{},get:function(){return($("html").get(0).className.match(/(^|\s)palette-\S+/g)||[]).join(" ")},set:function(e){$("html").attr("data-palette",e).removeClass(this.get()).addClass("palette-"+e)},preview:function(e){$("html").removeClass(this.get()).addClass("palette-"+e)},save:function(){clearTimeout(this.timeout),this.timeout=setTimeout(function(){$.ajax({type:"POST",data:{action:"paletteSet",palette_id:CHV.obj.config.palettesId[$("html").attr("data-palette")]},cache:!1})},400)}}; \ No newline at end of file +$(".default-user-image",e).addClass("hidden")},hide_default(a),$(".btn-alt",a).closest("div").show(),change_avatar(a),CHV.obj.logged_user.id==CHV.obj.resource.user.id&&(change_avatar(i),hide_default(i)),PF.fn.growl.expirable(PF.fn._s("Profile image updated."))):PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later.")),t.data("uploading",!1)}}}else PF.fn.growl.call(PF.fn._s("Please select a valid image file type."))}),$(document).on("change","[data-content=user-background-upload-input]",function(e){e.preventDefault(),e.stopPropagation();var t=$(this),a=$("[data-content=user-background-cover]"),o=$("[data-content=user-background-cover-src]"),i=$(".loading-placeholder",a),n=($("#top-bar"),$(this)[0].files[0]);if(!t.data("uploading"))if(0!=/^image\/.*$/.test(n.type))if(n.size>CHV.obj.config.user.background_max_filesize.getBytes())PF.fn.growl.call(PF.fn._s("Please select a picture of at most %s size.",CHV.obj.config.user.background_max_filesize));else{i.removeClass("hidden"),PF.fn.loading.inline(i,{center:!0,size:"big",color:"#FFF"}),t.data("uploading",!0);var s=new FormData;s.append("source",n),s.append("action","upload"),s.append("type","file"),s.append("what","background"),s.append("owner",CHV.obj.resource.user.id),s.append("auth_token",PF.obj.config.auth_token),avatarXHR=new XMLHttpRequest,avatarXHR.open("POST",PF.obj.config.json_api,!0),avatarXHR.send(s),avatarXHR.onreadystatechange=function(){if(4==this.readyState){var e="json"!==this.responseType?JSON.parse(this.response):this.response,n=e.success.image;if(200==this.status){var s=$("");s.attr("src",n.url).imagesLoaded(function(){i.addClass("hidden").empty(),o.css("background-image","url("+n.url+")").hide().fadeIn(),$("[data-content=user-change-background]",a).removeClass("hidden"),$(a).removeClass("no-background"),$(".top-user").removeClass("no-background"),$("[data-content=user-upload-background]").hide(),$("[data-content=user-change-background]").show(),PF.fn.growl.expirable(PF.fn._s("Profile background image updated.")),s.remove()})}else i.addClass("hidden").empty(),PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."));t.data("uploading",!1)}}}else PF.fn.growl.call(PF.fn._s("Please select a valid image file type."))}),CHV.fn.user_background={delete:{submit:function(){return PF.obj.modal.form_data={action:"delete",delete:"background",owner:CHV.obj.resource.user.id},!0},deferred:{success:{before:function(e){$("[data-content=user-background-cover-src]").css("background-image","none"),$("[data-content=user-background-cover], .top-user").addClass("no-background"),$("[data-content=user-background-cover]").height(""),$("[data-content=user-upload-background]").removeClass("hidden").show(),$("[data-content=user-change-background]").hide()},done:function(e){PF.fn.modal.close(function(){PF.fn.growl.expirable(PF.fn._s("Profile background image deleted."))})}},error:function(e){PF.fn.growl.expirable(PF.fn._s("Error deleting profile background image."))}}}},CHV.fn.user_api={delete:{submit:function(){return PF.obj.modal.form_data={action:"delete",delete:"api_key",owner:CHV.obj.resource.user.id},!0},deferred:{success:{before:function(e){},done:function(e){PF.fn.modal.close(function(){location.reload()})}},error:function(e){PF.fn.growl.expirable(e.responseJSON.error.message)}}}},CHV.fn.user_two_factor={delete:{submit:function(){return PF.obj.modal.form_data={action:"delete",delete:"two_factor",owner:CHV.obj.resource.user.id},!0},deferred:{success:{before:function(e){},done:function(e){PF.fn.modal.close(function(){location.reload()})}},error:function(e){PF.fn.growl.expirable(e.responseJSON.error.message)}}}},CHV.str.mainform="[data-content=main-form]",CHV.obj.timezone={selector:"[data-content=timezone]",input:"#timezone-region"},$(document).on("keyup change",CHV.str.mainform+" :input",function(){$(this).is("[name=username]")&&$("[data-text=username]").text($(this).val())}),$(document).on("change",CHV.obj.timezone.input,function(){var e=$(this).val(),t=$("#timezone-combo-"+e);t.find("option:first").prop("selected",!0),$(CHV.obj.timezone.selector).val(t.val()).change()}),$(document).on("change","[id^=timezone-combo-]",function(){var e=$(this).val();$(CHV.obj.timezone.selector).val(e).change()}),$(document).on("keyup change blur","[name^=new-password]",function(){var e=$("[name=new-password]"),t=$("[name=new-password-confirm]"),a=e.val()==t.val(),o=t.closest(".input-password").find(".input-warning");0==o.exists()&&(o=$("[data-message=new-password-confirm]")),$(this).is(t)&&t.data("touched",!0),t.data("touched")&&o.text(a?"":o.data("text"))[a?"addClass":"removeClass"]("hidden-visibility")}),$(document).on("submit",CHV.obj.mainform,function(){switch($(this).data("type")){case"password":var e=$("[name=new-password]",this),t=$("[name=new-password-confirm]",this);if((""!==e.val()||""!==t.val())&&e.val()!==t.val())return e.highlight(),t.highlight(),PF.fn.growl.expirable(PF.fn._s("Passwords don't match")),!1}}),$(document).on("click","[data-action=check-for-updates]",function(){PF.fn.loading.fullscreen(),CHV.fn.system.checkUpdates(function(e){if(PF.fn.loading.destroy("fullscreen"),200===e.status){var t=e.responseJSON.software;-1==PF.fn.versionCompare(CHV.obj.system_info.version,t.current_version)?PF.fn.modal.simple({title:' '+PF.fn._s("Chevereto v%s available",t.current_version),message:"

    "+PF.fn._s("There is a new Chevereto version available with the following release notes.")+" "+PF.fn._s("Check %s for a complete changelog since you last upgrade.",''+CHV.obj.system_info.version+'')+'

    "+PF.fn._s("Check the %s for alternative update methods.",''+PF.fn._s("documentation")+"")+'

    ",html:!0}):PF.fn.growl.call(PF.fn._s("This website is running latest %s version",CHEVERETO.edition))}else PF.fn.growl.call(PF.fn._s("An error occurred. Please try again later."))})}),void 0!==PF.fn.get_url_var("checkUpdates")&&$("[data-action=check-for-updates]").trigger("click"),void 0!==PF.fn.get_url_var("upgrade")&&$("[data-action=upgrade]").trigger("click"),void 0!==PF.fn.get_url_var("license")&&$("[data-action='license']").trigger("click"),void 0!==PF.fn.get_url_var("installed")&&PF.fn.modal.simple({title:' '+PF.fn._s("Chevereto v%s installed",CHV.obj.system_info.version),message:"

    "+PF.fn._s('Usage of Chevereto Software must be in compliance with the software license terms known as "The Chevereto License".')+'

    ",html:!0}),$(document).on("click","[data-action=system-update]",function(e){if(!$("input#system-update").prop("checked"))return PF.fn.growl.call(PF.fn._s("Please review the system requirements before proceeding")),void e.preventDefault()}),$(document).on("click","[data-action=toggle-storage-https]",function(){CHV.fn.storage.toggleHttps($(this).closest("[data-content=storage]").data("storage-id"))}),$(document).on("click","[data-action=toggle-storage-active]",function(){CHV.fn.storage.toggleActive($(this).closest("[data-content=storage]").data("storage-id"))}),$(CHV.fn.uploader.selectors.root).exists()&&(CHV.fn.uploader.$pasteCatcher=$("
    ",{contenteditable:"true",id:CHV.fn.uploader.selectors.paste.replace(/#/,"")}),$("body").append(CHV.fn.uploader.$pasteCatcher),$(document).on("keydown",function(e){!e.ctrlKey&&!e.metaKey||"KeyV"!=e.originalEvent.code||$(e.target).is(":input")||(PF.fn.keyFeedback.spawn(e),CHV.fn.uploader.$pasteCatcher.focus(e))}),document.addEventListener("dragover",function(e){e.preventDefault()}),document.addEventListener("drop",function(e){if(CHV.obj.config.upload.url){e.preventDefault();var t,a=e.dataTransfer.getData("text/html"),o=/src="?([^"\s]+)"?\s*/;t=o.exec(a),t&&(CHV.fn.uploader.toggle({show:!0}),CHV.fn.uploader.add({},t[1]))}}),window.addEventListener("paste",CHV.fn.uploader.pasteImageHandler)),$(document).on("click","[data-action=like]",function(){if(PF.fn.is_user_logged()){var e=$(this);if(!e.data("XHR")){e.data("XHR",!0);var t=$(this).is("[data-liked]")?$(this):$(this).closest("[data-liked]"),a=!t.closest("[data-list], .viewer").exists()&&void 0!==CHV.obj.resource,o=t.is("[data-liked=1]"),i=o?"dislike":"like",n={id:a?CHV.obj.resource.id:$(this).closest("[data-id]").attr("data-id"),type:a?CHV.obj.resource.type:$(this).closest("[data-type]").attr("data-type")},s=a?e:$("[data-type="+n.type+"][data-id="+n.id+"]"),r={type:"POST",data:{action:i},cache:!1};r.data[i]={object:n.type,id:n.id},$.ajax(r).complete(function(t){var i=t.responseJSON;e.data("XHR",!1),200===i.status_code?(a&&void 0!==i.content&&$("[data-text=likes-count]").html(i.content.likes),s.closest("[data-liked]").attr("data-liked",o?0:1)):PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."))})}}else window.location.href=CHV.obj.vars.urls.login}),$(document).on("click","[data-action=album-cover]",function(){var e=$(this);if(!e.data("XHR")){e.data("XHR",!0);var t=$(this).is("[data-cover]")?$(this):$(this).closest("[data-cover]"),a=t.is("[data-cover=1]"),o=a?"album-cover-unset":"album-cover-set",i=(CHV.obj.resource.id,e.closest("[data-cover]")),n={type:"POST",data:{action:o},cache:!1};n.data[o]={album_id:i.data("album-id"),image_id:i.data("id")},$.ajax(n).complete(function(t){var o=t.responseJSON;e.data("XHR",!1),200===o.status_code?i.attr("data-cover",a?0:1):PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."))})}}),$(document).on("click","[data-action=follow]",function(){if(PF.fn.is_user_logged()){var e=$(this);if(!e.data("XHR")){e.data("XHR",!0);var t=$(this).is("[data-followed]")?$(this):$(this).closest("[data-followed]"),a=void 0!==CHV.obj.resource,o=t.is("[data-followed=1]"),i=o?"unfollow":"follow",n={id:a?CHV.obj.resource.id:$(this).closest("[data-id]").data("id"),type:a?CHV.obj.resource.type:$(this).closest("[data-type]").data("type")},s={type:"POST",data:{action:i},cache:!1};s.data[i]={object:n.type,id:n.id},$.ajax(s).complete(function(i){var n=i.responseJSON;if(e.data("XHR",!1),200===n.status_code){if(a&&void 0!==n.user_followed){var s=$("[data-text=followers-label]"),r={single:s.data("label-single"),plural:s.data("label-plural")};$("[data-text=followers-count]").html(n.user_followed.followers),s.html(PF.fn._n(r.single,r.plural,n.user_followed.followers))}t.attr("data-followed",o?0:1)}else PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."))})}}else PF.fn.modal.call({type:"login"})}),$(document).on("click","[data-action=user_ban],[data-action=user_unban]",function(){var e=$(this);if(!e.data("XHR")){e.data("XHR",!0);var t=$(this).closest("[data-banned]"),a=!0,o=t.is("[data-banned=1]"),i=e.attr("data-action"),n={id:a?CHV.obj.resource.id:$(this).closest("[data-id]").data("id"),type:a?CHV.obj.resource.type:$(this).closest("[data-type]").data("type")},s={type:"POST",data:{action:i},cache:!1};s.data[i]={user_id:n.id},$.ajax(s).complete(function(a){var i=a.responseJSON;e.data("XHR",!1),200===i.status_code?t.attr("data-banned",o?0:1):PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."))})}}),$(document).on("click","[data-action=top-bar-notifications]",function(e){var a=this,o=$(this),i=$(".top-bar-notifications-container",o),n=$(".top-bar-notifications-list",o),s=$("ul",n),r=$(".loading",i);o.data("XHR")||(r.removeClass("hidden"),PF.fn.loading.inline(r,{size:"small",message:PF.fn._s("loading")}),$.ajax({type:"POST",data:{action:"notifications"},cache:!1}).complete(function(e){var l=e.responseJSON;if(200!==l.status_code)return PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later.")),o.data("XHR",!1),void r.addClass("hidden").html("");if(o.data("XHR",!0),r.remove(),l.html){n.removeClass("hidden"),s.html(l.html),t();var d=$("li.new",s);d.addClass("transition"),setTimeout(function(){d.removeClass("new"),$("[data-content=notifications-counter]",a).removeClass("on").html("0"),setTimeout(function(){d.removeClass("transition")},150)},1500)}else $(".empty",i).removeClass("hidden")}))}),$("#g-recaptcha").is(":empty")&&CHV.obj.config.captcha.enabled&&CHV.obj.config.captcha.sitekey&&("3"!=CHV.obj.config.captcha.version&&CHV.obj.config.captcha.isNeeded||$('label[for="recaptcha_response_field"]').remove()),$(document).on("click",PF.obj.listing.selectors.list_item+" a.image-container",function(e){var t=$(this).closest(PF.obj.listing.selectors.list_item),o=t.find("[data-action=load-image]");o.length>0&&(a(o),e.preventDefault())}),$(document).on("click",PF.obj.listing.selectors.list_item+" [data-action=load-image]",function(e){a($(this)),e.preventDefault(),e.stopPropagation()}),$(document).on("click","#album [data-tab=tab-embeds]",function(e){e.preventDefault,CHV.fn.album.showEmbedCodes()}),$("body").is("#upload")&&CHV.fn.uploader.toggle({show:!0}),$(document).on("keyup",function(e){if(!($(e.target).is(":input")||e.ctrlKey||e.metaKey||e.altKey)){var t=$("#fullscreen-modal:visible").exists(),a=$(".viewer"),o=$(".list-selection:visible"),i=o.find("[data-content=pop-selection]:visible:not(.disabled)"),n=$("body").hasClass("--viewer-shown"),s=$(CHV.fn.uploader.selectors.root+CHV.fn.uploader.selectors.show).exists(),r=e.originalEvent.code;if("Escape"===e.originalEvent.code){if(t)return;s&&CHV.fn.uploader.toggle({reset:!1})}if(a.exists()&&n){if(r in CHV.fn.listingViewer.keys){var l=["KeyW","Escape","ArrowLeft","ArrowRight"],d=CHV.fn.listingViewer.keys[r];-1==l.indexOf(r)?$("[data-action="+d+"]",CHV.fn.listingViewer.selectors.root).click():d in CHV.fn.listingViewer&&CHV.fn.listingViewer[d](),PF.fn.keyFeedback.spawn(e)}}else{var c,u={Period:"list-select-all",KeyK:"get-embed-codes",KeyZ:"clear",KeyA:"create-album",KeyM:"move",KeyO:"approve",Delete:"delete",KeyC:"assign-category",KeyV:"flag-safe",KeyF:"flag-unsafe",KeyH:"album-cover"},m={KeyE:"edit",KeyL:"like",KeyS:"share",KeyJ:"sub-album",KeyP:"upload-to-album"};d=u[r]||m[r];void 0!==d&&(o.exists()&&(n||t||parseInt($("[data-text=selection-count]:visible",i).text())>0&&(c=$("[data-action="+d+"]",o.closest(".list-selection")))),void 0===c&&(c=$("[data-action="+d+"]:visible").not("#content-listing-tabs *")),c instanceof jQuery&&c.length>0&&(c.first().trigger("click"),PF.fn.keyFeedback.spawn(e)))}}}),$(document).on("click",CHV.fn.listingViewer.selectors.root+" [data-action^=viewer-]",function(){var e=$(this).data("action").substring("viewer-".length);e in CHV.fn.listingViewer&&CHV.fn.listingViewer[e]()}),$(document).on("click","a[data-href]:not([rel=popup-link]):not(.popup-link)",function(){var e=$(this).attr("data-href"),t=$(this).attr("href");(e||t)&&(location.href=t||e)});var b,v=PF.obj.listing.selectors.list_item+", .image-container";($(document).on("contextmenu click",v,function(e){$(".list-selection:visible").exists()&&!$(this).closest(CHV.fn.listingViewer.selectors.root).exists()&&("click"!=e.type||e.ctrlKey||e.metaKey)&&o(this,e)}),navigator.userAgent.match(/(iPad|iPhone|iPod)/i))&&$(document).on("mouseup mousemove",v,function(e){return clearTimeout(b),!1}).on("mousedown",v,function(e){var t=this,a=e;return b=window.setTimeout(function(){$(".list-selection:visible").exists()&&!$(t).closest(CHV.fn.listingViewer.selectors.root).exists()&&o(t,a)},500),!1});void 0!==CHV.obj.config&&CHV.obj.config.listing.viewer&&$(document).on("click",PF.obj.listing.selectors.list_item+"[data-type=image] .image-container",function(e){if(e.preventDefault(),e.stopPropagation(),0!==e.clientX||0!==e.clientY){var t=$(this).closest(PF.obj.listing.selectors.list_item);t.exists()&&(e.ctrlKey||e.metaKey||CHV.fn.listingViewer.open(t))}else PF.fn.keyFeedback.spawn(e)}),$(document).on("contextmenu",CHV.fn.listingViewer.selectors.root,function(e){return e.preventDefault(),CHV.fn.listingViewer.zoom(),PF.fn.keyFeedback.spawn(e),!1});var _,w=PF.fn.deparam(window.location.search);if(w&&"viewer"in w){var C=$(PF.obj.listing.selectors.content_listing_visible);if("images"==C.data("list")){var P=$(PF.obj.listing.selectors.list_item,C)["next"==w.viewer?"first":"last"]();CHV.fn.listingViewer.open(P)}}$(window).on("DOMContentLoaded load resize scroll",function(){clearTimeout(_),_=setTimeout(function(){$(PF.obj.listing.selectors.list_item+":visible").each(function(){var e=$(this).find('[data-action="load-image"]').first(),t=PF.fn.deparam($(PF.obj.listing.selectors.list_item+"[data-id="+$(this).attr("data-id")+"]").closest(".content-listing").data("params-hidden")),o=t&&"is_animated"in t?t.is_animated:$(this).data("size")<=CHV.obj.config.image.load_max_filesize.getBytes();e.exists()&&o&&$(this).is_within_viewport(50)&&a(e)})},1e3)}),$(document).on("click","[data-action=logout]",function(){let e=$("form#form-logout");e.submit()}),Boolean(window.navigator.vibrate)&&$(document).on("click","button, .btn, .pop-btn, .top-btn-el, [data-action], .content-tabs a, .top-bar-logo a, .login-provider-button, .panel-share-networks li a, #image-viewer-loader",function(e){$(this).is("[data-action=top-bar-menu-full]")||(window.navigator.vibrate(0),window.navigator.vibrate(15))}),$(document).on("change keyup",CHV.fn.ctaForm.selectors.rows+" input[name^='cta-']",function(){CHV.fn.ctaForm.update($(this))}),$(document).on("click",CHV.fn.ctaForm.selectors.rows+" [data-action=cta-add]",function(){CHV.fn.ctaForm.insert($(this))}),$(document).on("click",CHV.fn.ctaForm.selectors.rows+" [data-action=cta-remove]",function(){CHV.fn.ctaForm.remove($(this)),0==CHV.fn.ctaForm.array.length&&$(CHV.fn.ctaForm.selectors.root+" "+CHV.fn.ctaForm.selectors.enable).prop("checked",!1).trigger("change")}),$(document).on("change",CHV.fn.ctaForm.selectors.root+" "+CHV.fn.ctaForm.selectors.enable,function(){let e=$(CHV.fn.ctaForm.selectors.combo,CHV.fn.ctaForm.selectors.root),t=$(this).is(":checked");e.toggleClass("soft-hidden",!t),t&&(0==CHV.fn.ctaForm.array.length&&CHV.fn.ctaForm.add(),CHV.fn.ctaForm.render()),CHV.fn.ctaForm.setEnable(t?1:0)}),$(document).on("change keyup",CHV.fn.ctaForm.selectors.root+" input[name^='cta-icon_']",function(){let e=CHV.fn.ctaForm.getRow($(this)),t=e.find("label[for^='cta-icon_'] [data-content=icon]");t.removeClass();let a=CHV.fn.ctaForm.getIconClass($(this).val());t.addClass(a)}),$(document).on("click","[href^='https://chevereto.com/']",function(e){let t=$(this).find(".badge--paid").exists();if(!t)return;let a=$(this).attr("href"),o=PF.fn._s("Get a license from %s to unlock all features and support.",'chevereto.com'),i=PF.fn._s("You can enter your license key in the dashboard panel.");e.preventDefault(),e.stopPropagation(),PF.fn.modal.simple({html:!0,title:' Upgrade Chevereto',message:"

    "+o+" "+i+'

    "})})}),"undefined"==typeof CHV&&(CHV={obj:{},fn:{},str:{}}),window.opener&&(CHV.obj.opener={uploadPlugin:{}}),CHV.fn.ctaButtons={selectors:{container:"[data-contains=cta-album]"},render:function(e=""){$(this.selectors.container).each(function(){$(this).html(e)})}},CHV.fn.ctaForm={enable:0,array:[],selectors:{root:"#cta-form",rows:"#cta-rows",enable:"#cta-enable",template:"#cta-row-template",combo:"#cta-combo",row:".cta-row"},update:function(e){let t=this.getPos(e),a=e.attr("name").match(/cta-(.*)?_\d+/)[1];this.array[t-1][a]=e.val()},add:function(e="",t="",a=""){this.array.push(this.getRowObject(e,t,a)),this.render()},insert:function(e){let t=this.getPos(e);this.array.splice(t,0,this.getRowObject()),this.render()},remove:function(e){let t=this.getPos(e);this.array.splice(t-1,1),this.render()},getRowObject:function(e="",t="",a=""){return{label:e,icon:t,href:a}},getIconClass:function(e){return/\s/g.test(e)?e:"fa-solid fa-"+e},getRow:function(e){return e.closest(this.selectors.row)},getPos:function(e){return this.getRow(e).data("pos")},getTemplateHtml:function(){return $(this.selectors.template).html()},getRowHtml:function(e,t){return this.getTemplateHtml().replaceAll(/%pos%/g,e).replaceAll(/%label%/g,t.label).replaceAll(/%href%/g,t.href).replaceAll(/%icon%/g,t.icon).replaceAll(/%iconClass%/g,this.getIconClass(t.icon))},render:function(){let e=$(this.selectors.root),t=e.find(this.selectors.rows),a=this;this.destroy(),$.each(this.array,function(e,o){t.append(a.getRowHtml(e+1,o))}),this.setEnable(this.enable),t.sortable({cursor:"grabbing",axis:"y",update:function(){let e=[];$(this).find(a.selectors.row).each(function(){let t=a.getPos($(this));e.push(a.array[t-1])}),a.array=e,a.render()}})},setEnable:function(e){let t=$(this.selectors.rows,this.selectors.root);this.enable=e;let a=1===this.enable;$("input[data-required]",t).each(function(){$(this).attr("required",a)})},destroy:function(){let e=$(this.selectors.root),t=e.find(this.selectors.rows);try{t.sortable("destroy")}catch(e){}t.empty()}},CHV.fn.album={showEmbedCodes:function(){var e=$(".content-listing-loading","#tab-embeds");if(e.exists()){var t=$("#embed-codes");$.ajax({url:PF.obj.config.json_api,type:"POST",dataType:"json",data:{action:"get-album-contents",albumid:CHV.obj.resource.id,auth_token:PF.obj.config.auth_token},cache:!1}).always(function(a){PF.fn.loading.destroy(e),200==a.status_code&&(CHV.fn.fillEmbedCodes(a.contents,"#tab-embeds"),$("#tab-embeds").addClass("visible"),t.removeClass("soft-hidden"))})}}},CHV.fn.modal={getTemplateWithPreview:function(e,t){var a=$(e).html(),o=$("
    "),i="",n=t.find(".image-container img").attr("src");return void 0!==n&&(i+='';var e=$(this).find(".image-container img");e.exists()?n+='':(n+='',n+=''),n+="",s++}),i.html(o).find(".image-preview").html(n),i.html()}},CHV.fn.listingViewer={selectors:{bodyShown:".--viewer-shown",content:".viewer-content",template:"#viewer-template",root:".viewer",rootShow:".viewer--show",rootHide:".viewer--hide",rootZero:".viewer--zero",rootNavPrev:".viewer--nav-prev",rootNavNext:".viewer--nav-next",src:".viewer-src",tools:".viewer-tools",loader:".viewer-loader",owner:".viewer-owner",ownerGuest:".viewer-owner--guest",ownerUser:".viewer-owner--user",inputMap:".viewer-kb-input"},keys:{ArrowLeft:"prev",ArrowRight:"next",Delete:"delete",Escape:"close",KeyA:"create-album",KeyE:"edit",KeyF:"flag",KeyL:"like",KeyM:"move",KeyO:"approve",KeyS:"share",KeyW:"zoom",Period:"select"},keymap:{"create-album":["A",PF.fn._s("Create album")],approve:["O",PF.fn._s("Approve")],close:["Esc",PF.fn._s("Close")],delete:["Del",PF.fn._s("Delete")],edit:["E",PF.fn._s("Edit")],flag:["F",PF.fn._s("Toggle flag")],like:["L",PF.fn._s("Like")],move:["M",PF.fn._n("Move")],next:["►",PF.fn._s("Next")],prev:["◄",PF.fn._s("Previous")],select:[".",PF.fn._s("Toggle select")],share:["S",PF.fn._s("Share")],zoom:["W",PF.fn._s("Zoom")]},loading:null,idleTimer:0,$item:null,show:function(){PF.fn.deparam(this.$item.closest(PF.obj.listing.selectors.content_listing_visible).data("params-hidden"));this.getEl("root").removeClass(this.selectors.rootHide.substring(1)).addClass(this.selectors.rootShow.substring(1)),$("body").addClass(this.selectors.bodyShown.substring(1));var e=new Hammer($(CHV.fn.listingViewer.selectors.root).get(0),{direction:Hammer.DIRECTION_VERTICAL});e.on("swipeleft swiperight",function(e){var t="left"==e.type.substring("swipe".length)?"next":"prev";CHV.fn.listingViewer[t]()}),this.getEl("root")[(PF.fn.isDevice(["phone","phablet"])?"add":"remove")+"Class"]("--over")},getItem:function(){return this.$item},getEl:function(e){var t=!e.startsWith("template")&&!e.startsWith("root")&&this.selectors.root;return t?$(this.selectors[e],t):$(this.selectors[e])},getObject:function(e){if(e||void 0===this.object){var t=decodeURIComponent(this.getItem().attr("data-object"));this.object=JSON&&JSON.parse(t)||$.parseJSON(t)}return this.object},placeholderSizing:function(){if(this.getEl("root").exists()){var e=Math.max(document.documentElement.clientWidth,window.innerWidth||0),t=Math.max(document.documentElement.clientHeight,window.innerHeight||0),a=e/t,o=this.getEl("src")[0],i=o.getAttribute("width"),n=o.getAttribute("height"),s=i/n,r=a0?"add":t.getItem()[o]().exists()?"add":"remove";a[n+"Class"](i.substring(1))}),$.each(this.getItem().get(0).attributes,function(e,t){if(!t.name.startsWith("data-"))return!0;a.attr(t.name,t.value)});var n=void 0===this.object.user?"user":"guest";n="owner"+(n.charAt(0).toUpperCase()+n.slice(1).toLowerCase()),this.getEl(n).remove(),void 0!==this.object.user&&$(this.object.user.avatar?".default-user-image":"img.user-image",this.getEl("ownerUser")).remove();var s=this.getItem().find(".list-item-image-tools[data-action='list-tools']");this.getEl("tools").append(s.html());let r=this;this.getEl("tools").find(".list-tool[data-action]").each(function(){$(this).attr("title",$(this).attr("title")+" ("+r.keymap[$(this).attr("data-action")][0]+")")}),this.placeholderSizing(),this.trickyLoad()},zoom:function(){this.getEl("root").attr("data-cover","1"==this.getEl("root").attr("data-cover")?"0":"1")},remove:function(){this.getEl("root").remove()},getParsedTemplate:function(){var e=this.getObject(!0),t=this.getEl("template").html(),a=t.match(/%(\S+)%/g);return a&&$.each(a,function(a,o){var i,n=o.slice(1,-1).split(".");n.map(function(t){var a=i||e;t in a&&(i=a[t])});var s=new RegExp(o,"g");i=void 0===i?"":i,t=t.replace(s,i)}),t},insertEl:function(){var e=this.getParsedTemplate();this.getEl("rootZero").remove(),$(e).appendTo("body")},toggleIdle:function(e,t){var a=this;t=void 0===t||t;$("html")[(e?"add":"remove")+"Class"]("--idle"),e||(clearTimeout(a.idleTimer),t&&(a.idleTimer=setTimeout(function(){var e=$(".fullscreen"),t=a.getEl("root");a.toggleIdle(t.length>0&&0==e.length)},5e3)))},open:function(e){if(e.exists()){this.setItem(e),this.insertEl(),this.filler(),this.show(),this.toggleIdle(!1);var t=this;this.getEl("root").on("mousemove mouseout",function(){t.toggleIdle(!1)})}else this.getEl("rootZero").remove()},setItem:function(e){this.$item=e},trickyLoad:function(){if(this.object.image.url!=this.object.display_url){var e=this.getEl("src").parent().html(),t=$(e).attr("src",this.object.image.url);t.insertBefore(this.getEl("src")),t.imagesLoaded(function(){t.next().remove()})}},close:function(){var e=this;$(this.selectors.root).removeClass(this.selectors.rootShow.substring(1)).addClass(this.selectors.rootHide.substring(1)),$("body").removeClass(this.selectors.bodyShown.substring(1)),this.toggleIdle(!1,!1),null!==this.getItem()&&$(window).scrollTop(this.getItem().offset().top);var t=$("#top-bar, .follow-scroll");t.attr("data-scroll-lock","1"),setTimeout(function(){e.remove()},250),setTimeout(function(){t.removeAttr("data-scroll-lock")},300)},browse:function(e){var t=this.getItem()[e]();if(t.exists()){this.setItem(t),this.filler(!0);var a=$(PF.obj.listing.selectors.content_listing_visible).find("[data-action=load-more]"),o=t[e+"All"]().length;a.length>0&&o<=5&&!PF.obj.listing.calling&&"next"==e&&$("[data-action=load-more]").click()}else{var i=$("[data-pagination="+e+"]",PF.obj.listing.selectors.content_listing_pagination+":visible"),n=i.attr("href");if(!n)return;PF.fn.deparam(window.location.search);window.location.href=n+"&viewer="+e}},prev:function(){this.browse("prev")},next:function(){this.browse("next")}},CHV.obj.image_viewer={selector:"#image-viewer",container:"#image-viewer-container",navigation:".image-viewer-navigation",loading:"#image-viewer-loading",loader:"#image-viewer-loader"},CHV.obj.image_viewer.$container=$(CHV.obj.image_viewer.container),CHV.obj.image_viewer.$navigation=$(CHV.obj.image_viewer.navigation),CHV.obj.image_viewer.$loading=$(CHV.obj.image_viewer.loading),CHV.fn.system={checkUpdates:function(e){$.ajax({url:CHEVERETO.api.get.info+"/",data:{id:CHEVERETO.id},cache:!1}).always(function(t,a,o){"function"==typeof e&&e(o)})}},("MacIntel"===navigator.platform&&navigator.maxTouchPoints>0||"iPad"===navigator.platform)&&$("html").removeClass("device-nonmobile"),CHV.fn.bindSelectableItems=function(){var e="content-listing-wrapper",t="#"+e;$(t).exists()?$(t).hasClass("ui-selectable")&&$(t).selectable("destroy"):$("#content-listing-tabs").wrap("
    "),$("[data-content=list-selection]").exists()&&$("html.device-nonmobile "+t).selectable({delay:150,filter:PF.obj.listing.selectors.list_item,cancel:".content-empty, .header, #tab-share, #tab-info, .viewer-title, .header-link, .top-bar, .content-listing-pagination *, #fullscreen-modal, #top-user, #background-cover, .list-item-desc, .list-item-image-tools, [data-action=load-image], #tab-embeds",classes:{"ui-selected":"selected"},selected:function(e,t){$(t.selected).removeClass("ui-selected")},selecting:function(e,t){var a=$(t.selecting),o=a.hasClass("selected");CHV.fn.list_editor[(o?"unselect":"select")+"Item"](a)},unselecting:function(e,t){CHV.fn.list_editor.unselectItem($(t.unselecting))}})},CHV.fn.isCachedImage=function(e){var t=new Image;return t.src=e,t.complete||t.width+t.height>0},CHV.fn.viewerLoadImage=function(){if(CHV.obj.image_viewer.$loading.exists()&&(CHV.obj.image_viewer.$loading.removeClass("soft-hidden").css({zIndex:2}),PF.fn.loading.inline(CHV.obj.image_viewer.$loading,{color:"white",size:"small",center:!0,valign:!0}),CHV.obj.image_viewer.$loading.hide().fadeIn("slow")),$(CHV.obj.image_viewer.loader).remove(),CHV.obj.image_viewer.image.is_360)return PF.fn.loading.destroy(CHV.obj.image_viewer.$loading),pannellum.viewer("image-viewer-360",{autoLoad:!0,type:"equirectangular",panorama:CHV.obj.image_viewer.image.url,preview:CHV.obj.image_viewer.$container.find("img").eq(0).attr("src"),pitch:2.3,yaw:-135.4,hfov:120}),$("#image-viewer-360").removeClass("soft-hidden"),void CHV.obj.image_viewer.$container.find("img").eq(0).remove();CHV.obj.image_viewer.image.html=CHV.obj.image_viewer.$container.html(),CHV.obj.image_viewer.$container.prepend($(CHV.obj.image_viewer.image.html).css({top:0,zIndex:0,opacity:0,position:"absolute"})),CHV.obj.image_viewer.$container.find("img").eq(0).css("zIndex",1),CHV.obj.image_viewer.$container.find("img").eq(1).attr("src",CHV.obj.image_viewer.image.url), +CHV.obj.image_viewer.$container.find("img").eq(1).imagesLoaded(function(){CHV.obj.image_viewer.$container.find("img").eq(1).css({position:"",display:""}),CHV.obj.image_viewer.$container.find("img").eq(0).remove(),PF.fn.loading.destroy(CHV.obj.image_viewer.$loading)})},CHV.obj.embed_share_tpl={},CHV.obj.embed_upload_tpl={},CHV.obj.topBar={transparencyScrollToggle:function(){var e=$(window).scrollTop();$("#top-bar")[(e>0?"remove":"add")+"Class"]("transparent")}},CHV.obj.uploaderReset={isUploading:!1,canAdd:!0,queueStatus:"ready",uploadThreads:0,uploadParsedIds:[],uploadProcessedIds:[],files:{},results:{success:{},error:{}},toggleWorking:0,filesAddId:0,clipboardImages:[]},CHV.fn.uploader={files:{},selectors:{root:"#anywhere-upload",show:".upload-box--show",queue:"#anywhere-upload-queue",queue_complete:".queue-complete",queue_item:".queue-item",close_cancel:"[data-button=close-cancel]",file:"#anywhere-upload-input",camera:"#anywhere-upload-input-camera",upload_item_template:"#anywhere-upload-item-template",item_progress_bar:"[data-content=progress-bar]",failed_result:"[data-content=failed-upload-result]",fullscreen_mask:"#fullscreen-uploader-mask",dropzone:"#uploader-dropzone",paste:"#anywhere-upload-paste",input:"[data-action=anywhere-upload-input]"},toggle:function(e,t){this.queueSize();var a=$("[data-action=top-bar-upload]",".top-bar"),o=!$(CHV.fn.uploader.selectors.root).data("shown");e=$.extend({callback:null,reset:!0},e);if(void 0!==e.show&&e.show&&(o=!0),PF.fn.growl.close(!0),PF.fn.close_pops(),!(1==this.toggleWorking||$(CHV.fn.uploader.selectors.root).is(":animated")||CHV.fn.uploader.isUploading||a.data("login-needed")&&!PF.fn.is_user_logged())){this.toggleWorking=1;var i={time:500,easing:null},n=function(){!o&&e.reset&&CHV.fn.uploader.reset(),PF.fn.topMenu.hide(),"function"==typeof e.callback&&e.callback(t),CHV.fn.uploader.boxSizer(),CHV.fn.uploader.toggleWorking=0};if($(CHV.fn.uploader.selectors.root)[(o?"add":"remove")+"Class"](this.selectors.show.substring(1)),o){if($("html").data({"followed-scroll":$("html").hasClass("followed-scroll"),"top-bar-box-shadow-prevent":!0}).removeClass("followed-scroll").addClass("overflow-hidden top-bar-box-shadow-none"),$("#top-bar").data({stock_classes:$("#top-bar").attr("class")}).addClass("scroll-up"),$(".current[data-nav]",".top-bar").each(function(){$(this).is("[data-action=top-bar-menu-full]")||$(this).removeClass("current").attr("data-current",1)}),PF.fn.isDevice("mobile")){var s=$(".upload-box-heading",$(CHV.fn.uploader.selectors.root));s.css({position:"relative",top:.5*($(window).height()-s.height())+"px"})}CHV.fn.uploader.focus(function(){setTimeout(function(){n()},i.time)})}else{$("#top-bar")[0].className=$("#top-bar").data("stock_classes"),$("[data-nav][data-current=1]",".top-bar").each(function(){$(this).addClass("current")}),setTimeout(function(){$(CHV.fn.uploader.selectors.fullscreen_mask).css({opacity:0})},.1*i.time),setTimeout(function(){$(CHV.fn.uploader.selectors.fullscreen_mask).remove()},i.time);var r=$(CHV.fn.uploader.selectors.root).outerHeight(),l=r-parseInt($(CHV.fn.uploader.selectors.root).data("initial-height"))+"px";$(CHV.fn.uploader.selectors.root).css({transform:"translate(0,-"+l+")"}),setTimeout(function(){$(CHV.fn.uploader.selectors.root).css({top:""}),n(),$("html,body").removeClass("overflow-hidden").data({"top-bar-box-shadow-prevent":!1}),$("#top-bar *").trigger("blur")},i.time)}$(CHV.fn.uploader.selectors.root).data("shown",o),a.toggleClass("current").removeClass("opened")}},reset:function(){$.extend(this,$.extend(!0,{},CHV.obj.uploaderReset)),$("li",this.selectors.queue).remove(),$(this.selectors.root).height("").css({"overflow-y":"","overflow-x":""}),$(this.selectors.queue).addClass("queueEmpty").removeClass(this.selectors.queue_complete.substring(1)),$(this.selectors.input,this.selectors.root).each(function(){$(this).prop("value",null)}),$("[data-group=upload-result] textarea",this.selectors.root).prop("value",""),$.each(["upload-queue-ready","uploading","upload-result","upload-queue-ready","upload-queue"],function(e,t){$("[data-group="+t+"]").hide()}),$("[data-group=upload]",this.selectors.root).show(),$("[name=upload-album-id]",this.selectors.root).prop("value",function(){var e=$("option[selected]",this);if(e.exists())return e.attr("value")}),$(this.selectors.root).removeClass("queueCompleted queueReady queueHasResults").addClass("queueEmpty").attr("data-queue-size",0),$("[name=upload-category-id]",this.selectors.root).prop("value",""),$("[name=upload-nsfw]",this.selectors.root).prop("checked",this.defaultChecked),this.boxSizer(!0)},focus:function(e){$(this.selectors.fullscreen_mask).exists()||($("body").is("#upload")||$("body").append($("
    ",{id:this.selectors.fullscreen_mask.replace("#",""),class:"fullscreen black"}).css({top:PF.fn.isDevice("phone")?0:$(CHV.fn.uploader.selectors.root).data("top")})),setTimeout(function(){$("body").is("#upload")||$(CHV.fn.uploader.selectors.fullscreen_mask).css({opacity:1}),setTimeout(function(){"function"==typeof e&&e()},PF.fn.isDevice(["phone","phablet"])?0:250)},1))},boxSizer:function(e){var t=$(this.selectors.root).is(this.selectors.show),a=t||e;t&&$("html").addClass("overflow-hidden"),a&&($(this.selectors.root).height(""),!$("body").is("#upload")&&$(this.selectors.root).height()>$(window).height()?($(this.selectors.root).height($(window).height()-$("#top-bar").height()).css({"overflow-y":"scroll","overflow-x":"auto"}),$("body").addClass("overflow-hidden")):$(this.selectors.root).css("overflow-y",""))},pasteURL:function(){var e=$("[name=urls]",PF.obj.modal.selectors.root),t=e.val();t&&(CHV.fn.uploader.toggle({show:!0}),CHV.fn.uploader.add({},t))},pasteImageHandler:function(e){if(!$(e.target).is(":input")){if(void 0!==e.clipboardData&&e.clipboardData.items)var t=e.clipboardData.items;else setTimeout(function(){return e.clipboardData={},e.clipboardData.items=[],$.each($("img",CHV.fn.uploader.$pasteCatcher),function(t,a){e.clipboardData.items.push(PF.fn.dataURItoBlob($(this).attr("src")))}),$(CHV.fn.uploader.selectors.paste).html(""),CHV.fn.uploader.pasteImageHandler(e)},1);if(t){const e=new Array,i=new Array;let n=$(CHV.fn.uploader.selectors.root).data("shown");for(var a=0;ap||f==p){var h=pp&&$img.height(h).width(h*g)}if(f0){var v="";for(l=0;l"+PF.fn.htmlEncode(m[l].name)+"",delete CHV.fn.uploader.files[m[l].uid],$("li[data-id="+m[l].uid+"]",CHV.fn.uploader.selectors.queue).find("[data-action=cancel]").click();PF.fn.modal.simple({title:PF.fn._s("Some files couldn't be added"),message:"
      "+v+"
    "})}else CHV.fn.uploader.focus();CHV.fn.uploader.boxSizer()}},$.extend({},C,{orientation:a.exif?a.exif.get("Orientation"):1})),setTimeout(function(){o(e+1)},25)}))}else PF.fn.loading.destroy("fullscreen")}var i;if(!this.canAdd){e=e.originalEvent;return e.preventDefault(),e.stopPropagation(),!1}$fileinput=$(this.selectors.file),$fileinput.replaceWith($fileinput=$fileinput.clone(!0));var n=$(this.selectors.upload_item_template).html();let s=[],r=[];if(void 0===t){e=e.originalEvent;e.preventDefault(),e.stopPropagation();var l=e.dataTransfer||e.target;if("items"in l)for(var d=l.items,c=0;cCHV.obj.config.image.max_filesize.getBytes()?m.push({uid:c,name:p.name.truncate_middle()+" - "+PF.fn._s("File too big.")}):-1!=CHV.obj.config.upload.image_types.indexOf(f)||0!=/android/i.test(navigator.userAgent)?(i&&(p.md5=i),p.fromClipboard=1==e.clipboard,p.uid=c):m.push({uid:c,name:p.name.truncate_middle()+" - "+PF.fn._s("Invalid or unsupported file format.")})}for(c=0;c0&&0==s.length){var h="";for(c=0;c"+PF.fn.htmlEncode(m[c].name)+"";return void PF.fn.modal.simple({title:PF.fn._s("Some files couldn't be added"),message:"
    • "+h+"
    "})}if(0==s.length)return}else{if(t=t.replace(/(<([^>]+)>)/g,"").replace(/(\[([^\]]+)\])/g,""),s=t.match_urls(),!s)return;s=s.array_unique(),s=$.map(s,function(e,t){return{uid:t,name:e,url:e}})}if($.isEmptyObject(this.files))for(c=0;c0){var i=[];for(var o in this.results.error)"object"==typeof this.results.error[o]&&(i[o]=this.results.error[o].error.message);i.length>0&&$(this.selectors.failed_result).html("
  • "+i.join("
  • ")+"
  • ")}else $(a.error,this.selectors.root).hide();if(!window.opener&&0==CHV.obj.config.upload.moderation&&CHV.obj.config.upload.redirect_single_upload&&1==Object.size(this.results.success)&&0==Object.size(this.results.error))return window.location.href=this.results.success[Object.keys(this.results.success)[0]].image.path_viewer,!1;if($("[data-text=queue-progress]",this.selectors.root).text(100),$("[data-group=uploading]",this.selectors.root).hide(),$(this.selectors.root).removeClass("queueUploading queueHasResults").addClass("queueCompleted"),$(this.selectors.queue).addClass(this.selectors.queue_complete.substring(1)),Object.size(this.results.success)>0&&$("[data-group=upload-result] textarea",this.selectors.root).exists()&&CHV.fn.fillEmbedCodes(this.results.success,CHV.fn.uploader.selectors.root,"val"),Object.size(this.results.success)>0&&Object.size(this.results.error)>0?$(a.mixed+", "+a.success,this.selectors.root).show():Object.size(this.results.success)>0?$(a.success,this.selectors.root).show():Object.size(this.results.error)>0&&$(a.error,this.selectors.root).show(),$(a.success,this.selectors.root).is(":visible")){$(a.success,this.selectors.root).find("[data-group^=user], [data-group=guest]").hide(),$(a.success,this.selectors.root).find("[data-group="+(PF.fn.is_user_logged()?"user":"guest")+"]").show();var n=Object.keys(this.results.success)[0];if(void 0!==this.results.success[n].image.album){var s=[];for(var r in this.results.success){var l=this.results.success[r].image;l.album&&l.album.id_encoded&&-1==s.indexOf(l.album.id_encoded)&&s.push(l.album.id_encoded)}var d={link:null,text:null};if(s.length<=1?(d.link=this.results.success[n].image.album.url,d.text=this.results.success[n].image.album.name):(d.link=this.results.success[n].image.user.url_albums,d.text=PF.fn._s("%s's Albums",this.results.success[n].image.user.name_short_html)),$("[data-text=upload-target]",this.selectors.root).text(d.text),$("[data-link=upload-target]",this.selectors.root).attr("href",d.link),PF.fn.is_user_logged()){var c=s.length>0?"album":"stream";$("[data-group=user-"+c+"]",this.selectors.root).show()}}}if(this.boxSizer(),this.queueStatus="done",window.opener&&void 0!==CHV.obj.opener.uploadPlugin[window.name]){if($('[data-action="copy"]',this.selectors.root).remove(),CHV.obj.opener.uploadPlugin[window.name].hasOwnProperty("autoInsert")&&CHV.obj.opener.uploadPlugin[window.name].autoInsert){var u=$(':input[name="'+CHV.obj.opener.uploadPlugin[window.name].autoInsert+'"]',CHV.fn.uploader.selectors.root),m=u.val();if(m)return window.opener.postMessage({id:window.name,message:m},"*"),void window.close()}}else $('[data-action="openerPostMessage"]',this.selectors.root).remove()}},$.extend(CHV.fn.uploader,$.extend(!0,{},CHV.obj.uploaderReset)),CHV.fn.fillEmbedCodes=function(e,t,a){void 0===a&&(a="val");var o=CHV.fn.uploader.selectors.root==t?"embed_upload_tpl":"embed_share_tpl";$.each(e,function(e,i){if(void 0!==i){var n="id_encoded"in i?i:i.image;if(!n.medium){n.medium={};for(var s=["filename","name","width","height","extension","size","size_formatted","url"],r=0;r0&&$.each(CHV.obj.categories,function(o,i){return void 0!==e&&i.id==e||(i.url_key==$("[name=form-category-url_key]",t).val()?(a=!0,!1):void 0)}),!a||(PF.fn.growl.call(PF.fn._s("Category URL key already being used.")),$("[name=form-category-url_key]",t).highlight(),!1)))},edit:{before:function(e){var t=$(e.target),a=t.data("category-id"),o=CHV.obj.categories[a],i="[data-modal="+t.data("target")+"]";$.each(CHV.fn.category.formFields,function(e,t){e="form-category-"+t,t=o[t];var a=$("[name="+e+"]",i);a.is("textarea")?a.html(PF.fn.htmlEncode(t)):a.attr("value",t)})},submit:function(){var e=PF.obj.modal.selectors.root,t=$("[name=form-category-id]",e).val();return!!CHV.fn.category.validateForm(t)&&(PF.obj.modal.form_data={action:"edit",edit:"category",editing:{}},$.each(CHV.fn.category.formFields,function(t,a){PF.obj.modal.form_data.editing[a]=$("[name=form-category-"+a+"]",e).val()}),!0)},complete:{success:function(e){var t=e.responseJSON.category,a="[data-content=category][data-category-id="+t.id+"]";$.each(t,function(e,t){$("[data-content=category-"+e+"]",a).html(PF.fn.htmlEncode(t))}),$("[data-link=category-url]").attr("href",t.url),CHV.obj.categories[t.id]=t,PF.fn.growl.expirable(PF.fn._s("The content has been edited."))}}},delete:{before:function(e){var t=$(e.target),a=t.data("category-id"),o=CHV.obj.categories[a];t.attr("data-confirm",t.attr("data-confirm").replace("%s",'"'+o.name+'"'))},submit:function(e){return PF.obj.modal.form_data={action:"delete",delete:"category",deleting:{id:e}},!0},complete:{success:function(e){PF.fn.growl.expirable(PF.fn._s("Category successfully deleted."));var t=e.responseJSON.request.deleting.id;$("[data-content=category][data-category-id="+t+"]").remove(),delete CHV.obj.categories[t]}}},add:{submit:function(){var e=PF.obj.modal.selectors.root;return!!CHV.fn.category.validateForm()&&(PF.obj.modal.form_data={action:"add-category",category:{}},$.each(CHV.fn.category.formFields,function(t,a){"id"!=a&&(PF.obj.modal.form_data.category[a]=$("[name=form-category-"+a+"]",e).val())}),!0)},complete:{success:function(e){var t=e.responseJSON.category,a="[data-content=dashboard-categories-list]",o=$("[data-content=category-dashboard-template]").html();$.each(t,function(e,t){o=o.replace(new RegExp("%"+e.toUpperCase()+"%","g"),t||"")}),$(a).append(o),0==Object.size(CHV.obj.categories)&&(CHV.obj.categories={}),CHV.obj.categories[t.id]=t,PF.fn.growl.call(PF.fn._s("Category %s added.",'"'+t.name+'"'))}}}},CHV.fn.ip_ban={formFields:["id","ip","expires","message"],validateForm:function(e){var t=PF.obj.modal.selectors.root,a=!1,o=$("[name=form-ip_ban-ip]",t).val();return!!CHV.fn.common.validateForm(t)&&(""!==$("[name=form-ip_ban-expires]",t).val()&&0==/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/.test($("[name=form-ip_ban-expires]",t).val())?(PF.fn.growl.call(PF.fn._s("Invalid expiration date.")),$("[name=form-ip_ban-expires]",t).highlight(),!1):(Object.size(CHV.obj.ip_bans)>0&&$.each(CHV.obj.ip_bans,function(t,i){return void 0!==e&&i.id==e||(i.ip==o?(a=!0,!1):void 0)}),!a||(PF.fn.growl.call(PF.fn._s("IP %s already banned.",o)),$("[name=form-ip_ban-ip]",t).highlight(),!1)))},add:{submit:function(){var e=PF.obj.modal.selectors.root;return!!CHV.fn.ip_ban.validateForm()&&(PF.obj.modal.form_data={action:"add-ip_ban",ip_ban:{}},$.each(CHV.fn.ip_ban.formFields,function(t,a){"id"!=a&&(PF.obj.modal.form_data.ip_ban[a]=$("[name=form-ip_ban-"+a+"]",e).val())}),!0)},complete:{success:function(e){var t=e.responseJSON.ip_ban,a="[data-content=dashboard-ip_bans-list]",o=$("[data-content=ip_ban-dashboard-template]").html();void 0!==o&&($.each(t,function(e,t){o=o.replace(new RegExp("%"+e.toUpperCase()+"%","g"),t||"")}),$(a).append(o)),0==Object.size(CHV.obj.ip_bans)&&(CHV.obj.ip_bans={}),CHV.obj.ip_bans[t.id]=t,$("[data-content=ban_ip]").addClass("hidden"),$("[data-content=banned_ip]").removeClass("hidden"),PF.fn.growl.call(PF.fn._s("IP %s banned.",t.ip))},error:function(e){var t=e.responseJSON.error;PF.fn.growl.call(PF.fn._s(t.message))}}},edit:{before:function(e){var t=$(e.target),a=t.data("ip_ban-id"),o=CHV.obj.ip_bans[a],i="[data-modal="+t.data("target")+"]";$.each(CHV.fn.ip_ban.formFields,function(e,t){e="form-ip_ban-"+t,t=o[t];var a=$("[name="+e+"]",i);a.is("textarea")?a.html(PF.fn.htmlEncode(t)):a.attr("value",t)})},submit:function(){var e=PF.obj.modal.selectors.root,t=$("[name=form-ip_ban-id]",e).val();return!!CHV.fn.ip_ban.validateForm(t)&&(PF.obj.modal.form_data={action:"edit",edit:"ip_ban",editing:{}},$.each(CHV.fn.ip_ban.formFields,function(t,a){PF.obj.modal.form_data.editing[a]=$("[name=form-ip_ban-"+a+"]",e).val()}),!0)},complete:{success:function(e){ +var t=e.responseJSON.ip_ban,a="[data-content=ip_ban][data-ip_ban-id="+t.id+"]";$.each(t,function(e,t){$("[data-content=ip_ban-"+e+"]",a).html(PF.fn.htmlEncode(t))}),CHV.obj.ip_bans[t.id]=t},error:function(e){var t=e.responseJSON.error;PF.fn.growl.call(PF.fn._s(t.message))}}},delete:{before:function(e){var t=$(e.target),a=t.data("ip_ban-id"),o=CHV.obj.ip_bans[a];t.attr("data-confirm",t.attr("data-confirm").replace("%s",o.ip))},submit:function(e){return PF.obj.modal.form_data={action:"delete",delete:"ip_ban",deleting:{id:e}},!0},complete:{success:function(e){PF.fn.growl.expirable(PF.fn._s("IP ban successfully deleted."));var t=e.responseJSON.request.deleting.id;$("[data-content=ip_ban][data-ip_ban-id="+t+"]").remove(),delete CHV.obj.ip_bans[t]}}}},CHV.fn.storage={formFields:["id","name","api_id","bucket","server","service","capacity","region","key","secret","url","account_id","account_name"],calling:!1,validateForm:function(){var e=PF.obj.modal.selectors.root,t=$("[name=form-storage-id]",e).val(),a=!0;if($.each($(":input",e),function(e,t){$(this).is(":hidden")?$(this).attr("required")&&$(this).removeAttr("required").attr("data-required",1):1==$(this).attr("data-required")&&$(this).attr("required","required"),$(this).is(":visible")&&""==$(this).val()&&$(this).attr("required")&&($(this).highlight(),a=!1)}),!a)return PF.fn.growl.call(PF.fn._s("Please fill all the required fields.")),!1;var o,i=$("[name=form-storage-capacity]",e),n=i.val();return""!==n&&(0==/^[\d\.]+\s*[A-Za-z]{2}$/.test(n)||void 0===n.getBytes()?o=PF.fn._s("Invalid storage capacity value. Make sure to use a valid format."):void 0!==CHV.obj.storages[t]&&n.getBytes()0&&(t=String(t).formatBytes(2)),r.attr("value",t))}),$("[data-combo-value]").addClass("soft-hidden"),$(n).removeClass("soft-hidden")},submit:function(){var e=PF.obj.modal.selectors.root;$("[name=form-storage-id]",e).val();return!!CHV.fn.storage.validateForm()&&(PF.obj.modal.form_data={action:"edit",edit:"storage",editing:{}},$.each(CHV.fn.storage.formFields,function(t,a){var o;o="[name=form-storage-"+a+"]","hidden"!==$(o,e).attr("type")&&(o+=":visible"),PF.obj.modal.form_data.editing[a]=$(o,e).val()}),!0)},complete:{success:function(e){var t=e.responseJSON.storage,a="[data-content=storage][data-storage-id="+t.id+"]",o=$("[data-action=toggle-storage-https]",a);$.each(t,function(e,t){$("[data-content=storage-"+e+"]",a).html(PF.fn.htmlEncode(t))}),CHV.obj.storages[t.id]=t,CHV.fn.storage.toggleBoolDisplay(o,1==t.is_https)},error:function(e){var t=e.responseJSON,a=t.error.message;PF.fn.growl.call(a)}}},add:{submit:function(){if(!CHV.fn.storage.validateForm())return!1;var e=PF.obj.modal.selectors.root;return PF.obj.modal.form_data={action:"add-storage",storage:{}},$.each(CHV.fn.storage.formFields,function(t,a){var o;"id"!=a&&(o="[name=form-storage-"+a+"]","hidden"!==$(o,e).attr("type")&&(o+=":visible"),PF.obj.modal.form_data.storage[a]=$(o,e).val())}),!0},complete:{success:function(e){var t=e.responseJSON.storage,a="[data-content=dashboard-storages-list]",o=$("[data-content=storage-dashboard-template]").html();$.each(t,function(e,t){var a=e.toUpperCase();if("is_https"==e||"is_active"==e)t=CHV.obj.storageTemplate.icon.replace("%TITLE%",CHV.obj.storageTemplate.messages[e]).replace("%ICON%",CHV.obj.storageTemplate.checkboxes[t]).replace("%PROP%",e.replace("is_",""));o=o.replace(new RegExp("%"+a+"%","g"),t||"")}),$(a).append(o),PF.fn.bindtipTip($("[data-storage-id="+t.id+"]")),0==CHV.obj.storages.length&&(CHV.obj.storages={}),CHV.obj.storages[t.id]=t},error:function(e){var t=e.responseJSON,a=t.error.message;PF.fn.growl.call(a)}}},toggleBoolDisplay:function(e,t){var a={0:e.data("unchecked-icon"),1:e.data("checked-icon")};e.removeClass(a[0]+" "+a[1]).addClass(a[t?1:0])}},CHV.fn.common={validateForm:function(e){if(void 0===e)e=PF.obj.modal.selectors.root;var t=!0;return $.each($(":input:visible",e),function(e,a){""==$(this).val()&&$(this).attr("required")&&($(this).highlight(),t=!1)}),!!t||(PF.fn.growl.call(PF.fn._s("Please fill all the required fields.")),!1)},updateDoctitle:function(e){void 0!==CHV.obj.page_info&&(CHV.obj.page_info.pre_doctitle=e,CHV.obj.page_info.doctitle=CHV.obj.page_info.pre_doctitle+CHV.obj.page_info.pos_doctitle,document.title=CHV.obj.page_info.doctitle)}},CHV.fn.user={add:{submit:function(){var e=$(PF.obj.modal.selectors.root),t=!0;return $.each($(":input",e),function(e,a){""==$(this).val()&&$(this).attr("required")&&($(this).highlight(),t=!1)}),t?(PF.obj.modal.form_data={action:"add-user",user:{username:$("[name=form-username]",e).val(),email:$("[name=form-email]",e).val(),password:$("[name=form-password]",e).val(),role:$("[name=form-role]",e).val()}},!0):(PF.fn.growl.call(PF.fn._s("Please fill all the required fields.")),!1)},complete:{success:function(e){e.responseJSON;PF.fn.growl.expirable(PF.fn._s("%s added successfully.",PF.fn._n("User","Users",1)))},error:function(e){var t=e.responseJSON;PF.fn.growl.call(PF.fn._s(t.error.message))}}},delete:{submit:function(){return PF.obj.modal.form_data={action:"delete",delete:"user",owner:CHV.obj.resource.user.id,deleting:CHV.obj.resource.user},!0}},ban:{submit:function(){return PF.obj.modal.form_data={action:"ban",ban:"user",banning:CHV.obj.resource.user.id},!0},success:function(){}}},CHV.fn.submit_resource_approve=function(){return PF.obj.modal.form_data={action:"approve",approve:CHV.obj.resource.type,from:"resource",owner:void 0!==CHV.obj.resource.user?CHV.obj.resource.user.id:null,approving:CHV.obj.resource},!0},CHV.fn.complete_resource_approve={success:function(e){e.responseJSON;$("body").fadeOut("normal",function(){redir=CHV.obj.resource.url,window.location=redir})}},CHV.fn.submit_resource_delete=function(){return PF.obj.modal.form_data={action:"delete",delete:CHV.obj.resource.type,from:"resource",owner:void 0!==CHV.obj.resource.user?CHV.obj.resource.user.id:null,deleting:CHV.obj.resource},!0},CHV.fn.complete_resource_delete={success:function(e){e.responseJSON;$("body").fadeOut("normal",function(){var e;e="album"==CHV.obj.resource.type||"image"==CHV.obj.resource.type?CHV.obj.resource.parent_url:CHV.obj.resource.user?CHV.obj.resource.user.url:CHV.obj.resource.url,void 0!==e&&(window.location=e.replace(/\/?$/,"/")+"?deleted")})}},CHV.fn.list_editor={blink:function(e){e.addClass("ui-selecting"),setTimeout(function(){e.removeClass("ui-selecting")},200)},selectionCount:function(){var e=$(PF.obj.listing.selectors.content_listing);e.each(function(){var t=$("[data-content=pop-selection]","[data-content=list-selection][data-tab="+$(this).attr("id")+"]"),a=$(PF.obj.listing.selectors.list_item+".selected",this).length;if(all_count=$(PF.obj.listing.selectors.list_item,this).length,t.toggleClass("disabled",0==a),$("[data-text=selection-count]",t).text(a>0?a:""),"images"==e.data("list")&&a>0){var o=$(PF.obj.listing.selectors.list_item+".selected[data-flag=safe]",this).length>0,i=$(PF.obj.listing.selectors.list_item+".selected[data-flag=unsafe]",this).length>0;$("[data-action=flag-safe]",t)[(i?"remove":"add")+"Class"]("hidden"),$("[data-action=flag-unsafe]",t)[(o?"remove":"add")+"Class"]("hidden")}$(this).is(":visible")&&($("body").toggleClass("--has-selection",a>0),CHV.fn.list_editor.listMassActionSet(all_count==a?"clear":"select"))})},removeFromList:function(e,t){if(void 0!==e){e=e instanceof jQuery==0?$(e):e;var a=$(PF.obj.listing.selectors.content_listing_visible),o=e.length;e.fadeOut("fast");var i=e.first().data("type"),n=parseInt($("[data-text="+i+"-count]").text())-o;CHV.fn.list_editor.updateUserCounters(e.first().data("type"),o,"-"),e.promise().done(function(){$(document).removeClass(CHV.fn.listingViewer.selectors.bodyShown.substr(1));var i={};if(e.each(function(){$("[data-id="+$(this).data("id")+"]").each(function(){var e=$(this).closest(PF.obj.listing.selectors.content_listing).attr("id");i[e]||(i[e]=0),i[e]+=1})}),1==o?$("[data-id="+$(this).data("id")+"]").remove():e.each(function(){$("[data-id="+$(this).data("id")+"]").remove()}),PF.fn.listing.columnizerQueue(),PF.fn.listing.refresh(),CHV.fn.list_editor.selectionCount(),void 0!==t&&"string"==typeof t&&PF.fn.growl.expirable(t),$(PF.obj.listing.selectors.content_listing_pagination,a).exists()||0!=$(PF.obj.listing.selectors.list_item,a).length||(n=0),0==n)a.html(PF.obj.listing.template.empty),$(PF.obj.listing.selectors.content_listing+":not("+PF.obj.listing.selectors.content_listing_visible+")").data({empty:null,load:"ajax"}),$("[data-content=list-selection][data-tab="+a.attr("id")+"]").addClass("disabled");else if(0==$(PF.obj.listing.selectors.list_item,a).length){if($(PF.obj.listing.selectors.pad_content).height(0),$("[data-action=load-more]",a).exists())return $(PF.obj.listing.selectors.content_listing_visible).data("page",0),$("[data-action=load-more]",a).click(),void(PF.obj.listing.recolumnize=!0);var s=$("[data-pagination=next]",a);if(s.exists()){var r=s.attr("href"),l=PF.fn.deparam(r);return"page"in l&&l.page>1&&(r=r.changeURLParameterValue("page",l.page-1)),void(window.location=r)}}})}},deleteFromList:function(e){if(void 0===t)var t=!0;e=e instanceof jQuery==0?$(e):e;this.removeFromList(e,t?PF.fn._s("The content has been deleted."):null)},moveFromList:function(e,t){if(void 0===t)t=!0;e=e instanceof jQuery==0?$(e):e;this.removeFromList(e,t?PF.fn._s("The content has been moved."):null)},toggleSelectItem:function(e,t){if("boolean"!=typeof t)t=!e.hasClass("selected");var a,o,i,n=$(".viewer").is(":visible")?$("[data-type=image][data-id="+e.attr("data-id")+"]"):e,s=$("[data-action=select] .btn-icon",n);n.hasClass("unselect")||(n.addClass("unselect"),t?(Boolean(window.navigator.vibrate)&&window.navigator.vibrate([15,125,25]),n.addClass("selected"),a=s.data("icon-selected"),o=s.data("icon-unselected"),i=PF.fn._s("Unselect")):(n.removeClass("selected ui-selected"),a=s.data("icon-unselected"),o=s.data("icon-selected"),i=PF.fn._s("Select")),s.removeClass(o).addClass(a),setTimeout(function(){n.removeClass("unselect")},350),$("[data-action=select] .label",n).text(i),CHV.fn.list_editor.selectionCount())},selectItem:function(e){this.toggleSelectItem(e,!0)},unselectItem:function(e){this.toggleSelectItem(e,!1),e.removeClass("selected")},selectAll:function(e){this.selectItem($(PF.obj.listing.selectors.list_item+":visible:not(.selected)")),this.listMassActionSet("clear"),e.stopPropagation()},clearSelection:function(e){var t=$(PF.obj.listing.selectors.list_item+".selected",PF.obj.listing.selectors[e?"content_listing":"content_listing_visible"]);this.unselectItem(t),this.listMassActionSet("select")},listMassActionSet:function(e){var t="select"==e?"clear":"select",a=$("[data-text-select-all][data-action=list-"+t+"-all]:visible"),o=a.data("text-"+e+"-all");a.text(o).attr("data-action","list-"+e+"-all"),PF.fn.close_pops()},updateItem:function(e,t,a,o){if(e instanceof jQuery==0)e=$(e);var i=e.data("type"),n="image"==i?t.album:t;if(this.addAlbumtoModals(n),$("option[value="+n.id_encoded+"]","[name=form-album-id]").html(PF.fn.htmlEncode(n.name_with_privacy_readable_html)),void 0===a)a="edit";if("edit"==a||"move"==a){if("move"==a&&"album"==CHV.obj.resource.type)return void CHV.fn.list_editor.moveFromList(e,o);e.attr("data-description",t.description),"image"==i?(void 0!==t.title&&(e.attr("data-title",t.title),e.find("[title]").attr("title",t.title),$("[data-text=image-title]",e).text(PF.fn.htmlEncode(t.title))),void 0!==t.title_truncated&&$("[data-text=image-title-truncated]",e).html(PF.fn.htmlEncode(t.title_truncated)),void 0!==t.category_id&&e.attr("data-category-id",t.category_id),e.attr({"data-album-id":n.id_encoded,"data-flag":1==t.nsfw?"unsafe":"safe"}),$("[data-content=album-link]",e).attr("href",n.url)):e.attr({"data-privacy":n.privacy,"data-password":n.password,"data-name":n.name}),e.attr("data-privacy",n.privacy),$("[data-text=album-name]",e).html(PF.fn.htmlEncode(n.name)),PF.fn.growl.expirable("edit"==a?PF.fn._s("The content has been edited."):PF.fn._s("The content has been moved."))}},addAlbumtoModals:function(e){var t=!1;$("[name=form-album-id]","[data-modal]").each(function(){e.id_encoded&&!$("option[value="+e.id_encoded+"]",this).exists()&&($(this).append('"),t=!0)}),t&&CHV.fn.list_editor.updateUserCounters("album",1,"+")},updateAlbum:function(e){$("[data-id="+e.id_encoded+"]").each(function(){""!==e.html&&($(this).after(e.html),$(this).remove())})},updateUserCounters:function(e,t,a){if(void 0===a)a="+";var o,i,n=$("[data-text="+e+"-count]"),s=$("[data-text="+e+"-label]"),r=(t=parseInt(t),parseInt(n.html()));switch(a){case"+":o=r+t;break;case"-":o=r-t;break;case"=":o=t}i=o-r;var l=$("[data-text=total-"+n.data("text")+"]"),d=$("[data-text="+l.data("text")+"-label]"),c=parseInt(l.html()),u=c+i;n.text(o),l.text(u),s.text(s.data(1==o?"label-single":"label-plural")),d.text(s.data(1==u?"label-single":"label-plural"))},updateMoveItemLists:function(e,t,a){if(CHV.fn.list_editor.clearSelection(),/image/.test(t))"image"==t?CHV.fn.list_editor.updateItem("[data-type=image][data-id="+a.data("id")+"]",e.image,"move"):(a.each(function(){CHV.fn.list_editor.updateItem("[data-type=image][data-id="+$(this).data("id")+"]",e,"move",!1)}),PF.fn.growl.expirable(PF.fn._s("The content has been moved.")));else{if(CHV.fn.list_editor.moveFromList(a,!1),PF.fn.growl.expirable(PF.fn._s("The content has been moved.")),e.album)if(void 0!==e.albums_old?"true"==e.request.album.new:"true"==e.request.editing.new_album){CHV.fn.list_editor.addAlbumtoModals(e.album);var o=parseInt($("[data-text=album-count]").text())-1;$(PF.obj.listing.selectors.pad_content).each(function(){var t=$(this).find(PF.obj.listing.selectors.list_item).length;if(0!=t){var a=PF.fn.deparam($(this).closest(PF.obj.listing.selectors.content_listing).data("params"));"date_desc"!=a.sort&&o!=t||$(this)["date_desc"==a.sort?"prepend":"append"](e.album.html)}})}else CHV.fn.list_editor.updateAlbum(e.album);PF.fn.listing.columnizerQueue(),PF.fn.listing.refresh(0)}}},CHV.fn.import={errorHandler:function(e){PF.fn.growl.call(e.error.message)},reset:function(e){e=parseInt(e);CHV.obj.import.working[e].stats=$.ajax({type:"POST",data:{action:"importReset",id:e}}),CHV.obj.import.working[e].stats.complete(function(t){var a=t.responseJSON;if(a){var o=CHV.fn.import.parseTemplate(a.import);$("[data-id="+a.import.id+"]",CHV.obj.import.sel.root).replaceWith(o),"working"!=a.import.status&&clearInterval(CHV.obj.import.working[e].interval)}})},updateStats:function(e){e=parseInt(e);"readyState"in CHV.obj.import.working[e].stats&&4!=CHV.obj.import.working[e].stats.readyState?console.log("Aborting stats timeout call (previous call is still not ready)"):(CHV.obj.import.working[e].stats=$.ajax({type:"POST",data:{action:"importStats",id:e}}),CHV.obj.import.working[e].stats.complete(function(t){var a=t.responseJSON;if(a){var o=CHV.fn.import.parseTemplate(a.import);$("[data-id="+a.import.id+"]",CHV.obj.import.sel.root).replaceWith(o),"working"!=a.import.status&&clearInterval(CHV.obj.import.working[e].interval)}}))},delete:{submit:function(e){return PF.obj.modal.form_data={action:"importDelete",id:e},!0},deferred:{success:function(e){var t=e.responseJSON;PF.fn.growl.call(PF.fn._s("Import ID %s removed",t.import.id)),$("[data-id="+t.import.id+"]",CHV.obj.import.sel.root).remove(),1==$("li",CHV.obj.import.sel.root).size()&&$(CHV.obj.import.sel.root).addClass("hidden")},error:function(e){CHV.fn.import.errorHandler(e.responseJSON)}}},parseTemplate:function(e,t){var a=CHV.obj.import.rowTpl;for(var o in CHV.obj.import.importTr)void 0!==e[o]&&(a=a.replaceAll("%"+o+"%",e[o]));a=a.replaceAll("%parse%",e.options.root),a=a.replaceAll("%shortParse%",e.options.root.charAt(0)),a=a.replaceAll("%displayStatus%",CHV.obj.import.statusesDisplay[e.status]);var i=$($.parseHTML(a)).attr("data-object",JSON.stringify(e));return i}},CHV.fn.Palettes={timeout:{},get:function(){return($("html").get(0).className.match(/(^|\s)palette-\S+/g)||[]).join(" ")},set:function(e){$("html").attr("data-palette",e).removeClass(this.get()).addClass("palette-"+e)},preview:function(e){$("html").removeClass(this.get()).addClass("palette-"+e)},save:function(){clearTimeout(this.timeout),this.timeout=setTimeout(function(){$.ajax({type:"POST",data:{action:"paletteSet",palette_id:CHV.obj.config.palettesId[$("html").attr("data-palette")]},cache:!1})},400)}},CHV.fn.license={set:{submit:function(){var e=$(PF.obj.modal.selectors.root),t=!0;return $.each($(":input",e),function(e,a){""==$(this).val()&&$(this).attr("required")&&($(this).highlight(),t=!1)}),t?(PF.obj.modal.form_data={action:"set-license-key",key:$("[name=chevereto-license-key]",e).val()},!0):(PF.fn.growl.call(PF.fn._s("Please fill all the required fields.")),!1)},complete:{success:function(e){let t=e.responseJSON,a=$("[data-action=upgrade]");if("free"===CHV.obj.system_info.edition)return a.removeClass("hidden"),void a.trigger("click");PF.fn.growl.call(PF.fn._s(t.success.message))},error:function(e){var t=e.responseJSON;PF.fn.growl.call(PF.fn._s(t.error.message))}}}}; \ No newline at end of file diff --git a/content/legacy/themes/Peafowl/lib/peafowl.js b/content/legacy/themes/Peafowl/lib/peafowl.js index 5651961..9186f7e 100644 --- a/content/legacy/themes/Peafowl/lib/peafowl.js +++ b/content/legacy/themes/Peafowl/lib/peafowl.js @@ -454,7 +454,6 @@ $(function () { deferred: window[$target.data("ajax-deferred")] }; - // Window functions failed? Maybe those are named fn... if (typeof submit_function !== "function" && $target.data("submit-fn")) { var submit_fn_split = $target.data("submit-fn").split("."); submit_function = window; diff --git a/content/legacy/themes/Peafowl/snippets/footer.js.php b/content/legacy/themes/Peafowl/snippets/footer.js.php index 564bd57..c25e63f 100644 --- a/content/legacy/themes/Peafowl/snippets/footer.js.php +++ b/content/legacy/themes/Peafowl/snippets/footer.js.php @@ -15,6 +15,7 @@ use function Chevereto\Legacy\get_captcha_invisible_html; use function Chevereto\Legacy\get_translation_table; use function Chevereto\Legacy\getSetting; use function Chevereto\Legacy\getSettings; +use function Chevereto\Vars\env; // @phpstan-ignore-next-line if (!defined('ACCESS') || !ACCESS) { @@ -116,7 +117,10 @@ if (Handler::cond('captcha_needed') && getSetting('captcha_api') == '3') { CHV.obj.logged_user = ; - CHV.obj.system_info = get_app_version()]); ?>; + CHV.obj.system_info = get_app_version(), + 'edition' => env()['CHEVERETO_EDITION'], + ]); ?>; div{margin:0;cursor:pointer;position:relative;font-size:1em;inset-inline-end:0;margin-inline-start:auto}.list-item-buttons>div,.list-item-image-tools>div,html.--idle .list-item-image-tools>div[data-action=viewer-close]{opacity:.5}.list-item .hover-display.list-item-image-tools,.list-item-image-tools>div:hover,.list-item.selected div.tool-select{opacity:1}.list-item.--over .list-item-image-tools>div{opacity:.5}.list-item-image-tools>div{float:right}[dir=rtl] .list-item-image-tools>div{float:left}.list-item-image-tools>div,.list-item-image-tools>div *{display:block;color:var(--listItemText)}.list-item-image-tools>div span{float:right}[dir=rtl] .list-item-image-tools>div span{float:left}.list-item-image-tools>div .label{font-size:.86em}.list-item-image-tools>div .btn-icon{font-size:1em}.phone .list-item:not(.selected):not(.viewer) .tool-select{display:none}.list-item-image-tools>div .label{text-transform:uppercase;padding-inline-start:1em;padding-inline-end:0;display:none;height:100%}.list-item-image-tools>div:hover .label{display:block}.small-cols .list-item-image-tools>div:hover .label{display:none}[data-flag=safe] .label-flag-safe.btn-icon,[data-flag=safe] .list-item-image-tools>div:hover .label.label-flag-safe,[data-flag=unsafe] .label-flag-unsafe.btn-icon,[data-flag=unsafe] .list-item-image-tools>div:hover .label.label-flag-unsafe{display:none}.unsafe-blur-on .list-item .list-item-thumbs div[data-flag=unsafe] a,.unsafe-blur-on [data-flag=unsafe]:not(.current) .image-container{filter:blur(8px);-webkit-filter:blur(8px)}.unsafe-blur-on .list-item .list-item-thumbs div[data-flag=unsafe]:not(.selected):not(.ui-selecting) a,.unsafe-blur-on [data-flag=unsafe]:not(.selected):not(.ui-selecting):not(.current) .image-container{transform:scale(1.2)}.unsafe-blur-on .list-item:hover .list-item-thumbs div[data-flag=unsafe] a,.unsafe-blur-on [data-flag=unsafe]:hover:not(.selected):not(.ui-selecting):not(.current) .image-container{filter:none;-webkit-filter:none;transform:scale(1)}.list-item-buttons>div,.list-item-image-tools>div,.list-item-image-tools>div .btn-icon{width:2.2em;height:2.2em;line-height:2.2em}.list-item-image-tools>div .btn-icon{color:inherit;text-align:center}.list-item-album .tool-flag{display:none}.list-item .list-item-avatar-cover,.list-item .list-item-avatar-cover>*{border-radius:100%}.list-item .image-container.--bodyEmpty .empty,.list-item .list-item-avatar-cover{position:absolute;border:0;left:50%;top:50%;transform:translate(-50%,-50%)}.list-item .list-item-avatar-cover{height:60%;width:60%;max-height:160px;max-width:160px;background:var(--backgroundLightAlpha);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.list-item .list-item-avatar-cover>*{width:100px;height:100px}.list-item .list-item-avatar-cover img{height:auto;box-shadow:2px 2px 2px rgba(0,0,0,.3)}.selected .list-item-image,.ui-selecting .list-item-image,.unselect .list-item-image{background:var(--viewerBackground)}body#moderate .list-item-like,body#moderate .viewer-kb-key[data-key="L"]{display:none}.list-item-buttons{color:#fff;position:absolute;inset-inline-end:0;bottom:0}.list-item-buttons>div{padding:10px;cursor:pointer;float:left;font-size:1em;margin-inline-start:-5px}[dir=rtl] .list-item-buttons>div{float:right}.list-item .list-item-buttons>div:hover{opacity:1}.list-item-like .btn-like{display:none}.list-item-like .btn-like.btn-liked,.list-item-like .btn-like:hover{opacity:1}[data-liked="0"] .list-item-like .btn-like.btn-unliked{display:block}[data-liked="1"] .list-item-like .btn-like.btn-liked{display:block}.list-item-play-gif,.list-item-play-gif *{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAACdCAMAAAAgwM7pAAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAcVQTFRFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///9///+///+///+///+///+///9///8///1///5///9///9///u///f///+///+///+///9///q///z///9///+///9///8///9///+///+///+///+///8///w///9///+///3///8///9///2///9///7///t///+///8///b///9///9///M///+///y//+A///9///r///7///+///7///3///+///8//+////8//+q///8///+///z///+///+///9///6///m///7///j///7///9///+///+///9///9///6///+///+///+///7///V///+///9///5///9///+///+///8///9///6///8///+///9///4///+///+///+///+///4///9///5///+///v///7///9///8///o///9///9///8///6///y///9///0///+///x///+///6////////////vBUIqgAAAJd0Uk5TABQmNkZSWF5iCipmAiRKZAQuXCwYVDoMUBpgIiil+enVw7GJUBoujZkOCPf/45sMFnDPbEqhtcfZ714Qi9EgWI8adDgO21oGbmoEyxICcgw87Toe+1QEVgJg/RTru344CkIIRnrx55VmMNf1wT4GyaMoh+HlTJcyYt+pJrfTzd0ipyqtEECTXAp8aGQ2FIMWxRKzLrhG/4D2XIEAAAQlSURBVHiczZjnWxNBEMYPCCThgNC7IIKCyaCIdJCmgIooYkFCEwsqTRRQQREb9l7u7/UuuZhccm1vX5+H99Ne2d/d7uzOzowgmCgpOcWVmub2eNxpqa6U5CSzdw3lTXe5xTi5XeleNkpGZpYvnhKWLyszwzYmOydXnxJWbk62PU5ewpAShphnA5NfYIVRVJBvgckoNJibhLkqNJ2qomJ7GEXFRcacklL7HFEsLTHilHlYOKLoKdPnlNucnqh85br/w8yRSTr/VMI4rrA8CfNUxDTPUZXG2S6Dwe5aFWvXU6FTjigWxnLyHUx0RL7Y3WJrfxmpIMrJ4+GI4j9fkG3pN8zljvinHD6OKOaopjf1h3aUG14CmbwcUcwMgbL4QVkKx8uxhiLyefltH5ayAlwIkEsGcS6isNzy+Y7giGKSkIwBJQspGFAKZq6V2U7FgFKFNAwoDWN9xf6OTqFEeXAg2NBgkw0zP2xBwrYIbNPC3AjMseFcLcT5pyOPI9gBiTuyYUEELKzBBVqw0A8XjOLCY1jAjkshYEkNLs3CJX64VBSXHOPSdVwBAVfSEGBFFkWgso+AK0QJsNJYSN48RLFOFaR8CNe+isr9VQeqaw46636otu5wqOEPkKr6I0dZKQ3HGuWOx8MXTc0trW3tIVQHG6azK/QTJ7pjb3b39La29rFg/P3K19vrTrJ9PUGnBmTMwOCQySunB/ptgE4SVZ45a/rKMFHLOUvQSP/5CxavjF6ULThm46csdamV6PIVBOlql0waN3x8jQE1ETQkTZ6Y6tZ/YkQK6q6QkWmiJgaQ0BGMLH2tZoiqWMYmCLPnr+vcnQvSFNMGMNCNegreBHCEW0TVCM7kbZpn9jV6ukN011nPe1pLX6YFNotFdHSRJmKvlwLLzn5oZZHua26YuR9TrRI9cNpXozmihxCQsEbrGFA1amwbzIeUgSaJHqnNx0tPeEib1Ki2tmiNB7RKU2priTZ5QE+fRQa0Tc95QFGt0zQGFKCtPQaCDW2bhjGgJdrh6f5ia1BtvaQ2HlAzVaqtV683eEDRLcKnmE3LJ5gbkR3bUwgI5WrntGe9/41TkPY4WlkI7DrjDGkPSL/jI/twgDR++q3jIGLsneZSCWveOyPFCRVoCdfriSChn7ArB6MOc804fZDD4xGmHrMf/Xq3lYB9lIUjB+yfdB80VC10MnCUFOIzy4eNOSbpkW1ZpFm2ZSvx889YpqLLchpeb2mYGqIpi+R421Zy/GUnlK7rLhFVX+ftpOvCkFpAmLXzsrk6ayuUksbwt9ib3eO935/9YEVNhoosql16mn9GiixOLP6r9m14nvroX9mnjstnjUxXzPMUovaIfv8BgSQJhJIkEEqSQChJAqEkCYSSJBBKkkCo/wICDQ002SDzgxYkaIuANi0X5i8hpIpr8W0lCwAAAABJRU5ErkJggg==);position:absolute;top:50%;inset-inline-start:50%}.list-item-play-gif{scale:.6;width:72px;height:72px;margin-inline-start:-36px;margin-top:-36px;background-position:0 0;cursor:pointer;transition:all 350ms}@media (min-width:320px){.list-item-play-gif{scale:.8}}@media (min-width:480px){.list-item-play-gif{scale:1}}.list-item-play-gif>span{width:66px;height:66px;margin-inline-start:-33px;margin-top:-33px;background-position:0 -73px}.list-item-play-gif--loading>span,.list-item-play-gif:hover>span{-webkit-animation:spin 2s linear infinite;animation:spin 2s linear infinite}.list-item-play-gif>i{width:32px;height:17px;margin-inline-start:-16px;margin-top:-9px;background-position:0 -140px}@-webkit-keyframes spin{from{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(360deg)}}@keyframes spin{from{transform:rotate(0)}to{transform:rotate(360deg)}}.settings-group{display:none}.settings-group-isolated{display:block}.stats-block,a.stats-block{text-decoration:none;color:inherit;padding:10px;border-radius:4px}a.stats-block:hover{color:var(--linkText);background:var(--bodyEmpty)}.tone-dark a.stats-block:hover{background:#222}.text-align-center .stats-big-number{text-align:center}.stats-big-number .number{font-size:44px;font-weight:400}.stats-big-number .number span{font-size:24px}.stats-big-number .label{display:block}.tone-dark .text-content code{border-color:#222;background:#111}#home-top-bar-placeholder{margin-top:-65px}#home-cover{width:100%;background-position:center center;background-color:#333;background-size:cover;color:#fff;position:relative}body.landing #home-cover,body.split #home-cover{margin:0;padding:0;height:100vh;height:100dvh}body.split #home-cover{margin:0;height:500px}#home-cover-content{position:relative;text-align:center;height:100%;top:50px}body.landing #home-cover-content,body.split #home-cover-content{height:calc(100% - 50px);position:relative;display:flex;align-items:center;justify-content:center;flex-direction:column}#home-cover-content>*{margin:10px 0}#home-cover-content h1,#home-cover-content p{text-shadow:2px 2px 8px rgba(0,0,0,.25)}#home-cover-content h1{font-size:2.4em;line-height:120%;font-weight:600}@media (min-width:768px){#home-cover-content h1{font-size:2.7em}}@media (min-width:992px){#home-cover-content h1{font-size:3em}}#home-cover-content p{font-size:22px}.home-buttons{text-align:center}.home-buttons a{font-size:16px;text-transform:uppercase;min-height:50px;line-height:1.5;height:auto;text-align:center;letter-spacing:2px;padding:12px 30px}#home-pics-feature{height:700px;overflow:hidden;position:relative;margin:10px 0}#home-pics-feature.empty{height:auto}#home-pics-feature-overlay{background:linear-gradient(to bottom,rgba(255,255,255,0) 0,rgba(255,255,255,1) 100%);width:100%;height:200px;position:absolute;bottom:0;z-index:1}.tone-dark #home-pics-feature-overlay{background:linear-gradient(to bottom,rgba(0,0,0,0) 0,#000 100%)}#home-pics-feature.empty #home-pics-overlay{display:none}#home-join{margin:40px 0;padding-bottom:40px}#home-join h2{font-size:38px}#home-join p{margin:20px 0;font-size:18px}.ad-banner{margin:10px;text-align:center}.ad-banner:empty{margin:0;height:0}.ad-banner img{display:block;margin:0 auto}.ad-banner-size-300x250{width:300px;height:250px}.ad-banner-size-336x280{width:336px;height:280px}.ad-banner-size-728x90{width:728px;height:90px}.ad-banner-size-300x600{width:300px;height:600px}.ad-banner-size-320x100{width:320px;height:100px}.ad-banner-size-320x50{width:320px;height:50px}.ad-banner-size-468x60{width:468px;height:60px}.ad-banner-size-234x60{width:234px;height:60px}.ad-banner-size-120x600{width:120px;height:600px}.ad-banner-size-120x240{width:120px;height:240px}.ad-banner-size-160x600{width:160px;height:600px}.ad-banner-size-300x1050{width:300px;height:1050px}.ad-banner-size-970x90{width:970px;height:90px}.ad-banner-size-970x250{width:970px;height:250px}.ad-banner-size-250x250{width:250px;height:250px}.ad-banner-size-200x200{width:200px;height:200px}.ad-banner-size-180x150{width:180px;height:150px}.ad-banner-size-125x125{width:125px;height:125px}#banner_before_home_cover{margin:0;padding:10px;background:#000}#banner_image_image-viewer_foot,#banner_image_image-viewer_top{height:90px;margin-inline-start:auto;margin-inline-end:auto}body#consent-screen,body#maintenance{padding:0;margin:0;width:100%;height:100%}#consent-screen-cover,#maintenance-cover{height:100%;background-position:center center;background-color:#333;background-size:cover}#consent-screen-cover-inner,#maintenance-cover-inner{background:rgba(0,0,0,.25);width:100%;height:100vh;height:100dvh}#consent-screen-cover-content,#maintenance-cover-content{color:#fff;padding:40px;text-align:center;position:relative;top:50%;transform:translateY(-50%)}#maintenance-cover-content .logo{display:inline-block;margin-bottom:20px;color:#fff;text-decoration:none;font-size:2.5em}#maintenance-cover-content .logo img{height:30px}#maintenance-cover-content h1{font-size:2.5em;margin-bottom:20px}#maintenance-cover-content p{font-size:1.2em}#consent-screen-cover-inner{background:0 0}#consent-screen-cover-src{width:100%;height:100%;position:absolute;top:0;inset-inline-start:0;background-position:center;background-size:cover}#consent-screen-content{background:var(--menuBackground);color:var(--menuItemText);margin:0 auto;padding:30px;box-shadow:0 0 50px 6px rgba(0,0,0,.25);top:50%;position:relative;transform:translateY(-50%);border-radius:10px;-webkit-backdrop-filter:blur(15px);backdrop-filter:blur(15px)}#consent-screen-content h1{line-height:2em}#consent-screen-content .logo-consent{width:2em;height:auto;display:inline-block;margin-inline-end:10px;vertical-align:top}#fullscreen-modal-box .image-preview{margin-bottom:20px;overflow:auto;text-align:center}.image-preview-container{position:relative;display:block;float:left;width:20%}[dir=rtl] .image-preview-container{float:right}.image-preview-container .empty{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:3em}#fullscreen-modal-box .image-preview:empty{display:none}#fullscreen-modal-box .image-preview .canvas{border:0;display:inline-block;margin:0 auto;max-width:100%;max-height:500px}#fullscreen-modal-box .image-preview .thumb{font-size:0;border:0;display:block;background-size:cover;background-position:center;width:100%}.content-password-gate{background:#f9f9f9;border-radius:10px;padding:30px;font-size:16px;text-align:center}.tone-dark .content-password-gate{background:0 0}.content-password-gate h1{font-size:30px;margin-bottom:10px}.content-password-gate h1 .icon{display:block;font-size:60px;margin-bottom:10px}.content-password-gate .g-captcha>div{margin-inline-end:auto;margin-inline-start:auto}#home-cover-slideshow{position:absolute;top:0;inset-inline-end:0;bottom:0;inset-inline-start:0;overflow:hidden}.home-cover-img{position:absolute;inset-inline-start:0;top:0;width:100%;height:100%;background-size:cover;background-repeat:no-repeat;background-position:center center;display:block;opacity:0;transform:translateZ(0);-webkit-transform:translateZ(0);-webkit-backface-visibility:hidden;backface-visibility:hidden}.home-cover-img.animate-in,.home-cover-img.animate-in--alt{-webkit-animation-name:slideshow;animation-name:slideshow;-webkit-animation-duration:10s;animation-duration:10s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.home-cover-img.animate-in--alt{opacity:1;-webkit-animation-name:slideshow--alt;animation-name:slideshow--alt}.home-cover-img.animate-end{opacity:1;transform:scale(1.1);-webkit-animation:none;animation:none}@-webkit-keyframes slideshow{0%{opacity:0}20%{opacity:1}100%{opacity:1;transform:scale(1.1)}}@keyframes slideshow{0%{opacity:0}20%{opacity:1}100%{opacity:1;transform:scale(1.1)}}@-webkit-keyframes slideshow--alt{100%{transform:scale(1.1)}}@keyframes slideshow--alt{100%{transform:scale(1.1)}}@supports (-ms-accelerator:true){.home-cover-img.animate-end{transform:scale(1)}@-webkit-keyframes slideshow{0%{opacity:0}20%{opacity:1}}@keyframes slideshow{0%{opacity:0}20%{opacity:1}}@-webkit-keyframes slideshow--alt{100%{transform:scale(1)}}@keyframes slideshow--alt{100%{transform:scale(1)}}}#home-cover-slideshow::after{content:"";z-index:1;height:50px;position:absolute;top:0;left:0;right:0;background:linear-gradient(to bottom,rgba(0,0,0,.1) 0,rgba(0,0,0,0) 100%)}#dashboard-settings{min-height:400px}#dashboard .form-content,#settings .form-content{padding-bottom:60px}.footer{color:var(--bodyTextDisabled);font-size:10px;line-height:20px;text-align:center;width:100%;position:absolute;bottom:0;z-index:900;padding:5px;line-height:1}body#upload .footer{background:var(--bodyBackground)}.footer a{color:inherit}body.--viewer-shown{overflow:hidden}.viewer{background:#000;position:fixed;top:0;right:0;bottom:0;left:0;z-index:999}.viewer .list-tool{display:initial!important}.js .viewer{display:block;touch-action:pinch-zoom!important}.viewer--hide{opacity:0}.viewer--show{opacity:1}.viewer.viewer--no-cursor,.viewer.viewer--no-cursor *{cursor:none}.viewer-content{position:relative;top:0;inset-inline-start:0;width:100%;height:100%}.viewer-content img{position:absolute;max-height:100vh;max-height:100dvh;max-width:100vw;max-width:100dvw;transform:translate(-50%,-50%);top:50%;left:50%}.viewer[data-cover="1"] .viewer-content img{width:100vw;width:100dvw;height:100vh;height:100dvh;-o-object-fit:cover;object-fit:contain}.viewer-close,.viewer-wheel>div{color:#fff;top:0;font-size:1em;text-shadow:1px 1px 0 rgba(0,0,0,.5);text-align:center}.viewer-close{position:absolute;width:2.4em;height:2.4em;line-height:2.4em;cursor:pointer;inset-inline-end:-2.4em;z-index:500}.viewer:hover .hover-display.viewer-close{inset-inline-end:2px}.viewer-wheel>div{position:fixed;bottom:0;width:calc(1em + 20px);cursor:pointer;padding:10px;opacity:.7;display:none}.viewer-wheel>div:hover{opacity:1}.viewer--nav-prev .viewer-wheel-prev{inset-inline-start:0;display:block}.viewer--nav-next .viewer-wheel-next{inset-inline-end:0;display:block}.viewer-wheel>div>.icon{position:absolute;top:50%;transform:translateY(-50%);display:block;font-size:1.5em}.viewer-foot{padding:10px;position:absolute;left:0;right:0;bottom:0;height:60px;background:linear-gradient(to bottom,transparent 0,rgba(0,0,0,.6) 100%);display:flex;flex-wrap:wrap;flex-flow:row}.viewer-owner{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#fff;float:left}.viewer-owner .btn{background:rgba(0,0,0,.3);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);color:inherit;border-color:#fff;opacity:.8}.viewer-owner .btn.btn-cta:hover{background:#fff;color:#000;border-color:transparent;opacity:1}.viewer-owner .user-image{font-size:40px;width:1em;height:1em;vertical-align:bottom;color:#fff}.viewer-owner .user-name{font-size:initial;text-decoration:none;vertical-align:middle;line-height:40px;color:inherit}.viewer-owner a.user-name:hover{color:var(--backgroundLightAlpha)}.viewer-owner{order:1}.viewer-kb{font-size:.86em;flex-grow:1;order:2;text-align:center}.viewer .viewer-kb{padding-inline-end:190px}.device-mobile .viewer-kb{display:none}.viewer-kb-input{display:inline-block}.viewer .viewer-kb-input{color:#fff}.viewer-kb-key{display:inline-block;margin:10px;margin-inline-start:0}.viewer-kb-key:first-child{margin-inline-start:10px}.viewer-kb-key kbd{border:1px solid rgba(0,0,0,.5);background:rgba(120,120,120,.5);-webkit-backdrop-filter:blur(15px);backdrop-filter:blur(15px);padding:4px 6px;border-radius:2px;display:inline-block;margin-inline-end:5px;line-height:1}.viewer-like{transform:none;top:auto;bottom:20px;inset-inline-end:20px;position:absolute}.viewer:hover .hover-display--flex{display:flex}.--width-auto{width:auto}.--height-auto{height:auto}html.--idle .viewer,html.--idle .viewer *{cursor:none!important}html .fullscreen-show{display:none}:-webkit-full-screen .fullscreen-hide{display:none}:-ms-fullscreen .fullscreen-hide{display:none}:fullscreen .fullscreen-hide{display:none}:-webkit-full-screen .fullscreen-show{display:block}:-ms-fullscreen .fullscreen-show{display:block}:fullscreen .fullscreen-show{display:block}a.image-container{-webkit-tap-highlight-color:transparent}a{color:var(--linkText);outline:0;text-decoration:none}.content-section,.input-label{margin-top:20px;margin-bottom:20px;position:relative}.content-section:first-child,.input-label:first-child{margin-top:0}.input-label .input{width:100%;margin-bottom:0}.input-label .input+.input{margin-top:5px}.input-label .input-label{margin-bottom:10px}.input-label .input-label .label{font-weight:400}.input-label label .caption,.input-label label .optional{font-weight:400;font-size:.92em}.input-label label .caption:before,.input-label label .optional:before{content:"("}.input-label label .caption:after,.input-label label .optional:after{content:")"}.input-label-below{margin-top:5px;clear:both}.background-cover{position:fixed;top:0;right:0;bottom:0;left:0;background-position:center center;background-size:cover}.input-with-button{position:relative}.input-with-button input::-webkit-inner-spin-button,.input-with-button input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.input-with-button input[type=number]{-moz-appearance:textfield}.input-with-button button{background:0 0;position:absolute;inset-inline-end:0;top:50%;transform:translateY(-50%);border:none;font-size:22px;width:1em;height:1em;outline:0;color:var(--colorAccent)}.input-with-button button:focus,.input-with-button button:hover{color:var(--colorAccentStrong)}#top-left{position:fixed;padding:5px;inset-inline-start:0;top:0}.top-button{padding:5px}.top-button .menu-box{margin-top:5px}.top-button-icon{font-size:16px;color:#fff;cursor:pointer;text-shadow:1px 1px 0 rgba(0,0,0,.15)}.background-default{background:#2ecc71;background:linear-gradient(to bottom,#2ecc71 0,#3498db 100%)}.content-box{position:relative;margin:20px}.content-box-text :first-child{margin-top:0}.content-box-text :last-child{margin-bottom:0}.logo{max-height:50px;max-width:220px;margin-bottom:20px}.card-box{min-width:270px;width:calc(100vw - 40px)}.access-box-content{background:var(--bodyBackground)}.fancy-box-heading{font-size:22px;margin:20px 0 30px 0}.fancy-fieldset{border:0;padding:0;margin:0}.fancy-fieldset input:not([type=checkbox]),.fancy-fieldset input[type=text],.fancy-fieldset select,.fancy-fieldset textarea{outline:0;padding:10px 0;width:100%;border-radius:0;border-color:transparent;background:0 0;box-shadow:none}.fancy-fieldset .checkbox-label input[type=checkbox]{width:auto;vertical-align:middle;margin:0 0 0 -20px}.fancy-fieldset select{-webkit-appearance:none;-moz-appearance:none;appearance:none}.fancy-fieldset input,.fancy-fieldset select{padding:10px 0;border-top:transparent;border-inline-start:transparent;border-inline-end:transparent}.fancy-fieldset input:focus,.fancy-fieldset input:focus[type=text],.fancy-fieldset select:focus,.fancy-fieldset textarea:focus{border-color:var(--colorAccent)}.fancy-fieldset .input-with-button input[type=password]{padding-inline-end:30px}.fancy-fieldset>div:last-child{margin-bottom:inherit}.fancy-fieldset .label{line-height:1.5}.fancy-fieldset .input-label:last-child{margin-bottom:0}.fancy-fieldset .checkbox-label{margin:0}a.login-provider-button{position:relative;text-decoration:none;display:inline-block;font-size:1em;margin:10px 0;background:#d9d9d9;padding:8px;text-decoration:none;display:block;color:#fff;border-radius:3px;text-align:center}a.login-provider-button .text{margin-inline-start:5px}a.login-provider-button--facebook{background-color:#4267b2}a.login-provider-button--twitter{background-color:#1da1f2}a.login-provider-button--google{background-color:#ea4335}a.login-provider-button--vkontakte{background-color:#45668e}a.login-provider-button--apple{background-color:#000}a.login-provider-button--amazon{background-color:#f90}a.login-provider-button--bitbucket{background-color:#2684ff}a.login-provider-button--discord{background-color:#738adb}a.login-provider-button--dribbble{background-color:#e94c88}a.login-provider-button--dropbox{background-color:#007ee5}a.login-provider-button--github{background-color:#333}a.login-provider-button--gitlab{background-color:#fc6d26}a.login-provider-button--instagram{background-color:#e1306c}a.login-provider-button--linkedin{background-color:#006192}a.login-provider-button--mailru{background-color:#168de2}a.login-provider-button--medium{background-color:#00ab6c}a.login-provider-button--odnoklassniki{background-color:#ed812b}a.login-provider-button--orcid{background-color:#a5ce37}a.login-provider-button--reddit{background-color:#ff4500}a.login-provider-button--spotify{background-color:#1db954}a.login-provider-button--stackexchange{background-color:#1e5397}a.login-provider-button--steam{background-color:#00adee}a.login-provider-button--strava{background-color:#fc4c02}a.login-provider-button--telegram{background-color:#08c}a.login-provider-button--tumblr{background-color:#35465c}a.login-provider-button--twitchtv{background-color:#9146ff}a.login-provider-button--wechat{background-color:#7bb32e}a.login-provider-button--windowslive{background-color:#107c10}a.login-provider-button--wordpress{background-color:#21759b}a.login-provider-button--yandex{background-color:#fc0}a.login-provider-button--yahoo{background-color:#410093}a.login-provider-button--qq{background-color:#121214}.login-provider-button-outline{position:relative;text-decoration:none;width:32px;height:32px;display:inline-block;border-radius:50%;border-width:1px;border-style:solid;font-size:16px;margin:5px}.login-provider-button-outline .icon{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.login-provider-button-outline.border-color-facebook:focus,.login-provider-button-outline.border-color-facebook:hover{background-color:#3b5998}.login-provider-button-outline.border-color-twitter:focus,.login-provider-button-outline.border-color-twitter:hover{background-color:#1da1f2}.login-provider-button-outline.border-color-google:focus,.login-provider-button-outline.border-color-google:hover{background-color:#ea4335}.login-provider-button-outline.border-color-vk:focus,.login-provider-button-outline.border-color-vk:hover{background-color:#45668e}.login-provider-button-outline:focus .icon,.login-provider-button-outline:hover .icon{color:#fff}#login{padding:0;margin:0}.content-section--captcha-fix #g-recaptcha,.content-section--captcha-fix .h-captcha{min-height:78px;transform:scale(.89);transform-origin:left}#login .input{margin:0}.btn-container--fixed{position:fixed;left:0;right:0;bottom:0;background:rgba(0,0,0,.05);padding:10px 0;margin:0;border:0;-webkit-backdrop-filter:blur(15px);backdrop-filter:blur(15px);text-align:start}.phablet .btn-container--fixed,.phone .btn-container--fixed{text-align:center}body.full--wh{height:100vh;height:100dvh;width:100vw;width:100dvw}.display-flex #home-cover-slideshow{position:fixed}[data-content=dashboard-imports] [data-action=resume],[data-content=dashboard-imports] [data-errors="0"] [data-content=log-errors],[data-content=dashboard-imports] [data-result],[data-content=dashboard-imports] [data-started="0"] [data-content^=log]{display:none}[data-content=dashboard-imports] [data-errors="1"] [data-content=log-process],[data-content=dashboard-imports] [data-status=completed] [data-action=pause],[data-content=dashboard-imports] [data-status=completed][data-errors="0"] [data-result=success],[data-content=dashboard-imports] [data-status=paused] [data-action=resume],[data-content=dashboard-imports] [data-status][data-errors="1"] [data-result=error]{display:initial}[data-content=dashboard-imports] [data-status=canceled] [data-action=cancel],[data-content=dashboard-imports] [data-status=canceled] [data-action=pause],[data-content=dashboard-imports] [data-status=canceled] [data-target=modal-process-import],[data-content=dashboard-imports] [data-status=completed] [data-action=cancel],[data-content=dashboard-imports] [data-status=completed] [data-action=pause],[data-content=dashboard-imports] [data-status=completed] [data-target=modal-process-import],[data-content=dashboard-imports] [data-status=paused] [data-action=pause],[data-content=dashboard-imports] [data-status=queued] [data-action=pause],[data-content=dashboard-imports] [data-status=working] [data-target=modal-process-import]{display:none!important}.connecting-ip{font-family:monospace;font-size:27px}.code{padding:.05em}.code--command{border-radius:.2em;padding:.5em;padding-inline-end:.7em;border-inline-start:.2em solid var(--colorAccent);background-color:var(--bodyEmpty)}.code--command::before{content:"$ ";color:var(--colorAccent)}.importing{background:var(--bodyEmpty);padding:10px;position:relative}.importing:nth-child(even){margin:0 10px}.phablet .importing:nth-child(even),.phone .importing:nth-child(even){margin:10px 0}.importing-stats{margin:10px 0}.importing-stats .figure{display:inline-block;padding:5px;background:var(--buttonAccentBackground);color:var(--buttonAccentText)}.apexcharts-menu-icon,.apexcharts-pan-icon,.apexcharts-reset-icon,.apexcharts-selection-icon,.apexcharts-theme-light .apexcharts-legend-text,.apexcharts-toolbar-custom-icon,.apexcharts-zoom-icon,.apexcharts-zoomin-icon,.apexcharts-zoomout-icon{color:var(--bodyText)!important}.apexcharts-menu-icon svg,.apexcharts-reset-icon svg,.apexcharts-zoom-icon svg,.apexcharts-zoomin-icon svg,.apexcharts-zoomout-icon svg{fill:var(--bodyText)!important}.apexcharts-theme-dark .apexcharts-legend-text{color:var(--bodyTextSubtle)!important}.apexcharts-theme-light svg text{fill:var(--bodyText)}.apexcharts-theme-dark svg text{fill:var(--bodyTextSubtle)}.apexcharts-toolbar{z-index:0!important}.apexcharts-canvas>svg{background:0 0!important}#dashboard-chart{margin:35px auto;overflow:hidden}#dashboard-chart .toolbar{margin-inline-start:45px}#dashboard-chart button{background:var(--bodyBackground);color:var(--bodyText);border:1px solid var(--bodySeparator);border-bottom:2px solid var(--bodySeparator);border-radius:2px;padding:4px 17px}#dashboard-chart button.active{color:var(--buttonAccentText);background:var(--buttonAccentBackground);border:1px solid var(--buttonAccentBackground);border-bottom:2px solid var(--buttonAccentBackground)}#dashboard-chart button:focus{outline:0}.corazoncito{width:1em;height:1em;font-size:290px;color:rgb(255,0,0,.6);z-index:1;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%) scale(.4);transition:all .5s ease}.corazoncito.--show{opacity:1;transform:translate(-50%,-50%) scale(1)}.corazoncito span{font-size:.25em;top:50%;left:50%;display:block;position:absolute;color:#fff;transform:translate(-50%,-50%);line-height:1;font-family:sans-serif;margin-top:-.1em;font-weight:400}.card-wrapper{height:175px;overflow-y:hidden;overflow-x:auto;-ms-scroll-snap-type:x mandatory;scroll-snap-type:x mandatory}.card-wrapper::-webkit-scrollbar{width:10px;height:3px}.card-wrapper::-webkit-scrollbar-track{background:var(--bodyEmpty)}.card-wrapper::-webkit-scrollbar-thumb{background:var(--colorAccent)}.card-wrapper::-webkit-scrollbar-thumb:hover{background:var(--colorAccentStrong)}.card-slider{width:calc(310px * 8 - 10px)}.card-container{width:300px;height:200px;display:block;float:left;margin-inline-end:10px;scroll-snap-align:start}[dir=rtl] .card-container{float:right}.card-container:first-child{margin-inline-start:0}.card-container:last-child{margin-inline-end:0}.card{width:100%;position:relative}.card a{text-decoration:none}.card-header-image{width:100%;height:150px;overflow:hidden;border-radius:1em;display:block;background-size:cover;background-position:center}.card-header-image-mask{width:100%;height:100%;display:block;background-color:rgba(0,0,0,0)}.card-header-image:hover .card-header-image-mask{background-color:var(--buttonAccentBackground)}.card-text{color:#fff;text-align:center;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:80%;text-shadow:2px 2px 8px rgba(0,0,0,.35)}.card-header-image:hover .card-text{color:var(--buttonAccentText)}.card-text h3{font-weight:700;font-size:1.6em;margin-bottom:5px}.powered-by--provider a.logo{font-size:5em;text-decoration:none}[data-banned="0"] [data-action=user_unban],[data-banned="1"] [data-action=user_ban]{display:none}.captcha.captcha--3 [data-content=captcha]{display:none}.cta-row{border:1px solid var(--bodySeparator);border-right:0;border-left:0;padding-top:20px;padding-bottom:20px;margin:0;cursor:grab;margin-bottom:-1px}.cta-row.ui-sortable-helper{background:var(--modalBackground)}.phablet .btn-cta .btn-text,.phone .btn-cta .btn-text{display:none}.btn-cta{background-color:var(--bodyBackground);color:var(--bodyText);border-color:var(--bodyText)}.btn-cta:hover{background-color:var(--colorAccent);color:var(--buttonAccentText);border-color:transparent}.btn-cta:hover .btn-icon{color:inherit} \ No newline at end of file +body{min-height:100%;background:var(--bodyBackground);position:relative;font-family:Helvetica,Arial,sans-serif;font-size:14px}html.powered-by-footer body{padding-bottom:22px}html.powered-by-footer .upload-box-inner{padding-bottom:35px}body.landing{min-height:500px;height:100%;height:100vh;height:100dvh;padding:0;margin:0}.phone body.landing{min-height:auto}.js body.landing{overflow:hidden;opacity:0}.js body.landing.load{transition:transform .6s ease,opacity 350ms linear;opacity:1}#home-cover-content,#index .flex-center{opacity:0}.js body#index.load .flex-center,.js body.load #home-cover-content{transition:all .6s ease;transition-delay:150ms;opacity:1}.js body.loaded{overflow:auto}body.split{margin-top:0;padding-top:0}.content-width.fluid,.fluid .content-width{width:100%}@media (min-width:992px){.content-width.wide{max-width:none}}html.device-mobile .device-mobile--hide{display:none!important}html.device-nonmobile .device-nonmobile--hide{display:none!important}body#upload{background-color:transparent}.software-version-name{font-family:'Brush Script MT',cursive,serif;font-size:1.1em;text-transform:capitalize}.image-viewer{text-align:center;position:relative;min-height:72px;overflow:hidden;background:var(--viewerBackground)}.image-viewer-main{display:inline-block;vertical-align:middle}.image-viewer-container{display:grid;margin:0 auto;position:relative;min-height:calc(100% - 50px)}.image-viewer-container.--thumbs{min-height:calc(100% - 100px)}.image-viewer-container img{display:block;margin:auto;max-width:100vw!important;width:auto}#image-viewer-360{width:100vw;height:calc(100vh - 50px);background:0 0!important}.image-viewer-container img[data-is360="1"]{max-height:calc(100vh - 50px)}.image-viewer .btn-download{position:absolute;top:20px;inset-inline-end:20px}#image-viewer-loading,.viewer-loader{width:30px;height:30px;position:absolute;inset-inline-start:50%;top:50%;margin-inline-start:-15px;margin-top:-15px;border-radius:100%;background:rgba(17,17,17,.9)}#image-viewer-loader{line-height:1;position:absolute;background:rgba(0,0,0,.6);-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);color:#fff;font-size:1em;left:50%;top:50%;padding:8px 14px;border-radius:100px;transform:translate(-50%,-50%);cursor:pointer;display:none}#image-viewer-loader:hover{background:rgba(0,0,0,.6);color:#fff}#image-viewer-loader .btn-icon{position:relative;top:0;font-size:12px}.btn-like .btn.btn-liked,.btn-like .btn.btn-unliked{display:none}.btn-like[data-liked="0"] .btn-unliked{display:inline-block}.btn-like[data-liked="1"] .btn-liked{display:inline-block}.btn-album-cover .btn.btn-album-is-cover,.btn-album-cover .btn.btn-album-not-cover{display:none}.btn-album-cover[data-cover="0"] .btn-album-not-cover{display:inline-block}.btn-album-cover[data-cover="1"] .btn-album-is-cover{display:inline-block}.btn-follow .btn.btn-followed,.btn-follow .btn.btn-unfollowed{display:none}.btn-follow[data-followed="0"] .btn-unfollowed{display:inline-block}.btn-follow[data-followed="1"] .btn-followed{display:inline-block}#fullscreen-uploader-mask{z-index:99}.phone #fullscreen-uploader-mask{z-index:400}#anywhere-upload{z-index:900;scroll:auto;-webkit-overflow-scrolling:touch;transition:transform .3s ease}#anywhere-upload.hidden-visibility iframe{visibility:hidden}.phone #anywhere-upload{z-index:500;height:100vh!important}#upload #anywhere-upload{display:grid;align-items:center;position:fixed;padding-top:50px;bottom:0;overflow:auto}#upload .upload-box .upload-box-allowed-files,.phone .upload-box .upload-box-allowed-files{display:none}#upload .upload-box[data-queue-size="0"] .upload-box-allowed-files,.phone .upload-box[data-queue-size="0"] .upload-box-allowed-files{display:block}#anywhere-upload-paste{height:0;opacity:0;font-size:0}#anywhere-upload-paste *{display:none}.upload-box-queue{text-align:center;font-size:0;margin-top:35px;margin-bottom:35px}.upload-box-queue li{position:relative;text-align:center;display:inline-block;margin:5px}.upload-box-queue .block,.upload-box-queue li{border-radius:.5em;-webkit-transform:translateZ(0)}.upload-box-queue li,.upload-box-queue li.normal{width:110px;height:110px;font-size:14px;font-size:1rem}.upload-box-queue li.small{width:77px;height:77px;font-size:9px;font-size:.643rem}.upload-box-queue li.tiny{width:54px;height:54px;font-size:7px;font-size:.5rem}.upload-box-queue .block{width:100%;height:100%;top:0;inset-inline-start:0;overflow:hidden;position:absolute}.upload-box-queue a.image-link{display:none}.upload-box-queue .completed a.image-link{display:block;position:absolute;overflow:hidden;z-index:1;-webkit-transform:rotate(.000001deg)}.upload-box-queue .queue-item .block.edit,.upload-box-queue .queue-item .queue-item-button{display:block;position:absolute;cursor:pointer;z-index:1}.upload-box-queue .queue-item .queue-item-button .icon{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.upload-box-queue .queue-item.completed:hover .queue-item-button{display:none}.upload-box-queue .queue-item .queue-item-button{font-size:10px;width:21px;height:21px;line-height:23px;background:var(--buttonDefaultBackground);color:var(--buttonDefaultText);border-radius:200px;inset-inline-start:-5px;box-shadow:1px 1px 4px 0 rgba(0,0,0,.5)}.upload-box-queue .queue-item .queue-item-button:hover{background:var(--buttonDefaultHoverBackground);color:var(--buttonDefaultHoverText)}.upload-box-queue .queue-item .queue-item-button.cancel{top:-7px}.upload-box-queue .queue-item .queue-item-button.edit{top:16px;font-size:9px;opacity:0}.upload-box-queue .big-icon{position:absolute;color:#dadada;font-size:5.36em;width:1em;height:1em;inset-inline-start:50%;top:50%;margin-inline-start:-.5em;margin-top:-.5em}.tone-dark .upload-box-queue .big-icon{color:#444;text-shadow:1px 1px 0 rgba(0,0,0,.9)}.upload-box-queue .done,.upload-box-queue .preview{position:relative;overflow:hidden}.upload-box-queue .preview .canvas{position:absolute;top:50%;inset-inline-start:50%}.upload-box-queue .progress{position:absolute}.queue-item.uploading .block.edit,.queue-item.uploading .queue-item-button.edit{display:none}.upload-box-queue .progress-bar{height:100%;float:right;width:100%;display:none}[dir=rtl] .upload-box-queue .progress-bar{float:left}.upload-box-queue .failed .result,.upload-box-queue .progress-bar{-webkit-backdrop-filter:blur(15px);backdrop-filter:blur(15px);transform:all .3s}.upload-box-queue .uploading .progress-bar{display:block}.upload-box-queue .completed .result.done,.upload-box-queue .failed .result.failed{display:block}.upload-box-queue .result{position:absolute;z-index:1;display:none}.tone-dark .upload-box-queue .failed .result,.tone-dark .upload-box-queue .progress-bar{background:rgba(0,0,0,.65)}.upload-box-queue .result .icon{position:absolute;width:100%;font-size:3.429em;top:50%;inset-inline-start:0;margin-top:-.5em;text-shadow:none}.upload-box-queue .done .result .icon{text-shadow:2px 2px 6px rgba(0,0,0,.2)}.upload-box-queue .failed .result .icon{font-size:3.429em}.upload-box-queue.queue-complete .cancel,.upload-box-queue.queue-complete .edit{display:none}#form-embed-toggle-combo,#uploaded-embed-toggle-combo{position:relative}#upload .top-bar{box-shadow:none;border-bottom-color:transparent}#upload .upload-box{transform:none;position:static}body#upload [data-action=close-upload]{display:none!important}.upload-box.queueHasResults [data-action=cancel-upload],.upload-box.queueReady [data-action=close-upload],.upload-box.queueUploading [data-action=close-upload],.upload-box:not(.queueHasResults) [data-action=cancel-upload-remaining],.upload-box:not(.queueReady):not(.queueCompleted) [data-action=reset-upload],.upload-box:not(.queueUploading) [data-action^=cancel-upload],.upload-box:not([data-queue-size="0"]) [data-action=close-upload]{display:none}#background-cover{height:260px;background-color:#000;position:relative}.phone #background-cover:not(.no-background){height:20vh;max-height:260px;min-height:90px}#background-cover.no-background{background-color:var(--bodyEmpty);background-image:none!important;height:auto}.tone-dark #background-cover.no-background{background:#2f2f2f}#background-cover-wrap{height:100%;overflow:hidden;position:relative;padding:10px}#background-cover .content-width{text-align:center}#change-background-cover{position:absolute;inset-inline-end:0;top:0;z-index:500}#user-background-upload{top:0;inset-inline-start:0;width:1px;height:1px}#background-cover-src{overflow:hidden;background-position:center center;background-size:cover}#background-cover .loading-placeholder,#background-cover-src{position:absolute;top:0;inset-inline-start:0;width:100%;height:100%}#background-cover.no-background #background-cover-src{height:0}#background-cover .loading-placeholder{background:rgba(0,0,0,.8)}[data-privacy=public] .list-item-privacy{display:none}.list-item-thumbs li,.list-item-thumbs li a{display:block;height:auto;overflow:hidden}.list-item-thumbs li a{height:100%;background-size:cover;background-position:center center}.list-item-thumbs li img{width:100%;display:block}.input-copy{position:relative}.list-item-image-tools{overflow:hidden;position:absolute;inset-inline-end:0;top:0;transition:all .2s ease-in-out;text-shadow:1px 1px 5px rgba(0,0,0,.5)}.list-item-image-tools.--top{bottom:auto;top:0}.list-item-image-tools.--right{inset-inline-start:auto;inset-inline-end:0}.list-item-image-tools.--bottom{top:auto;bottom:0}.list-item-image-tools.--left{inset-inline-end:auto;inset-inline-start:0}.list-item-image-tools>div{margin:0;cursor:pointer;position:relative;font-size:1em;inset-inline-end:0;margin-inline-start:auto}.list-item-buttons>div,.list-item-image-tools>div,html.--idle .list-item-image-tools>div[data-action=viewer-close]{opacity:.5}.list-item .hover-display.list-item-image-tools,.list-item-image-tools>div:hover,.list-item.selected div.tool-select{opacity:1}.list-item.--over .list-item-image-tools>div{opacity:.5}.list-item-image-tools>div{float:right}[dir=rtl] .list-item-image-tools>div{float:left}.list-item-image-tools>div,.list-item-image-tools>div *{display:block;color:var(--listItemText)}.list-item-image-tools>div span{float:right}[dir=rtl] .list-item-image-tools>div span{float:left}.list-item-image-tools>div .label{font-size:.86em}.list-item-image-tools>div .btn-icon{font-size:1em}.phone .list-item:not(.selected):not(.viewer) .tool-select{display:none}.list-item-image-tools>div .label{text-transform:uppercase;padding-inline-start:1em;padding-inline-end:0;display:none;height:100%}.list-item-image-tools>div:hover .label{display:block}.small-cols .list-item-image-tools>div:hover .label{display:none}[data-flag=safe] .label-flag-safe.btn-icon,[data-flag=safe] .list-item-image-tools>div:hover .label.label-flag-safe,[data-flag=unsafe] .label-flag-unsafe.btn-icon,[data-flag=unsafe] .list-item-image-tools>div:hover .label.label-flag-unsafe{display:none}.unsafe-blur-on .list-item .list-item-thumbs div[data-flag=unsafe] a,.unsafe-blur-on [data-flag=unsafe]:not(.current) .image-container{filter:blur(8px);-webkit-filter:blur(8px)}.unsafe-blur-on .list-item .list-item-thumbs div[data-flag=unsafe]:not(.selected):not(.ui-selecting) a,.unsafe-blur-on [data-flag=unsafe]:not(.selected):not(.ui-selecting):not(.current) .image-container{transform:scale(1.2)}.unsafe-blur-on .list-item:hover .list-item-thumbs div[data-flag=unsafe] a,.unsafe-blur-on [data-flag=unsafe]:hover:not(.selected):not(.ui-selecting):not(.current) .image-container{filter:none;-webkit-filter:none;transform:scale(1)}.list-item-buttons>div,.list-item-image-tools>div,.list-item-image-tools>div .btn-icon{width:2.2em;height:2.2em;line-height:2.2em}.list-item-image-tools>div .btn-icon{color:inherit;text-align:center}.list-item-album .tool-flag{display:none}.list-item .list-item-avatar-cover,.list-item .list-item-avatar-cover>*{border-radius:100%}.list-item .image-container.--bodyEmpty .empty,.list-item .list-item-avatar-cover{position:absolute;border:0;left:50%;top:50%;transform:translate(-50%,-50%)}.list-item .list-item-avatar-cover{height:60%;width:60%;max-height:160px;max-width:160px;background:var(--backgroundLightAlpha);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.list-item .list-item-avatar-cover>*{width:100px;height:100px}.list-item .list-item-avatar-cover img{height:auto;box-shadow:2px 2px 2px rgba(0,0,0,.3)}.selected .list-item-image,.ui-selecting .list-item-image,.unselect .list-item-image{background:var(--viewerBackground)}body#moderate .list-item-like,body#moderate .viewer-kb-key[data-key="L"]{display:none}.list-item-buttons{color:#fff;position:absolute;inset-inline-end:0;bottom:0}.list-item-buttons>div{padding:10px;cursor:pointer;float:left;font-size:1em;margin-inline-start:-5px}[dir=rtl] .list-item-buttons>div{float:right}.list-item .list-item-buttons>div:hover{opacity:1}.list-item-like .btn-like{display:none}.list-item-like .btn-like.btn-liked,.list-item-like .btn-like:hover{opacity:1}[data-liked="0"] .list-item-like .btn-like.btn-unliked{display:block}[data-liked="1"] .list-item-like .btn-like.btn-liked{display:block}.list-item-play-gif,.list-item-play-gif *{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAACdCAMAAAAgwM7pAAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAcVQTFRFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///9///+///+///+///+///+///9///8///1///5///9///9///u///f///+///+///+///9///q///z///9///+///9///8///9///+///+///+///+///8///w///9///+///3///8///9///2///9///7///t///+///8///b///9///9///M///+///y//+A///9///r///7///+///7///3///+///8//+////8//+q///8///+///z///+///+///9///6///m///7///j///7///9///+///+///9///9///6///+///+///+///7///V///+///9///5///9///+///+///8///9///6///8///+///9///4///+///+///+///+///4///9///5///+///v///7///9///8///o///9///9///8///6///y///9///0///+///x///+///6////////////vBUIqgAAAJd0Uk5TABQmNkZSWF5iCipmAiRKZAQuXCwYVDoMUBpgIiil+enVw7GJUBoujZkOCPf/45sMFnDPbEqhtcfZ714Qi9EgWI8adDgO21oGbmoEyxICcgw87Toe+1QEVgJg/RTru344CkIIRnrx55VmMNf1wT4GyaMoh+HlTJcyYt+pJrfTzd0ipyqtEECTXAp8aGQ2FIMWxRKzLrhG/4D2XIEAAAQlSURBVHiczZjnWxNBEMYPCCThgNC7IIKCyaCIdJCmgIooYkFCEwsqTRRQQREb9l7u7/UuuZhccm1vX5+H99Ne2d/d7uzOzowgmCgpOcWVmub2eNxpqa6U5CSzdw3lTXe5xTi5XeleNkpGZpYvnhKWLyszwzYmOydXnxJWbk62PU5ewpAShphnA5NfYIVRVJBvgckoNJibhLkqNJ2qomJ7GEXFRcacklL7HFEsLTHilHlYOKLoKdPnlNucnqh85br/w8yRSTr/VMI4rrA8CfNUxDTPUZXG2S6Dwe5aFWvXU6FTjigWxnLyHUx0RL7Y3WJrfxmpIMrJ4+GI4j9fkG3pN8zljvinHD6OKOaopjf1h3aUG14CmbwcUcwMgbL4QVkKx8uxhiLyefltH5ayAlwIkEsGcS6isNzy+Y7giGKSkIwBJQspGFAKZq6V2U7FgFKFNAwoDWN9xf6OTqFEeXAg2NBgkw0zP2xBwrYIbNPC3AjMseFcLcT5pyOPI9gBiTuyYUEELKzBBVqw0A8XjOLCY1jAjkshYEkNLs3CJX64VBSXHOPSdVwBAVfSEGBFFkWgso+AK0QJsNJYSN48RLFOFaR8CNe+isr9VQeqaw46636otu5wqOEPkKr6I0dZKQ3HGuWOx8MXTc0trW3tIVQHG6azK/QTJ7pjb3b39La29rFg/P3K19vrTrJ9PUGnBmTMwOCQySunB/ptgE4SVZ45a/rKMFHLOUvQSP/5CxavjF6ULThm46csdamV6PIVBOlql0waN3x8jQE1ETQkTZ6Y6tZ/YkQK6q6QkWmiJgaQ0BGMLH2tZoiqWMYmCLPnr+vcnQvSFNMGMNCNegreBHCEW0TVCM7kbZpn9jV6ukN011nPe1pLX6YFNotFdHSRJmKvlwLLzn5oZZHua26YuR9TrRI9cNpXozmihxCQsEbrGFA1amwbzIeUgSaJHqnNx0tPeEib1Ki2tmiNB7RKU2priTZ5QE+fRQa0Tc95QFGt0zQGFKCtPQaCDW2bhjGgJdrh6f5ia1BtvaQ2HlAzVaqtV683eEDRLcKnmE3LJ5gbkR3bUwgI5WrntGe9/41TkPY4WlkI7DrjDGkPSL/jI/twgDR++q3jIGLsneZSCWveOyPFCRVoCdfriSChn7ArB6MOc804fZDD4xGmHrMf/Xq3lYB9lIUjB+yfdB80VC10MnCUFOIzy4eNOSbpkW1ZpFm2ZSvx889YpqLLchpeb2mYGqIpi+R421Zy/GUnlK7rLhFVX+ftpOvCkFpAmLXzsrk6ayuUksbwt9ib3eO935/9YEVNhoosql16mn9GiixOLP6r9m14nvroX9mnjstnjUxXzPMUovaIfv8BgSQJhJIkEEqSQChJAqEkCYSSJBBKkkCo/wICDQ002SDzgxYkaIuANi0X5i8hpIpr8W0lCwAAAABJRU5ErkJggg==);position:absolute;top:50%;inset-inline-start:50%}.list-item-play-gif{scale:.6;width:72px;height:72px;margin-inline-start:-36px;margin-top:-36px;background-position:0 0;cursor:pointer;transition:all 350ms}@media (min-width:320px){.list-item-play-gif{scale:.8}}@media (min-width:480px){.list-item-play-gif{scale:1}}.list-item-play-gif>span{width:66px;height:66px;margin-inline-start:-33px;margin-top:-33px;background-position:0 -73px}.list-item-play-gif--loading>span,.list-item-play-gif:hover>span{-webkit-animation:spin 2s linear infinite;animation:spin 2s linear infinite}.list-item-play-gif>i{width:32px;height:17px;margin-inline-start:-16px;margin-top:-9px;background-position:0 -140px}@-webkit-keyframes spin{from{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(360deg)}}@keyframes spin{from{transform:rotate(0)}to{transform:rotate(360deg)}}.settings-group{display:none}.settings-group-isolated{display:block}.stats-block,a.stats-block{text-decoration:none;color:inherit;padding:10px;border-radius:4px}a.stats-block:hover{color:var(--linkText);background:var(--bodyEmpty)}.tone-dark a.stats-block:hover{background:#222}.text-align-center .stats-big-number{text-align:center}.stats-big-number .number{font-size:44px;font-weight:400}.stats-big-number .number span{font-size:24px}.stats-big-number .label{display:block}.tone-dark .text-content code{border-color:#222;background:#111}#home-top-bar-placeholder{margin-top:-65px}#home-cover{width:100%;background-position:center center;background-color:#333;background-size:cover;color:#fff;position:relative}body.landing #home-cover,body.split #home-cover{margin:0;padding:0;height:100vh;height:100dvh}body.split #home-cover{margin:0;height:500px}#home-cover-content{position:relative;text-align:center;height:100%;top:50px}body.landing #home-cover-content,body.split #home-cover-content{height:calc(100% - 50px);position:relative;display:flex;align-items:center;justify-content:center;flex-direction:column}#home-cover-content>*{margin:10px 0}#home-cover-content h1,#home-cover-content p{text-shadow:2px 2px 8px rgba(0,0,0,.25)}#home-cover-content h1{font-size:2.4em;line-height:120%;font-weight:600}@media (min-width:768px){#home-cover-content h1{font-size:2.7em}}@media (min-width:992px){#home-cover-content h1{font-size:3em}}#home-cover-content p{font-size:22px}.home-buttons{text-align:center}.home-buttons a{font-size:16px;text-transform:uppercase;min-height:50px;line-height:1.5;height:auto;text-align:center;letter-spacing:2px;padding:12px 30px}#home-pics-feature{height:700px;overflow:hidden;position:relative;margin:10px 0}#home-pics-feature.empty{height:auto}#home-pics-feature-overlay{background:linear-gradient(to bottom,rgba(255,255,255,0) 0,rgba(255,255,255,1) 100%);width:100%;height:200px;position:absolute;bottom:0;z-index:1}.tone-dark #home-pics-feature-overlay{background:linear-gradient(to bottom,rgba(0,0,0,0) 0,#000 100%)}#home-pics-feature.empty #home-pics-overlay{display:none}#home-join{margin:40px 0;padding-bottom:40px}#home-join h2{font-size:38px}#home-join p{margin:20px 0;font-size:18px}.ad-banner{margin:10px;text-align:center}.ad-banner:empty{margin:0;height:0}.ad-banner img{display:block;margin:0 auto}.ad-banner-size-300x250{width:300px;height:250px}.ad-banner-size-336x280{width:336px;height:280px}.ad-banner-size-728x90{width:728px;height:90px}.ad-banner-size-300x600{width:300px;height:600px}.ad-banner-size-320x100{width:320px;height:100px}.ad-banner-size-320x50{width:320px;height:50px}.ad-banner-size-468x60{width:468px;height:60px}.ad-banner-size-234x60{width:234px;height:60px}.ad-banner-size-120x600{width:120px;height:600px}.ad-banner-size-120x240{width:120px;height:240px}.ad-banner-size-160x600{width:160px;height:600px}.ad-banner-size-300x1050{width:300px;height:1050px}.ad-banner-size-970x90{width:970px;height:90px}.ad-banner-size-970x250{width:970px;height:250px}.ad-banner-size-250x250{width:250px;height:250px}.ad-banner-size-200x200{width:200px;height:200px}.ad-banner-size-180x150{width:180px;height:150px}.ad-banner-size-125x125{width:125px;height:125px}#banner_before_home_cover{margin:0;padding:10px;background:#000}#banner_image_image-viewer_foot,#banner_image_image-viewer_top{height:90px;margin-inline-start:auto;margin-inline-end:auto}body#consent-screen,body#maintenance{padding:0;margin:0;width:100%;height:100%}#consent-screen-cover,#maintenance-cover{height:100%;background-position:center center;background-color:#333;background-size:cover}#consent-screen-cover-inner,#maintenance-cover-inner{background:rgba(0,0,0,.25);width:100%;height:100vh;height:100dvh}#consent-screen-cover-content,#maintenance-cover-content{color:#fff;padding:40px;text-align:center;position:relative;top:50%;transform:translateY(-50%)}#maintenance-cover-content .logo{display:inline-block;margin-bottom:20px;color:#fff;text-decoration:none;font-size:2.5em}#maintenance-cover-content .logo img{height:30px}#maintenance-cover-content h1{font-size:2.5em;margin-bottom:20px}#maintenance-cover-content p{font-size:1.2em}#consent-screen-cover-inner{background:0 0}#consent-screen-cover-src{width:100%;height:100%;position:absolute;top:0;inset-inline-start:0;background-position:center;background-size:cover}#consent-screen-content{background:var(--menuBackground);color:var(--menuItemText);margin:0 auto;padding:30px;box-shadow:0 0 50px 6px rgba(0,0,0,.25);top:50%;position:relative;transform:translateY(-50%);border-radius:10px;-webkit-backdrop-filter:blur(15px);backdrop-filter:blur(15px)}#consent-screen-content h1{line-height:2em}#consent-screen-content .logo-consent{width:2em;height:auto;display:inline-block;margin-inline-end:10px;vertical-align:top}#fullscreen-modal-box .image-preview{margin-bottom:20px;overflow:auto;text-align:center}.image-preview-container{position:relative;display:block;float:left;width:20%}[dir=rtl] .image-preview-container{float:right}.image-preview-container .empty{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:3em}#fullscreen-modal-box .image-preview:empty{display:none}#fullscreen-modal-box .image-preview .canvas{border:0;display:inline-block;margin:0 auto;max-width:100%;max-height:500px}#fullscreen-modal-box .image-preview .thumb{font-size:0;border:0;display:block;background-size:cover;background-position:center;width:100%}.content-password-gate{background:#f9f9f9;border-radius:10px;padding:30px;font-size:16px;text-align:center}.tone-dark .content-password-gate{background:0 0}.content-password-gate h1{font-size:30px;margin-bottom:10px}.content-password-gate h1 .icon{display:block;font-size:60px;margin-bottom:10px}.content-password-gate .g-captcha>div{margin-inline-end:auto;margin-inline-start:auto}#home-cover-slideshow{position:absolute;top:0;inset-inline-end:0;bottom:0;inset-inline-start:0;overflow:hidden}.home-cover-img{position:absolute;inset-inline-start:0;top:0;width:100%;height:100%;background-size:cover;background-repeat:no-repeat;background-position:center center;display:block;opacity:0;transform:translateZ(0);-webkit-transform:translateZ(0);-webkit-backface-visibility:hidden;backface-visibility:hidden}.home-cover-img.animate-in,.home-cover-img.animate-in--alt{-webkit-animation-name:slideshow;animation-name:slideshow;-webkit-animation-duration:10s;animation-duration:10s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.home-cover-img.animate-in--alt{opacity:1;-webkit-animation-name:slideshow--alt;animation-name:slideshow--alt}.home-cover-img.animate-end{opacity:1;transform:scale(1.1);-webkit-animation:none;animation:none}@-webkit-keyframes slideshow{0%{opacity:0}20%{opacity:1}100%{opacity:1;transform:scale(1.1)}}@keyframes slideshow{0%{opacity:0}20%{opacity:1}100%{opacity:1;transform:scale(1.1)}}@-webkit-keyframes slideshow--alt{100%{transform:scale(1.1)}}@keyframes slideshow--alt{100%{transform:scale(1.1)}}@supports (-ms-accelerator:true){.home-cover-img.animate-end{transform:scale(1)}@-webkit-keyframes slideshow{0%{opacity:0}20%{opacity:1}}@keyframes slideshow{0%{opacity:0}20%{opacity:1}}@-webkit-keyframes slideshow--alt{100%{transform:scale(1)}}@keyframes slideshow--alt{100%{transform:scale(1)}}}#home-cover-slideshow::after{content:"";z-index:1;height:50px;position:absolute;top:0;left:0;right:0;background:linear-gradient(to bottom,rgba(0,0,0,.1) 0,rgba(0,0,0,0) 100%)}#dashboard-settings{min-height:400px}#dashboard .form-content,#settings .form-content{padding-bottom:60px}.footer{color:var(--bodyTextDisabled);font-size:10px;line-height:20px;text-align:center;width:100%;position:absolute;bottom:0;z-index:900;padding:5px;line-height:1}body#upload .footer{background:var(--bodyBackground)}.footer a{color:inherit}body.--viewer-shown{overflow:hidden}.viewer{background:#000;position:fixed;top:0;right:0;bottom:0;left:0;z-index:999}.viewer .list-tool{display:initial!important}.js .viewer{display:block;touch-action:pinch-zoom!important}.viewer--hide{opacity:0}.viewer--show{opacity:1}.viewer.viewer--no-cursor,.viewer.viewer--no-cursor *{cursor:none}.viewer-content{position:relative;top:0;inset-inline-start:0;width:100%;height:100%}.viewer-content img{position:absolute;max-height:100vh;max-height:100dvh;max-width:100vw;max-width:100dvw;transform:translate(-50%,-50%);top:50%;left:50%}.viewer[data-cover="1"] .viewer-content img{width:100vw;width:100dvw;height:100vh;height:100dvh;-o-object-fit:cover;object-fit:contain}.viewer-close,.viewer-wheel>div{color:#fff;top:0;font-size:1em;text-shadow:1px 1px 0 rgba(0,0,0,.5);text-align:center}.viewer-close{position:absolute;width:2.4em;height:2.4em;line-height:2.4em;cursor:pointer;inset-inline-end:-2.4em;z-index:500}.viewer:hover .hover-display.viewer-close{inset-inline-end:2px}.viewer-wheel>div{position:fixed;bottom:0;width:calc(1em + 20px);cursor:pointer;padding:10px;opacity:.7;display:none}.viewer-wheel>div:hover{opacity:1}.viewer--nav-prev .viewer-wheel-prev{inset-inline-start:0;display:block}.viewer--nav-next .viewer-wheel-next{inset-inline-end:0;display:block}.viewer-wheel>div>.icon{position:absolute;top:50%;transform:translateY(-50%);display:block;font-size:1.5em}.viewer-foot{padding:10px;position:absolute;left:0;right:0;bottom:0;height:60px;background:linear-gradient(to bottom,transparent 0,rgba(0,0,0,.6) 100%);display:flex;flex-wrap:wrap;flex-flow:row}.viewer-owner{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#fff;float:left}.viewer-owner .btn{background:rgba(0,0,0,.3);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);color:inherit;border-color:#fff;opacity:.8}.viewer-owner .btn.btn-cta:hover{background:#fff;color:#000;border-color:transparent;opacity:1}.viewer-owner .user-image{font-size:40px;width:1em;height:1em;vertical-align:bottom;color:#fff}.viewer-owner .user-name{font-size:initial;text-decoration:none;vertical-align:middle;line-height:40px;color:inherit}.viewer-owner a.user-name:hover{color:var(--backgroundLightAlpha)}.viewer-owner{order:1}.viewer-kb{font-size:.86em;flex-grow:1;order:2;text-align:center}.viewer .viewer-kb{padding-inline-end:190px}.device-mobile .viewer-kb{display:none}.viewer-kb-input{display:inline-block}.viewer .viewer-kb-input{color:#fff}.viewer-kb-key{display:inline-block;margin:10px;margin-inline-start:0}.viewer-kb-key:first-child{margin-inline-start:10px}.viewer-kb-key kbd{border:1px solid rgba(0,0,0,.5);background:rgba(120,120,120,.5);-webkit-backdrop-filter:blur(15px);backdrop-filter:blur(15px);padding:4px 6px;border-radius:2px;display:inline-block;margin-inline-end:5px;line-height:1}.viewer-like{transform:none;top:auto;bottom:20px;inset-inline-end:20px;position:absolute}.viewer:hover .hover-display--flex{display:flex}.--width-auto{width:auto}.--height-auto{height:auto}html.--idle .viewer,html.--idle .viewer *{cursor:none!important}html .fullscreen-show{display:none}:-webkit-full-screen .fullscreen-hide{display:none}:-ms-fullscreen .fullscreen-hide{display:none}:fullscreen .fullscreen-hide{display:none}:-webkit-full-screen .fullscreen-show{display:block}:-ms-fullscreen .fullscreen-show{display:block}:fullscreen .fullscreen-show{display:block}a.image-container{-webkit-tap-highlight-color:transparent}a{color:var(--linkText);outline:0;text-decoration:none}.content-section,.input-label{margin-top:20px;margin-bottom:20px;position:relative}.content-section:first-child,.input-label:first-child{margin-top:0}.input-label .input{width:100%;margin-bottom:0}.input-label .input+.input{margin-top:5px}.input-label .input-label{margin-bottom:10px}.input-label .input-label .label{font-weight:400}.input-label label .caption,.input-label label .optional{font-weight:400;font-size:.92em}.input-label label .caption:before,.input-label label .optional:before{content:"("}.input-label label .caption:after,.input-label label .optional:after{content:")"}.input-label-below{margin-top:5px;clear:both}.background-cover{position:fixed;top:0;right:0;bottom:0;left:0;background-position:center center;background-size:cover}.input-with-button{position:relative}.input-with-button input::-webkit-inner-spin-button,.input-with-button input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.input-with-button input[type=number]{-moz-appearance:textfield}.input-with-button button{background:0 0;position:absolute;inset-inline-end:0;top:50%;transform:translateY(-50%);border:none;font-size:22px;width:1em;height:1em;outline:0;color:var(--colorAccent)}.input-with-button button:focus,.input-with-button button:hover{color:var(--colorAccentStrong)}#top-left{position:fixed;padding:5px;inset-inline-start:0;top:0}.top-button{padding:5px}.top-button .menu-box{margin-top:5px}.top-button-icon{font-size:16px;color:#fff;cursor:pointer;text-shadow:1px 1px 0 rgba(0,0,0,.15)}.background-default{background:#2ecc71;background:linear-gradient(to bottom,#2ecc71 0,#3498db 100%)}.content-box{position:relative;margin:20px}.content-box-text :first-child{margin-top:0}.content-box-text :last-child{margin-bottom:0}.logo{max-height:50px;max-width:220px;margin-bottom:20px}.card-box{min-width:270px;width:calc(100vw - 40px)}.access-box-content{background:var(--bodyBackground)}.fancy-box-heading{font-size:22px;margin:20px 0 30px 0}.fancy-fieldset{border:0;padding:0;margin:0}.fancy-fieldset input:not([type=checkbox]),.fancy-fieldset input[type=text],.fancy-fieldset select,.fancy-fieldset textarea{outline:0;padding:10px 0;width:100%;border-radius:0;border-color:transparent;background:0 0;box-shadow:none}.fancy-fieldset .checkbox-label input[type=checkbox]{width:auto;vertical-align:middle;margin:0 0 0 -20px}.fancy-fieldset select{-webkit-appearance:none;-moz-appearance:none;appearance:none}.fancy-fieldset input,.fancy-fieldset select{padding:10px 0;border-top:transparent;border-inline-start:transparent;border-inline-end:transparent}.fancy-fieldset input:focus,.fancy-fieldset input:focus[type=text],.fancy-fieldset select:focus,.fancy-fieldset textarea:focus{border-color:var(--colorAccent)}.fancy-fieldset .input-with-button input[type=password]{padding-inline-end:30px}.fancy-fieldset>div:last-child{margin-bottom:inherit}.fancy-fieldset .label{line-height:1.5}.fancy-fieldset .input-label:last-child{margin-bottom:0}.fancy-fieldset .checkbox-label{margin:0}a.login-provider-button{position:relative;text-decoration:none;display:inline-block;font-size:1em;margin:10px 0;background:#d9d9d9;padding:8px;text-decoration:none;display:block;color:#fff;border-radius:3px;text-align:center}a.login-provider-button .text{margin-inline-start:5px}a.login-provider-button--facebook{background-color:#4267b2}a.login-provider-button--twitter{background-color:#1da1f2}a.login-provider-button--google{background-color:#ea4335}a.login-provider-button--vkontakte{background-color:#45668e}a.login-provider-button--apple{background-color:#000}a.login-provider-button--amazon{background-color:#f90}a.login-provider-button--bitbucket{background-color:#2684ff}a.login-provider-button--discord{background-color:#738adb}a.login-provider-button--dribbble{background-color:#e94c88}a.login-provider-button--dropbox{background-color:#007ee5}a.login-provider-button--github{background-color:#333}a.login-provider-button--gitlab{background-color:#fc6d26}a.login-provider-button--instagram{background-color:#e1306c}a.login-provider-button--linkedin{background-color:#006192}a.login-provider-button--mailru{background-color:#168de2}a.login-provider-button--medium{background-color:#00ab6c}a.login-provider-button--odnoklassniki{background-color:#ed812b}a.login-provider-button--orcid{background-color:#a5ce37}a.login-provider-button--reddit{background-color:#ff4500}a.login-provider-button--spotify{background-color:#1db954}a.login-provider-button--stackexchange{background-color:#1e5397}a.login-provider-button--steam{background-color:#00adee}a.login-provider-button--strava{background-color:#fc4c02}a.login-provider-button--telegram{background-color:#08c}a.login-provider-button--tumblr{background-color:#35465c}a.login-provider-button--twitchtv{background-color:#9146ff}a.login-provider-button--wechat{background-color:#7bb32e}a.login-provider-button--windowslive{background-color:#107c10}a.login-provider-button--wordpress{background-color:#21759b}a.login-provider-button--yandex{background-color:#fc0}a.login-provider-button--yahoo{background-color:#410093}a.login-provider-button--qq{background-color:#121214}.login-provider-button-outline{position:relative;text-decoration:none;width:32px;height:32px;display:inline-block;border-radius:50%;border-width:1px;border-style:solid;font-size:16px;margin:5px}.login-provider-button-outline .icon{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.login-provider-button-outline.border-color-facebook:focus,.login-provider-button-outline.border-color-facebook:hover{background-color:#3b5998}.login-provider-button-outline.border-color-twitter:focus,.login-provider-button-outline.border-color-twitter:hover{background-color:#1da1f2}.login-provider-button-outline.border-color-google:focus,.login-provider-button-outline.border-color-google:hover{background-color:#ea4335}.login-provider-button-outline.border-color-vk:focus,.login-provider-button-outline.border-color-vk:hover{background-color:#45668e}.login-provider-button-outline:focus .icon,.login-provider-button-outline:hover .icon{color:#fff}#login{padding:0;margin:0}.content-section--captcha-fix #g-recaptcha,.content-section--captcha-fix .h-captcha{min-height:78px;transform:scale(.89);transform-origin:left}#login .input{margin:0}.btn-container--fixed{position:fixed;left:0;right:0;bottom:0;background:rgba(0,0,0,.05);padding:10px 0;margin:0;border:0;-webkit-backdrop-filter:blur(15px);backdrop-filter:blur(15px);text-align:start}.phablet .btn-container--fixed,.phone .btn-container--fixed{text-align:center}body.full--wh{height:100vh;height:100dvh;width:100vw;width:100dvw}.display-flex #home-cover-slideshow{position:fixed}[data-content=dashboard-imports] [data-action=resume],[data-content=dashboard-imports] [data-errors="0"] [data-content=log-errors],[data-content=dashboard-imports] [data-result],[data-content=dashboard-imports] [data-started="0"] [data-content^=log]{display:none}[data-content=dashboard-imports] [data-errors="1"] [data-content=log-process],[data-content=dashboard-imports] [data-status=completed] [data-action=pause],[data-content=dashboard-imports] [data-status=completed][data-errors="0"] [data-result=success],[data-content=dashboard-imports] [data-status=paused] [data-action=resume],[data-content=dashboard-imports] [data-status][data-errors="1"] [data-result=error]{display:initial}[data-content=dashboard-imports] [data-status=canceled] [data-action=cancel],[data-content=dashboard-imports] [data-status=canceled] [data-action=pause],[data-content=dashboard-imports] [data-status=canceled] [data-target=modal-process-import],[data-content=dashboard-imports] [data-status=completed] [data-action=cancel],[data-content=dashboard-imports] [data-status=completed] [data-action=pause],[data-content=dashboard-imports] [data-status=completed] [data-target=modal-process-import],[data-content=dashboard-imports] [data-status=paused] [data-action=pause],[data-content=dashboard-imports] [data-status=queued] [data-action=pause],[data-content=dashboard-imports] [data-status=working] [data-target=modal-process-import]{display:none!important}.connecting-ip{font-family:monospace;font-size:27px}.code{padding:.05em}.code--command{border-radius:.2em;padding:.5em;padding-inline-end:.7em;border-inline-start:.2em solid var(--colorAccent);background-color:var(--bodyEmpty)}.code--command::before{content:"$ ";color:var(--colorAccent)}.importing{background:var(--bodyEmpty);padding:10px;position:relative}.importing:nth-child(even){margin:0 10px}.phablet .importing:nth-child(even),.phone .importing:nth-child(even){margin:10px 0}.importing-stats{margin:10px 0}.importing-stats .figure{display:inline-block;padding:5px;background:var(--buttonAccentBackground);color:var(--buttonAccentText)}.apexcharts-menu-icon,.apexcharts-pan-icon,.apexcharts-reset-icon,.apexcharts-selection-icon,.apexcharts-theme-light .apexcharts-legend-text,.apexcharts-toolbar-custom-icon,.apexcharts-zoom-icon,.apexcharts-zoomin-icon,.apexcharts-zoomout-icon{color:var(--bodyText)!important}.apexcharts-menu-icon svg,.apexcharts-reset-icon svg,.apexcharts-zoom-icon svg,.apexcharts-zoomin-icon svg,.apexcharts-zoomout-icon svg{fill:var(--bodyText)!important}.apexcharts-theme-dark .apexcharts-legend-text{color:var(--bodyTextSubtle)!important}.apexcharts-theme-light svg text{fill:var(--bodyText)}.apexcharts-theme-dark svg text{fill:var(--bodyTextSubtle)}.apexcharts-toolbar{z-index:0!important}.apexcharts-canvas>svg{background:0 0!important}#dashboard-chart{margin:35px auto;overflow:hidden}#dashboard-chart .toolbar{margin-inline-start:45px}#dashboard-chart button{background:var(--bodyBackground);color:var(--bodyText);border:1px solid var(--bodySeparator);border-bottom:2px solid var(--bodySeparator);border-radius:2px;padding:4px 17px}#dashboard-chart button.active{color:var(--buttonAccentText);background:var(--buttonAccentBackground);border:1px solid var(--buttonAccentBackground);border-bottom:2px solid var(--buttonAccentBackground)}#dashboard-chart button:focus{outline:0}.corazoncito{width:1em;height:1em;font-size:290px;color:rgb(255,0,0,.6);z-index:1;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%) scale(.4);transition:all .5s ease}.corazoncito.--show{opacity:1;transform:translate(-50%,-50%) scale(1)}.corazoncito span{font-size:.25em;top:50%;left:50%;display:block;position:absolute;color:#fff;transform:translate(-50%,-50%);line-height:1;font-family:sans-serif;margin-top:-.1em;font-weight:400}.card-wrapper{height:175px;overflow-y:hidden;overflow-x:auto;-ms-scroll-snap-type:x mandatory;scroll-snap-type:x mandatory}.card-wrapper::-webkit-scrollbar{width:10px;height:3px}.card-wrapper::-webkit-scrollbar-track{background:var(--bodyEmpty)}.card-wrapper::-webkit-scrollbar-thumb{background:var(--colorAccent)}.card-wrapper::-webkit-scrollbar-thumb:hover{background:var(--colorAccentStrong)}.card-slider{width:calc(310px * 8 - 10px)}.card-container{width:300px;height:200px;display:block;float:left;margin-inline-end:10px;scroll-snap-align:start}[dir=rtl] .card-container{float:right}.card-container:first-child{margin-inline-start:0}.card-container:last-child{margin-inline-end:0}.card{width:100%;position:relative}.card a{text-decoration:none}.card-header-image{width:100%;height:150px;overflow:hidden;border-radius:1em;display:block;background-size:cover;background-position:center}.card-header-image-mask{width:100%;height:100%;display:block;background-color:rgba(0,0,0,0)}.card-header-image:hover .card-header-image-mask{background-color:var(--buttonAccentBackground)}.card-text{color:#fff;text-align:center;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:80%;text-shadow:2px 2px 8px rgba(0,0,0,.35)}.card-header-image:hover .card-text{color:var(--buttonAccentText)}.card-text h3{font-weight:700;font-size:1.6em;margin-bottom:5px}.powered-by--provider a.logo{font-size:5em;text-decoration:none}[data-banned="0"] [data-action=user_unban],[data-banned="1"] [data-action=user_ban]{display:none}.captcha.captcha--3 [data-content=captcha]{display:none}.cta-row{border:1px solid var(--bodySeparator);border-right:0;border-left:0;padding-top:20px;padding-bottom:20px;margin:0;cursor:grab;margin-bottom:-1px}.cta-row.ui-sortable-helper{background:var(--modalBackground)}.phablet .btn-cta .btn-text,.phone .btn-cta .btn-text{display:none}.btn-cta{background-color:var(--bodyBackground);color:var(--bodyText);border-color:var(--bodyText)}.btn-cta:hover{background-color:var(--colorAccent);color:var(--buttonAccentText);border-color:transparent}.btn-cta:hover .btn-icon{color:inherit}.version-display{font-size:1.4em} \ No newline at end of file diff --git a/content/legacy/themes/Peafowl/views/dashboard/stats.php b/content/legacy/themes/Peafowl/views/dashboard/stats.php index 1caa711..5abbb35 100644 --- a/content/legacy/themes/Peafowl/views/dashboard/stats.php +++ b/content/legacy/themes/Peafowl/views/dashboard/stats.php @@ -2,6 +2,7 @@ use Chevereto\Legacy\Classes\Stat; use function Chevereto\Legacy\G\bytes_to_mb; +use function Chevereto\Legacy\G\get_base_url; use function Chevereto\Legacy\G\get_client_ip; use Chevereto\Legacy\G\Handler; use function Chevereto\Legacy\get_static_url; @@ -12,6 +13,24 @@ if (!defined('ACCESS') || !ACCESS) { die('This file cannot be directly accessed.'); } ?> +