diff --git a/classes/Commands/AbstractCommand.php b/classes/Commands/AbstractCommand.php
index 15d4feb28..a46aed1f0 100644
--- a/classes/Commands/AbstractCommand.php
+++ b/classes/Commands/AbstractCommand.php
@@ -91,6 +91,9 @@ protected function setupEnvironment(InputInterface $input, OutputInterface $outp
         $this->upgradeContainer->setLogger($this->logger);
         (new ErrorHandler($this->logger))->enable();
         $this->logger->debug('Error handler enabled.');
+
+        $moduleDir = $this->upgradeContainer->getProperty(UpgradeContainer::WORKSPACE_PATH);
+        $this->upgradeContainer->getWorkspace()->init($moduleDir);
     }
 
     /**
diff --git a/classes/Task/Miscellaneous/CompareReleases.php b/classes/Task/Miscellaneous/CompareReleases.php
deleted file mode 100644
index def386310..000000000
--- a/classes/Task/Miscellaneous/CompareReleases.php
+++ /dev/null
@@ -1,72 +0,0 @@
-<?php
-
-/**
- * Copyright since 2007 PrestaShop SA and Contributors
- * PrestaShop is an International Registered Trademark & Property of PrestaShop SA
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Academic Free License 3.0 (AFL-3.0)
- * that is bundled with this package in the file LICENSE.md.
- * It is also available through the world-wide-web at this URL:
- * https://opensource.org/licenses/AFL-3.0
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@prestashop.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
- * versions in the future. If you wish to customize PrestaShop for your
- * needs please refer to https://devdocs.prestashop.com/ for more information.
- *
- * @author    PrestaShop SA and Contributors <contact@prestashop.com>
- * @copyright Since 2007 PrestaShop SA and Contributors
- * @license   https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
- */
-
-namespace PrestaShop\Module\AutoUpgrade\Task\Miscellaneous;
-
-use Exception;
-use PrestaShop\Module\AutoUpgrade\Task\AbstractTask;
-use PrestaShop\Module\AutoUpgrade\Task\ExitCode;
-use PrestaShop\Module\AutoUpgrade\Task\TaskName;
-
-/**
- * This class gets the list of all modified and deleted files between current version
- * and target version (according to channel configuration).
- *
- * TODO Task to remove after removing the old UI
- */
-class CompareReleases extends AbstractTask
-{
-    /**
-     * @throws Exception
-     */
-    public function run(): int
-    {
-        // do nothing after this request (see javascript function doAjaxRequest )
-        $this->next = TaskName::TASK_COMPLETE;
-        $upgrader = $this->container->getUpgrader();
-        $checksumCompare = $this->container->getChecksumCompare();
-        $version = $upgrader->getDestinationVersion();
-
-        // Get list of differences between these two versions. The differences will be fetched from a local
-        // XML file if it exists, or from PrestaShop API.
-        $diffFileList = $checksumCompare->getFilesDiffBetweenVersions(_PS_VERSION_, $version);
-        if (!is_array($diffFileList)) {
-            $this->nextParams['status'] = 'error';
-            $this->nextParams['msg'] = sprintf('Unable to generate diff file list between %1$s and %2$s.', _PS_VERSION_, $version);
-        } else {
-            $this->nextParams['msg'] = $this->translator->trans(
-                '%modifiedfiles% files will be modified, %deletedfiles% files will be deleted (if they are found).',
-                [
-                    '%modifiedfiles%' => count($diffFileList['modified']),
-                    '%deletedfiles%' => count($diffFileList['deleted']),
-                ]);
-            $this->nextParams['result'] = $diffFileList;
-        }
-
-        return ExitCode::SUCCESS;
-    }
-}
diff --git a/classes/Task/Runner/ChainedTasks.php b/classes/Task/Runner/ChainedTasks.php
index 5d70926b8..474c943f7 100644
--- a/classes/Task/Runner/ChainedTasks.php
+++ b/classes/Task/Runner/ChainedTasks.php
@@ -117,7 +117,6 @@ private function setupLogging(): void
         $initializationSteps = [TaskName::TASK_BACKUP_INITIALIZATION, TaskName::TASK_UPDATE_INITIALIZATION, TaskName::TASK_RESTORE_INITIALIZATION];
 
         if (in_array($this->step, $initializationSteps)) {
-            $this->container->getWorkspace()->createFolders();
             $timestamp = date('Y-m-d-His');
             switch ($this->step) {
                 case TaskName::TASK_BACKUP_INITIALIZATION:
diff --git a/classes/Task/TaskName.php b/classes/Task/TaskName.php
index 7504b5c3f..3a200771c 100644
--- a/classes/Task/TaskName.php
+++ b/classes/Task/TaskName.php
@@ -56,6 +56,5 @@ class TaskName
     const TASK_UNZIP = 'Unzip';
 
     // MISC
-    const TASK_COMPARE_RELEASES = 'CompareReleases';
     const TASK_UPDATE_CONFIG = 'UpdateConfig';
 }
diff --git a/classes/Twig/Block/RollbackForm.php b/classes/Twig/Block/RollbackForm.php
deleted file mode 100644
index 6233bda6a..000000000
--- a/classes/Twig/Block/RollbackForm.php
+++ /dev/null
@@ -1,68 +0,0 @@
-<?php
-
-/**
- * Copyright since 2007 PrestaShop SA and Contributors
- * PrestaShop is an International Registered Trademark & Property of PrestaShop SA
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Academic Free License 3.0 (AFL-3.0)
- * that is bundled with this package in the file LICENSE.md.
- * It is also available through the world-wide-web at this URL:
- * https://opensource.org/licenses/AFL-3.0
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@prestashop.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
- * versions in the future. If you wish to customize PrestaShop for your
- * needs please refer to https://devdocs.prestashop.com/ for more information.
- *
- * @author    PrestaShop SA and Contributors <contact@prestashop.com>
- * @copyright Since 2007 PrestaShop SA and Contributors
- * @license   https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
- */
-
-namespace PrestaShop\Module\AutoUpgrade\Twig\Block;
-
-use PrestaShop\Module\AutoUpgrade\Backup\BackupFinder;
-use Twig\Environment;
-
-class RollbackForm
-{
-    /**
-     * @var Environment
-     */
-    private $twig;
-
-    /**
-     * @var BackupFinder
-     */
-    private $backupFinder;
-
-    /**
-     * @param Environment $twig
-     */
-    public function __construct($twig, BackupFinder $backupFinder)
-    {
-        $this->twig = $twig;
-        $this->backupFinder = $backupFinder;
-    }
-
-    /**
-     * @return array<string, mixed>
-     */
-    public function getTemplateVars(): array
-    {
-        return [
-            'availableBackups' => $this->backupFinder->getAvailableBackups(),
-        ];
-    }
-
-    public function render(): string
-    {
-        return $this->twig->render('@ModuleAutoUpgrade/block/rollbackForm.html.twig', $this->getTemplateVars());
-    }
-}
diff --git a/classes/Twig/Block/UpgradeButtonBlock.php b/classes/Twig/Block/UpgradeButtonBlock.php
deleted file mode 100644
index 4265d938b..000000000
--- a/classes/Twig/Block/UpgradeButtonBlock.php
+++ /dev/null
@@ -1,174 +0,0 @@
-<?php
-
-/**
- * Copyright since 2007 PrestaShop SA and Contributors
- * PrestaShop is an International Registered Trademark & Property of PrestaShop SA
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Academic Free License 3.0 (AFL-3.0)
- * that is bundled with this package in the file LICENSE.md.
- * It is also available through the world-wide-web at this URL:
- * https://opensource.org/licenses/AFL-3.0
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@prestashop.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
- * versions in the future. If you wish to customize PrestaShop for your
- * needs please refer to https://devdocs.prestashop.com/ for more information.
- *
- * @author    PrestaShop SA and Contributors <contact@prestashop.com>
- * @copyright Since 2007 PrestaShop SA and Contributors
- * @license   https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
- */
-
-namespace PrestaShop\Module\AutoUpgrade\Twig\Block;
-
-use Configuration;
-use PrestaShop\Module\AutoUpgrade\Parameters\UpgradeConfiguration;
-use PrestaShop\Module\AutoUpgrade\Task\AbstractTask;
-use PrestaShop\Module\AutoUpgrade\Upgrader;
-use PrestaShop\Module\AutoUpgrade\UpgradeSelfCheck;
-use PrestaShop\Module\AutoUpgrade\UpgradeTools\Translator;
-use Twig\Environment;
-
-class UpgradeButtonBlock
-{
-    /**
-     * @var Environment
-     */
-    private $twig;
-
-    /**
-     * @var Translator
-     */
-    private $translator;
-
-    /**
-     * @var Upgrader
-     */
-    private $upgrader;
-
-    /**
-     * @var UpgradeConfiguration
-     */
-    private $config;
-
-    /**
-     * @var UpgradeSelfCheck
-     */
-    private $selfCheck;
-
-    /**
-     * @var string
-     */
-    private $downloadPath;
-
-    /**
-     * @var string
-     */
-    private $token;
-
-    /**
-     * @param Environment $twig
-     */
-    public function __construct(
-        $twig,
-        Translator $translator,
-        UpgradeConfiguration $config,
-        Upgrader $upgrader,
-        UpgradeSelfCheck $selfCheck,
-        string $downloadPath,
-        string $token
-    ) {
-        $this->twig = $twig;
-        $this->translator = $translator;
-        $this->upgrader = $upgrader;
-        $this->config = $config;
-        $this->selfCheck = $selfCheck;
-        $this->downloadPath = $downloadPath;
-        $this->token = $token;
-    }
-
-    /**
-     * @return array<string, mixed>
-     */
-    public function getTemplateVars(): array
-    {
-        $showUpgradeButton = false;
-        $showUpgradeLink = false;
-        $upgradeLink = '';
-        $changelogLink = '';
-        $skipActions = [];
-
-        // decide to display "Start Upgrade" or not
-        if ($this->selfCheck->isOkForUpgrade() && !$this->upgrader->isLastVersion()) {
-            $showUpgradeButton = true;
-            if ($this->config->isChannelOnline()) {
-                $showUpgradeLink = true;
-                $upgradeLink = $this->upgrader->getOnlineDestinationRelease()->getZipDownloadUrl();
-                $changelogLink = $this->upgrader->getOnlineDestinationRelease()->getReleaseNoteUrl();
-            }
-
-            // if skipActions property is used, we will handle that in the display :)
-            $skipActions = AbstractTask::$skipAction;
-        }
-
-        $dir = glob($this->downloadPath . DIRECTORY_SEPARATOR . '*.zip');
-        $xml = glob($this->downloadPath . DIRECTORY_SEPARATOR . '*.xml');
-
-        return [
-            'currentPsVersion' => _PS_VERSION_,
-            'isLastVersion' => $this->upgrader->isLastVersion(),
-            'destinationVersion' => $this->upgrader->getDestinationVersion(),
-            'channel' => $this->config->getChannelOrDefault(),
-            'showUpgradeButton' => $showUpgradeButton,
-            'upgradeLink' => $upgradeLink,
-            'showUpgradeLink' => $showUpgradeLink,
-            'changelogLink' => $changelogLink,
-            'skipActions' => $skipActions,
-            'lastVersionCheck' => Configuration::get('PS_LAST_VERSION_CHECK'),
-            'token' => $this->token,
-            'channelOptions' => $this->getOptChannels(),
-            'privateChannel' => [
-                'releaseLink' => $this->config->get('private_release_link'),
-                'releaseMd5' => $this->config->get('private_release_md5'),
-                'allowMajor' => $this->config->get('private_allow_major'),
-            ],
-            'archiveFiles' => $dir,
-            'xmlFiles' => $xml,
-            'archiveFileName' => $this->config->getLocalChannelZip(),
-            'xmlFileName' => $this->config->getLocalChannelXml(),
-            'archiveVersionNumber' => $this->config->getLocalChannelVersion(),
-            'downloadPath' => $this->downloadPath . DIRECTORY_SEPARATOR,
-            'directoryVersionNumber' => $this->config->get('directory.version_num'),
-            'phpVersion' => PHP_VERSION,
-        ];
-    }
-
-    /**
-     * display the summary current version / target version + "Upgrade Now" button with a "more options" button.
-     *
-     * @return string HTML
-     */
-    public function render(): string
-    {
-        return $this->twig->render('@ModuleAutoUpgrade/block/upgradeButtonBlock.html.twig', $this->getTemplateVars());
-    }
-
-    /**
-     * @return array<int, array<string>>
-     */
-    private function getOptChannels(): array
-    {
-        $translator = $this->translator;
-
-        return [
-            ['useOnline', UpgradeConfiguration::CHANNEL_ONLINE, $translator->trans('Online')],
-            ['useLocal', UpgradeConfiguration::CHANNEL_LOCAL, $translator->trans('Local archive')],
-        ];
-    }
-}
diff --git a/classes/Twig/Block/UpgradeChecklist.php b/classes/Twig/Block/UpgradeChecklist.php
deleted file mode 100644
index 344e7f02b..000000000
--- a/classes/Twig/Block/UpgradeChecklist.php
+++ /dev/null
@@ -1,125 +0,0 @@
-<?php
-
-/**
- * Copyright since 2007 PrestaShop SA and Contributors
- * PrestaShop is an International Registered Trademark & Property of PrestaShop SA
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Academic Free License 3.0 (AFL-3.0)
- * that is bundled with this package in the file LICENSE.md.
- * It is also available through the world-wide-web at this URL:
- * https://opensource.org/licenses/AFL-3.0
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@prestashop.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
- * versions in the future. If you wish to customize PrestaShop for your
- * needs please refer to https://devdocs.prestashop.com/ for more information.
- *
- * @author    PrestaShop SA and Contributors <contact@prestashop.com>
- * @copyright Since 2007 PrestaShop SA and Contributors
- * @license   https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
- */
-
-namespace PrestaShop\Module\AutoUpgrade\Twig\Block;
-
-use Context;
-use PrestaShop\Module\AutoUpgrade\Tools14;
-use PrestaShop\Module\AutoUpgrade\UpgradeSelfCheck;
-use Twig\Environment;
-
-/**
- * Builds the upgrade checklist block.
- */
-class UpgradeChecklist
-{
-    /**
-     * @var Environment
-     */
-    private $twig;
-
-    /**
-     * @var UpgradeSelfCheck
-     */
-    private $selfCheck;
-
-    /**
-     * @var string
-     */
-    private $currentIndex;
-
-    /**
-     * @var string
-     */
-    private $token;
-
-    /**
-     * UpgradeChecklistBlock constructor.
-     *
-     * @param Environment $twig
-     * @param UpgradeSelfCheck $upgradeSelfCheck
-     * @param string $currentIndex
-     * @param string $token
-     */
-    public function __construct(
-        $twig,
-        UpgradeSelfCheck $upgradeSelfCheck,
-        string $currentIndex,
-        string $token
-    ) {
-        $this->twig = $twig;
-        $this->selfCheck = $upgradeSelfCheck;
-        $this->currentIndex = $currentIndex;
-        $this->token = $token;
-    }
-
-    /**
-     * @return array<string, mixed>
-     */
-    public function getTemplateVars(): array
-    {
-        return [
-            'showErrorMessage' => !$this->selfCheck->isOkForUpgrade(),
-            'moduleVersion' => $this->selfCheck->getModuleVersion(),
-            'moduleIsUpToDate' => $this->selfCheck->isModuleVersionLatest(),
-            'moduleUpdateLink' => Context::getContext()->link->getAdminLink('AdminModulesUpdates'),
-            'isShopVersionMatchingVersionInDatabase' => $this->selfCheck->isShopVersionMatchingVersionInDatabase(),
-            'adminToken' => Tools14::getAdminTokenLite('AdminModules'),
-            'informationsLink' => Context::getContext()->link->getAdminLink('AdminInformation'),
-            'maintenanceLink' => Context::getContext()->link->getAdminLink('AdminMaintenance'),
-            'rootDirectoryIsWritable' => $this->selfCheck->isRootDirectoryWritable(),
-            'rootDirectory' => _PS_ROOT_DIR_,
-            'adminDirectoryIsWritable' => $this->selfCheck->isAdminAutoUpgradeDirectoryWritable(),
-            'adminDirectoryWritableReport' => $this->selfCheck->getAdminAutoUpgradeDirectoryWritableReport(),
-            'safeModeIsDisabled' => $this->selfCheck->isSafeModeDisabled(),
-            'allowUrlFopenOrCurlIsEnabled' => $this->selfCheck->isFOpenOrCurlEnabled(),
-            'zipIsEnabled' => $this->selfCheck->isZipEnabled(),
-            'storeIsInMaintenance' => $this->selfCheck->isShopDeactivated(),
-            'isLocalEnvironment' => $this->selfCheck->isLocalEnvironment(),
-            'currentIndex' => $this->currentIndex,
-            'token' => $this->token,
-            'cachingIsDisabled' => $this->selfCheck->isCacheDisabled(),
-            'maxExecutionTime' => $this->selfCheck->getMaxExecutionTime(),
-            'phpRequirementsState' => $this->selfCheck->getPhpRequirementsState(),
-            'checkApacheModRewrite' => $this->selfCheck->isApacheModRewriteEnabled(),
-            'notLoadedPhpExtensions' => $this->selfCheck->getNotLoadedPhpExtensions(),
-            'checkKeyGeneration' => $this->selfCheck->checkKeyGeneration(),
-            'checkMemoryLimit' => $this->selfCheck->isMemoryLimitValid(),
-            'checkFileUploads' => $this->selfCheck->isPhpFileUploadsConfigurationEnabled(),
-            'notExistsPhpFunctions' => $this->selfCheck->getNotExistsPhpFunctions(),
-            'notWritingDirectories' => $this->selfCheck->getNotWritingDirectories(),
-        ];
-    }
-
-    /**
-     * Returns the block's HTML.
-     */
-    public function render(): string
-    {
-        return $this->twig->render('@ModuleAutoUpgrade/block/checklist.html.twig', $this->getTemplateVars());
-    }
-}
diff --git a/classes/Twig/Block/index.php b/classes/Twig/Block/index.php
deleted file mode 100644
index 45df26c54..000000000
--- a/classes/Twig/Block/index.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-/**
- * Copyright since 2007 PrestaShop SA and Contributors
- * PrestaShop is an International Registered Trademark & Property of PrestaShop SA
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Academic Free License 3.0 (AFL-3.0)
- * that is bundled with this package in the file LICENSE.md.
- * It is also available through the world-wide-web at this URL:
- * https://opensource.org/licenses/AFL-3.0
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@prestashop.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
- * versions in the future. If you wish to customize PrestaShop for your
- * needs please refer to https://devdocs.prestashop.com/ for more information.
- *
- * @author    PrestaShop SA and Contributors <contact@prestashop.com>
- * @copyright Since 2007 PrestaShop SA and Contributors
- * @license   https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
- */
-header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
-header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
-
-header('Cache-Control: no-store, no-cache, must-revalidate');
-header('Cache-Control: post-check=0, pre-check=0', false);
-header('Pragma: no-cache');
-
-header('Location: ../');
-exit;
diff --git a/classes/Twig/Form/BackupOptionsForm.php b/classes/Twig/Form/BackupOptionsForm.php
deleted file mode 100644
index 8c2a332d0..000000000
--- a/classes/Twig/Form/BackupOptionsForm.php
+++ /dev/null
@@ -1,89 +0,0 @@
-<?php
-
-/**
- * Copyright since 2007 PrestaShop SA and Contributors
- * PrestaShop is an International Registered Trademark & Property of PrestaShop SA
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Academic Free License 3.0 (AFL-3.0)
- * that is bundled with this package in the file LICENSE.md.
- * It is also available through the world-wide-web at this URL:
- * https://opensource.org/licenses/AFL-3.0
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@prestashop.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
- * versions in the future. If you wish to customize PrestaShop for your
- * needs please refer to https://devdocs.prestashop.com/ for more information.
- *
- * @author    PrestaShop SA and Contributors <contact@prestashop.com>
- * @copyright Since 2007 PrestaShop SA and Contributors
- * @license   https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
- */
-
-namespace PrestaShop\Module\AutoUpgrade\Twig\Form;
-
-use PrestaShop\Module\AutoUpgrade\Parameters\UpgradeConfiguration;
-use PrestaShop\Module\AutoUpgrade\UpgradeTools\Translator;
-
-class BackupOptionsForm
-{
-    /**
-     * @var array<string, array<string>>
-     */
-    private $fields;
-
-    /**
-     * @var Translator
-     */
-    private $translator;
-
-    /**
-     * @var FormRenderer
-     */
-    private $formRenderer;
-
-    public function __construct(Translator $translator, FormRenderer $formRenderer)
-    {
-        $this->translator = $translator;
-        $this->formRenderer = $formRenderer;
-
-        $this->fields = [
-            UpgradeConfiguration::PS_AUTOUP_BACKUP => [
-                'title' => $this->translator->trans('Back up my files and database'),
-                'cast' => 'intval',
-                'validation' => 'isBool',
-                'defaultValue' => '1',
-                'type' => 'bool',
-                'desc' => $this->translator->trans(
-                    'Automatically back up your database and files in order to restore your shop if needed. This is experimental: you should still perform your own manual backup for safety.'
-                ),
-            ],
-            UpgradeConfiguration::PS_AUTOUP_KEEP_IMAGES => [
-                'title' => $this->translator->trans(
-                    'Back up my images'
-                ),
-                'cast' => 'intval',
-                'validation' => 'isBool',
-                'defaultValue' => '1',
-                'type' => 'bool',
-                'desc' => $this->translator->trans(
-                    'To save time, you can decide not to back your images up. In any case, always make sure you did back them up manually.'
-                ),
-            ],
-        ];
-    }
-
-    public function render(): string
-    {
-        return $this->formRenderer->render(
-                'backupOptions',
-                $this->fields,
-                $this->translator->trans('Backup Options')
-            );
-    }
-}
diff --git a/classes/Twig/Form/FormRenderer.php b/classes/Twig/Form/FormRenderer.php
deleted file mode 100644
index ea3849fdd..000000000
--- a/classes/Twig/Form/FormRenderer.php
+++ /dev/null
@@ -1,261 +0,0 @@
-<?php
-
-/**
- * Copyright since 2007 PrestaShop SA and Contributors
- * PrestaShop is an International Registered Trademark & Property of PrestaShop SA
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Academic Free License 3.0 (AFL-3.0)
- * that is bundled with this package in the file LICENSE.md.
- * It is also available through the world-wide-web at this URL:
- * https://opensource.org/licenses/AFL-3.0
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@prestashop.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
- * versions in the future. If you wish to customize PrestaShop for your
- * needs please refer to https://devdocs.prestashop.com/ for more information.
- *
- * @author    PrestaShop SA and Contributors <contact@prestashop.com>
- * @copyright Since 2007 PrestaShop SA and Contributors
- * @license   https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
- */
-
-namespace PrestaShop\Module\AutoUpgrade\Twig\Form;
-
-use PrestaShop\Module\AutoUpgrade\Parameters\UpgradeConfiguration;
-use PrestaShop\Module\AutoUpgrade\UpgradeTools\Translator;
-use Twig\Environment;
-
-class FormRenderer
-{
-    /**
-     * @var UpgradeConfiguration
-     */
-    private $config;
-
-    /**
-     * @var Translator
-     */
-    private $translator;
-
-    /**
-     * @var Environment
-     */
-    private $twig;
-
-    /**
-     * @param Environment $twig
-     */
-    public function __construct(
-        UpgradeConfiguration $configuration,
-        $twig,
-        Translator $translator
-    ) {
-        $this->config = $configuration;
-        $this->twig = $twig;
-        $this->translator = $translator;
-    }
-
-    /**
-     * @param array<string, array<string, string|array<string>>> $fields
-     */
-    public function render(string $name, array $fields, string $tabname): string
-    {
-        $formFields = [];
-
-        foreach ($fields as $key => $field) {
-            $html = '';
-            $required = !empty($field['required']);
-            $disabled = !empty($field['disabled']);
-
-            if ($key === UpgradeConfiguration::PS_DISABLE_OVERRIDES) {
-                // values fetched from configuration in database
-                $val = UpgradeConfiguration::isOverrideAllowed();
-            } else {
-                // other conf values are fetched from config file
-                $val = $this->config->get($key);
-            }
-
-            if ($val === null) {
-                $val = isset($field['defaultValue']) ? $field['defaultValue'] : false;
-            }
-
-            if (!in_array($field['type'], ['image', 'radio', 'select', 'container', 'bool', 'container_end']) || isset($field['show'])) {
-                $html .= '<div style="clear: both; padding-top:15px">'
-                    . ($field['title'] ? '<label >' . $field['title'] . '</label>' : '')
-                    . '<div class="margin-form" style="padding-top:5px">';
-            }
-
-            // Display the appropriate input type for each field
-            switch ($field['type']) {
-                case 'disabled':
-                    $html .= $field['disabled'];
-                    break;
-
-                case 'bool':
-                    $html .= $this->renderBool($field, $key, $val);
-                    break;
-
-                case 'radio':
-                    $html .= $this->renderRadio($field, $key, $val, $disabled);
-                    break;
-
-                case 'select':
-                    $html .= $this->renderSelect($field, $key, $val);
-                    break;
-
-                case 'textarea':
-                    $html .= $this->renderTextarea($field, $key, $val, $disabled);
-                    break;
-
-                case 'container':
-                    $html .= '<div id="' . $key . '">';
-                    break;
-
-                case 'container_end':
-                    $html .= (isset($field['content']) ? $field['content'] : '') . '</div>';
-                    break;
-
-                case 'text':
-                default:
-                    $html .= $this->renderTextField($field, $key, $val, $disabled);
-            }
-
-            if ($required && !in_array($field['type'], ['image', 'radio'])) {
-                $html .= ' <sup>*</sup>';
-            }
-
-            if (isset($field['desc']) && !in_array($field['type'], ['bool', 'select'])) {
-                $html .= '<p style="clear:both">';
-                if (!empty($field['thumb']) && $field['thumb']['pos'] == 'after') {
-                    $html .= $this->renderThumb($field);
-                }
-                $html .= $field['desc'] . '</p>';
-            }
-
-            if (!in_array($field['type'], ['image', 'radio', 'select', 'container', 'bool', 'container_end']) || isset($field['show'])) {
-                $html .= '</div></div>';
-            }
-
-            $formFields[] = $html;
-        }
-
-        return $this->twig->render(
-            '@ModuleAutoUpgrade/form.html.twig',
-            [
-                'name' => $name,
-                'tabName' => $tabname,
-                'fields' => $formFields,
-            ]
-        );
-    }
-
-    /**
-     * @param array<string, string|array<string>> $field
-     */
-    private function renderBool(array $field, string $key, bool $val): string
-    {
-        return '<div class="form-group">
-                <label class="col-lg-3 control-label">' . $field['title'] . '</label>
-                    <div class="col-lg-9">
-                        <span class="switch prestashop-switch fixed-width-lg">
-                            <input type="radio" name="' . $key . '" id="' . $key . '_on" value="1" ' . ($val ? ' checked="checked"' : '') . (isset($field['js']['on']) ? $field['js']['on'] : '') . ' />
-                            <label for="' . $key . '_on" class="radioCheck">
-                                <i class="color_success"></i> '
-                            . $this->translator->trans('Yes') . '
-                            </label>
-                            <input type="radio" name="' . $key . '" id="' . $key . '_off" value="0" ' . (!$val ? 'checked="checked"' : '') . (isset($field['js']['off']) ? $field['js']['off'] : '') . '/>
-                            <label for="' . $key . '_off" class="radioCheck">
-                                <i class="color_danger"></i> ' . $this->translator->trans('No') . '
-                            </label>
-                            <a class="slide-button btn"></a>
-                        </span>
-                        <div class="help-block">' . $field['desc'] . '</div>
-                    </div>
-                </div>';
-    }
-
-    /**
-     * @param array<string, string|array<string>> $field
-     */
-    private function renderRadio(array $field, string $key, string $val, bool $disabled): string
-    {
-        $html = '';
-        foreach ($field['choices'] as $cValue => $cKey) {
-            $html .= '<input ' . ($disabled ? 'disabled="disabled"' : '') . ' type="radio" name="' . $key . '" id="' . $key . $cValue . '_on" value="' . (int) ($cValue) . '"' . (($cValue == $val) ? ' checked="checked"' : '') . (isset($field['js'][$cValue]) ? ' ' . $field['js'][$cValue] : '') . ' /><label class="t" for="' . $key . $cValue . '_on"> ' . $cKey . '</label><br />';
-        }
-        $html .= '<br />';
-
-        return $html;
-    }
-
-    /**
-     * @param array<string, string|array<string>> $field
-     */
-    private function renderSelect(array $field, string $key, string $val): string
-    {
-        $html = '<div class="form-group">
-                    <label class="col-lg-3 control-label">' . $field['title'] . '</label>
-                        <div class="col-lg-9">
-                            <select name="' . $key . '">';
-
-        foreach ($field['choices'] as $cValue => $cKey) {
-            $html .= '<option value="' . (int) $cValue . '"'
-                . (($cValue == $val) ? ' selected' : '')
-                . '>'
-                . $cKey
-                . '</option>';
-        }
-
-        $html .= '</select>
-                <div class="help-block">' . $field['desc'] . '</div>
-            </div>
-        </div>';
-
-        return $html;
-    }
-
-    /**
-     * @param array<string, string|array<string>> $field
-     */
-    private function renderTextarea(array $field, string $key, string $val, bool $disabled): string
-    {
-        return '<textarea '
-            . ($disabled ? 'disabled="disabled"' : '')
-            . ' name="' . $key
-            . '" cols="' . $field['cols']
-            . '" rows="' . $field['rows']
-            . '">'
-            . htmlentities($val, ENT_COMPAT, 'UTF-8')
-            . '</textarea>';
-    }
-
-    /**
-     * @param array<string, string|array<string>> $field
-     */
-    private function renderTextField(array $field, string $key, string $val, bool $disabled): string
-    {
-        return '<input '
-            . ($disabled ? 'disabled="disabled"' : '')
-            . ' type="' . $field['type'] . '"'
-            . (isset($field['id']) ? ' id="' . $field['id'] . '"' : '')
-            . ' size="' . (isset($field['size']) ? (int) ($field['size']) : 5)
-            . '" name="' . $key
-            . '" value="' . ($field['type'] == 'password' ? '' : htmlentities($val, ENT_COMPAT, 'UTF-8'))
-            . '" />'
-            . (isset($field['next']) ? '&nbsp;' . $field['next'] : '');
-    }
-
-    /**
-     * @param array<string, string|array<string>> $field
-     */
-    private function renderThumb(array $field): string
-    {
-        return "<img src=\"{$field['thumb']['file']}\" alt=\"{$field['title']}\" title=\"{$field['title']}\" style=\"float:left;\">";
-    }
-}
diff --git a/classes/Twig/Form/UpgradeOptionsForm.php b/classes/Twig/Form/UpgradeOptionsForm.php
deleted file mode 100644
index 66f40767c..000000000
--- a/classes/Twig/Form/UpgradeOptionsForm.php
+++ /dev/null
@@ -1,101 +0,0 @@
-<?php
-
-/**
- * Copyright since 2007 PrestaShop SA and Contributors
- * PrestaShop is an International Registered Trademark & Property of PrestaShop SA
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Academic Free License 3.0 (AFL-3.0)
- * that is bundled with this package in the file LICENSE.md.
- * It is also available through the world-wide-web at this URL:
- * https://opensource.org/licenses/AFL-3.0
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@prestashop.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
- * versions in the future. If you wish to customize PrestaShop for your
- * needs please refer to https://devdocs.prestashop.com/ for more information.
- *
- * @author    PrestaShop SA and Contributors <contact@prestashop.com>
- * @copyright Since 2007 PrestaShop SA and Contributors
- * @license   https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
- */
-
-namespace PrestaShop\Module\AutoUpgrade\Twig\Form;
-
-use PrestaShop\Module\AutoUpgrade\Parameters\UpgradeConfiguration;
-use PrestaShop\Module\AutoUpgrade\UpgradeTools\Translator;
-
-class UpgradeOptionsForm
-{
-    /**
-     * @var array<string, array<string, string>>
-     */
-    private $fields;
-
-    /**
-     * @var Translator
-     */
-    private $translator;
-
-    /**
-     * @var FormRenderer
-     */
-    private $formRenderer;
-
-    public function __construct(Translator $translator, FormRenderer $formRenderer)
-    {
-        $this->translator = $translator;
-        $this->formRenderer = $formRenderer;
-
-        $this->fields = [
-            UpgradeConfiguration::PS_AUTOUP_CUSTOM_MOD_DESACT => [
-                'title' => $translator->trans('Disable non-native modules'),
-                'cast' => 'intval',
-                'validation' => 'isBool',
-                'type' => 'bool',
-                'desc' => $translator->trans(
-                        'As non-native modules can experience some compatibility issues, we recommend to disable them by default.') . '<br />' .
-                    $translator->trans('Keeping them enabled might prevent you from loading the "Modules" page properly after the upgrade.'),
-            ],
-            UpgradeConfiguration::PS_DISABLE_OVERRIDES => [
-                'title' => $translator->trans('Disable all overrides'),
-                'cast' => 'intval',
-                'validation' => 'isBool',
-                'type' => 'bool',
-                'desc' => $translator->trans('Enable or disable all classes and controllers overrides.'),
-            ],
-
-            UpgradeConfiguration::PS_AUTOUP_CHANGE_DEFAULT_THEME => [
-                'title' => $translator->trans('Switch to the default theme'),
-                'cast' => 'intval',
-                'validation' => 'isBool',
-                'defaultValue' => '0',
-                'type' => 'bool',
-                'desc' => $translator->trans('This will change your theme: your shop will then use the default theme of the version of PrestaShop you are upgrading to.'),
-            ],
-
-            UpgradeConfiguration::PS_AUTOUP_REGEN_EMAIL => [
-                'title' => $translator->trans('Regenerate the customized email templates'),
-                'cast' => 'intval',
-                'validation' => 'isBool',
-                'type' => 'bool',
-                'desc' => $translator->trans('This will not upgrade the default PrestaShop e-mails.') . '<br />'
-                    . $translator->trans('If you customized the default PrestaShop e-mail templates, switching off this option will keep your modifications.'),
-            ],
-        ];
-    }
-
-    public function render(): string
-    {
-        return $this->formRenderer->render(
-            'upgradeOptions',
-            $this->fields,
-            $this->translator->trans('Upgrade Options')
-        );
-    }
-}
diff --git a/classes/Twig/Form/index.php b/classes/Twig/Form/index.php
deleted file mode 100644
index 45df26c54..000000000
--- a/classes/Twig/Form/index.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-/**
- * Copyright since 2007 PrestaShop SA and Contributors
- * PrestaShop is an International Registered Trademark & Property of PrestaShop SA
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Academic Free License 3.0 (AFL-3.0)
- * that is bundled with this package in the file LICENSE.md.
- * It is also available through the world-wide-web at this URL:
- * https://opensource.org/licenses/AFL-3.0
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@prestashop.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
- * versions in the future. If you wish to customize PrestaShop for your
- * needs please refer to https://devdocs.prestashop.com/ for more information.
- *
- * @author    PrestaShop SA and Contributors <contact@prestashop.com>
- * @copyright Since 2007 PrestaShop SA and Contributors
- * @license   https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
- */
-header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
-header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
-
-header('Cache-Control: no-store, no-cache, must-revalidate');
-header('Cache-Control: post-check=0, pre-check=0', false);
-header('Pragma: no-cache');
-
-header('Location: ../');
-exit;
diff --git a/classes/UpgradeContainer.php b/classes/UpgradeContainer.php
index 967426fdd..bd100f640 100644
--- a/classes/UpgradeContainer.php
+++ b/classes/UpgradeContainer.php
@@ -71,6 +71,7 @@
 use PrestaShop\Module\AutoUpgrade\Xml\ChecksumCompare;
 use PrestaShop\Module\AutoUpgrade\Xml\FileLoader;
 use Symfony\Component\Dotenv\Dotenv;
+use Symfony\Component\Filesystem\Filesystem;
 use Twig\Environment;
 use Twig\Error\LoaderError;
 use Twig\Loader\FilesystemLoader;
@@ -862,6 +863,7 @@ public function getWorkspace(): Workspace
 
             $this->workspace = new Workspace(
                 $this->getTranslator(),
+                new Filesystem(),
                 $paths
             );
         }
diff --git a/classes/UpgradePage.php b/classes/UpgradePage.php
index 0fb63b77c..e69de29bb 100644
--- a/classes/UpgradePage.php
+++ b/classes/UpgradePage.php
@@ -1,322 +0,0 @@
-<?php
-
-/**
- * Copyright since 2007 PrestaShop SA and Contributors
- * PrestaShop is an International Registered Trademark & Property of PrestaShop SA
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Academic Free License 3.0 (AFL-3.0)
- * that is bundled with this package in the file LICENSE.md.
- * It is also available through the world-wide-web at this URL:
- * https://opensource.org/licenses/AFL-3.0
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@prestashop.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
- * versions in the future. If you wish to customize PrestaShop for your
- * needs please refer to https://devdocs.prestashop.com/ for more information.
- *
- * @author    PrestaShop SA and Contributors <contact@prestashop.com>
- * @copyright Since 2007 PrestaShop SA and Contributors
- * @license   https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
- */
-
-namespace PrestaShop\Module\AutoUpgrade;
-
-use PrestaShop\Module\AutoUpgrade\Backup\BackupFinder;
-use PrestaShop\Module\AutoUpgrade\Parameters\UpgradeConfiguration;
-use PrestaShop\Module\AutoUpgrade\Twig\Block\RollbackForm;
-use PrestaShop\Module\AutoUpgrade\Twig\Block\UpgradeButtonBlock;
-use PrestaShop\Module\AutoUpgrade\Twig\Block\UpgradeChecklist;
-use PrestaShop\Module\AutoUpgrade\Twig\Form\BackupOptionsForm;
-use PrestaShop\Module\AutoUpgrade\Twig\Form\FormRenderer;
-use PrestaShop\Module\AutoUpgrade\Twig\Form\UpgradeOptionsForm;
-use PrestaShop\Module\AutoUpgrade\UpgradeTools\Translator;
-use Twig\Environment;
-
-/**
- * Constructs the upgrade page.
- */
-class UpgradePage
-{
-    const TRANSLATION_DOMAIN = 'Modules.Autoupgrade.Admin';
-
-    /**
-     * @var Environment
-     */
-    private $twig;
-
-    /**
-     * @var UpgradeConfiguration
-     */
-    private $config;
-
-    /**
-     * @var Translator
-     */
-    private $translator;
-
-    /**
-     * @var UpgradeSelfCheck
-     */
-    private $upgradeSelfCheck;
-
-    /**
-     * @var string
-     */
-    private $autoupgradePath;
-
-    /**
-     * @var Upgrader
-     */
-    private $upgrader;
-
-    /**
-     * @var string
-     */
-    private $prodRootPath;
-
-    /**
-     * @var string
-     */
-    private $adminPath;
-
-    /**
-     * @var string
-     */
-    private $currentIndex;
-
-    /**
-     * @var string
-     */
-    private $token;
-
-    /**
-     * @var string
-     */
-    private $backupName;
-
-    /**
-     * @var string
-     */
-    private $downloadPath;
-
-    /**
-     * @var BackupFinder
-     */
-    private $backupFinder;
-
-    /**
-     * @param Environment $twig
-     */
-    public function __construct(
-        UpgradeConfiguration $config,
-        $twig,
-        Translator $translator,
-        UpgradeSelfCheck $upgradeSelfCheck,
-        Upgrader $upgrader,
-        BackupFinder $backupFinder,
-        string $autoupgradePath,
-        string $prodRootPath,
-        string $adminPath,
-        string $currentIndex,
-        string $token,
-        string $backupName,
-        string $downloadPath
-    ) {
-        $this->config = $config;
-        $this->translator = $translator;
-        $this->upgrader = $upgrader;
-        $this->upgradeSelfCheck = $upgradeSelfCheck;
-        $this->autoupgradePath = $autoupgradePath;
-        $this->prodRootPath = $prodRootPath;
-        $this->adminPath = $adminPath;
-        $this->currentIndex = $currentIndex;
-        $this->token = $token;
-        $this->backupName = $backupName;
-        $this->twig = $twig;
-        $this->downloadPath = $downloadPath;
-        $this->backupFinder = $backupFinder;
-    }
-
-    public function display(string $ajaxResult): string
-    {
-        $twig = $this->twig;
-        $translationDomain = self::TRANSLATION_DOMAIN;
-
-        $errMessageData = $this->getErrorMessage();
-        if (!empty($errMessageData)) {
-            return $twig
-                ->render('@ModuleAutoUpgrade/error.html.twig', $errMessageData);
-        }
-
-        $templateData = [
-            'psBaseUri' => __PS_BASE_URI__,
-            'translationDomain' => $translationDomain,
-            'jsParams' => $this->getJsParams($ajaxResult),
-            'rollbackForm' => $this->getRollbackFormVars(),
-            'backupOptions' => $this->getBackupOptionsForm(),
-            'upgradeOptions' => $this->getUpgradeOptionsForm(),
-            'currentIndex' => $this->currentIndex,
-            'token' => $this->token,
-        ];
-
-        $templateData = array_merge(
-            $templateData,
-            $this->getChecklistBlockVars(),
-            $this->getUpgradeButtonBlockVars(),
-            $this->getRollbackFormVars()
-        );
-
-        return $twig->render('@ModuleAutoUpgrade/main.html.twig', $templateData);
-    }
-
-    /**
-     * @return array<string, mixed>
-     */
-    private function getChecklistBlockVars(): array
-    {
-        return (new UpgradeChecklist(
-            $this->twig,
-            $this->upgradeSelfCheck,
-            $this->currentIndex,
-            $this->token
-        ))->getTemplateVars();
-    }
-
-    /**
-     * @return array<string, mixed>
-     */
-    private function getUpgradeButtonBlockVars(): array
-    {
-        return (new UpgradeButtonBlock(
-            $this->twig,
-            $this->translator,
-            $this->config,
-            $this->upgrader,
-            $this->upgradeSelfCheck,
-            $this->downloadPath,
-            $this->token
-        ))->getTemplateVars();
-    }
-
-    /**
-     * @return array<string, mixed>
-     */
-    private function getRollbackFormVars(): array
-    {
-        return (new RollbackForm($this->twig, $this->backupFinder))
-            ->getTemplateVars();
-    }
-
-    private function getBackupOptionsForm(): string
-    {
-        $formRenderer = new FormRenderer($this->config, $this->twig, $this->translator);
-
-        return (new BackupOptionsForm($this->translator, $formRenderer))
-            ->render();
-    }
-
-    private function getUpgradeOptionsForm(): string
-    {
-        $formRenderer = new FormRenderer($this->config, $this->twig, $this->translator);
-
-        return (new UpgradeOptionsForm($this->translator, $formRenderer))
-            ->render();
-    }
-
-    /**
-     * @return array<string, string>
-     */
-    private function getErrorMessage(): array
-    {
-        $translator = $this->translator;
-
-        // PrestaShop demo mode
-        if (defined('_PS_MODE_DEMO_') && true == _PS_MODE_DEMO_) {
-            return [
-                'message' => $translator->trans('This functionality has been disabled.'),
-            ];
-        }
-
-        if (!file_exists($this->autoupgradePath . DIRECTORY_SEPARATOR . 'ajax-upgradetab.php')) {
-            return [
-                'message' => $translator->trans(
-                    'ajax-upgradetab.php is missing. Please reinstall or reset the module.'
-                ),
-            ];
-        }
-
-        return [];
-    }
-
-    /**
-     * @param string $ajaxResult Json encoded response data
-     *
-     * @return array<string, string>
-     */
-    private function getJsParams(string $ajaxResult): array
-    {
-        // relative admin dir
-        $adminDir = trim(str_replace($this->prodRootPath, '', $this->adminPath), DIRECTORY_SEPARATOR);
-
-        $translator = $this->translator;
-
-        return [
-            'psBaseUri' => __PS_BASE_URI__,
-            '_PS_MODE_DEV_' => (defined('_PS_MODE_DEV_') && true == _PS_MODE_DEV_),
-            UpgradeConfiguration::PS_AUTOUP_BACKUP => $this->config->shouldBackupFilesAndDatabase(),
-            'adminDir' => $adminDir,
-            'adminUrl' => __PS_BASE_URI__ . $adminDir,
-            'token' => $this->token,
-            'firstTimeParams' => json_decode($ajaxResult),
-            'ajaxUpgradeTabExists' => file_exists($this->autoupgradePath . DIRECTORY_SEPARATOR . 'ajax-upgradetab.php'),
-            'currentIndex' => $this->currentIndex,
-            'tab' => 'AdminSelfUpgrade',
-            UpgradeConfiguration::CHANNEL => $this->config->getChannel(),
-            'autoupgrade' => [
-                'version' => $this->upgradeSelfCheck->getModuleVersion(),
-            ],
-            'translation' => [
-                'confirmDeleteBackup' => $translator->trans('Are you sure you want to delete this backup?'),
-                'delete' => $translator->trans('Delete'),
-                'updateInProgress' => $translator->trans('An update is currently in progress... Click "OK" to abort.'),
-                'upgradingPrestaShop' => $translator->trans('Upgrading PrestaShop'),
-                'upgradeComplete' => $translator->trans('Upgrade complete'),
-                'upgradeCompleteWithWarnings' => $translator->trans('Upgrade complete, but warning notifications has been found.'),
-                'startingRestore' => $translator->trans('Starting restoration...'),
-                'restoreComplete' => $translator->trans('Restoration complete.'),
-                'cannotDownloadFile' => $translator->trans('Your server cannot download the file. Please upload it first by ftp in your admin/autoupgrade directory'),
-                'jsonParseErrorForAction' => $translator->trans('Javascript error (parseJSON) detected for action '),
-                'endOfProcess' => $translator->trans('End of process'),
-                'processCancelledCheckForRestore' => $translator->trans('Operation canceled. Checking for restoration...'),
-                'confirmRestoreBackup' => $translator->trans('Do you want to restore %s?', [$this->backupName]),
-                'processCancelledWithError' => $translator->trans('Operation canceled. An error happened.'),
-                'missingAjaxUpgradeTab' => $translator->trans('ajax-upgradetab.php is missing. Please reinstall the module.'),
-                'clickToRefreshAndUseNewConfiguration' => $translator->trans('Click to refresh the page and use the new configuration'),
-                'errorDetectedDuring' => $translator->trans('Error detected during'),
-                'downloadTimeout' => $translator->trans('The request exceeded the max_time_limit. Please change your server configuration.'),
-                'seeOrHideList' => $translator->trans('See or hide the list'),
-                'coreFiles' => $translator->trans('Core file(s)'),
-                'mailFiles' => $translator->trans('Mail file(s)'),
-                'translationFiles' => $translator->trans('Translation file(s)'),
-                'linkAndMd5CannotBeEmpty' => $translator->trans('Link and MD5 hash cannot be empty'),
-                'needToEnterArchiveVersionNumber' => $translator->trans('You need to enter the version number associated with the archive.'),
-                'noArchiveSelected' => $translator->trans('No archive has been selected.'),
-                'needToEnterDirectoryVersionNumber' => $translator->trans('You need to enter the version number associated with the directory.'),
-                'confirmSkipBackup' => $translator->trans('Please confirm that you want to skip the backup.'),
-                'confirmPreserveFileOptions' => $translator->trans('Please confirm that you want to preserve file options.'),
-                'lessOptions' => $translator->trans('Less options'),
-                'moreOptions' => $translator->trans('More options (Expert mode)'),
-                'filesWillBeDeleted' => $translator->trans('These files will be deleted'),
-                'filesWillBeReplaced' => $translator->trans('These files will be replaced'),
-                'noXmlSelected' => $translator->trans('No XML file has been selected.'),
-                'noArchiveAndXmlSelected' => $translator->trans('No archive and no XML file have been selected.'),
-            ],
-        ];
-    }
-}
diff --git a/classes/UpgradeTools/TaskRepository.php b/classes/UpgradeTools/TaskRepository.php
index ecc4ed38c..0bba8ccbe 100644
--- a/classes/UpgradeTools/TaskRepository.php
+++ b/classes/UpgradeTools/TaskRepository.php
@@ -32,7 +32,6 @@
 use PrestaShop\Module\AutoUpgrade\Task\Backup\BackupDatabase;
 use PrestaShop\Module\AutoUpgrade\Task\Backup\BackupFiles;
 use PrestaShop\Module\AutoUpgrade\Task\Backup\BackupInitialization;
-use PrestaShop\Module\AutoUpgrade\Task\Miscellaneous\CompareReleases;
 use PrestaShop\Module\AutoUpgrade\Task\Miscellaneous\UpdateConfig;
 use PrestaShop\Module\AutoUpgrade\Task\NullTask;
 use PrestaShop\Module\AutoUpgrade\Task\Restore\RestoreComplete;
@@ -57,8 +56,6 @@ public static function get(string $step, UpgradeContainer $container): AbstractT
     {
         switch ($step) {
             // MISCELLANEOUS (upgrade configuration, checks etc.)
-            case TaskName::TASK_COMPARE_RELEASES:
-                return new CompareReleases($container);
             case TaskName::TASK_UPDATE_CONFIG:
                 return new UpdateConfig($container);
 
diff --git a/classes/Workspace.php b/classes/Workspace.php
index 9097c01ec..a7f6ed2c6 100644
--- a/classes/Workspace.php
+++ b/classes/Workspace.php
@@ -27,14 +27,13 @@
 
 namespace PrestaShop\Module\AutoUpgrade;
 
-use Exception;
 use PrestaShop\Module\AutoUpgrade\UpgradeTools\Translator;
+use Symfony\Component\Filesystem\Exception\IOException;
+use Symfony\Component\Filesystem\Filesystem;
 
 class Workspace
 {
-    /**
-     * @var Translator
-     */
+    /** @var Translator */
     private $translator;
 
     /**
@@ -42,12 +41,16 @@ class Workspace
      */
     private $paths;
 
+    /** @var Filesystem */
+    private $filesystem;
+
     /**
      * @param string[] $paths
      */
-    public function __construct(Translator $translator, array $paths)
+    public function __construct(Translator $translator, Filesystem $filesystem, array $paths)
     {
         $this->translator = $translator;
+        $this->filesystem = $filesystem;
         $this->paths = $paths;
     }
 
@@ -55,11 +58,56 @@ public function createFolders(): void
     {
         foreach ($this->paths as $path) {
             if (!file_exists($path) && !@mkdir($path)) {
-                throw new Exception($this->translator->trans('Unable to create directory %s', [$path]));
+                throw new IOException($this->translator->trans('Unable to create directory %s', [$path]));
             }
             if (!is_writable($path)) {
-                throw new Exception($this->translator->trans('Cannot write to the directory. Please ensure you have the necessary write permissions on "%s".', [$path]));
+                throw new IOException($this->translator->trans('Cannot write to the directory. Please ensure you have the necessary write permissions on "%s".', [$path]));
             }
+
+            $this->createPhpIndex($path);
+        }
+    }
+
+    /**
+     * @throws IOException
+     */
+    public function createPhpIndex(string $directoryPath): void
+    {
+        $filePath = $directoryPath . DIRECTORY_SEPARATOR . 'index.php';
+        if (!$this->filesystem->exists($filePath)) {
+            $this->filesystem->copy(_PS_ROOT_DIR_ . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'index.php', $filePath);
+        }
+    }
+
+    /**
+     * @throws IOException
+     */
+    public function createHtAccess(string $modulePath): void
+    {
+        $filePath = $modulePath . DIRECTORY_SEPARATOR . '.htaccess';
+
+        if (!$this->filesystem->exists($filePath)) {
+            $content = <<<HTACCESS
+<IfModule mod_rewrite.c>
+    RewriteEngine On
+
+    RewriteCond %{REQUEST_URI} ^.*/autoupgrade/logs/ [NC]
+    RewriteCond %{REQUEST_URI} !\.txt$ [NC]
+    RewriteRule ^ - [F]
+
+    RewriteRule ^ - [L]
+</IfModule>
+HTACCESS;
+            $this->filesystem->dumpFile($filePath, $content);
         }
     }
+
+    /**
+     * @throws IOException
+     */
+    public function init(string $modulePath): void
+    {
+        $this->createFolders();
+        $this->createHtAccess($modulePath);
+    }
 }
diff --git a/controllers/admin/AdminSelfUpgradeController.php b/controllers/admin/AdminSelfUpgradeController.php
index 38224a6da..1d5aca540 100644
--- a/controllers/admin/AdminSelfUpgradeController.php
+++ b/controllers/admin/AdminSelfUpgradeController.php
@@ -25,12 +25,9 @@
  * @license   https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
  */
 
-use PrestaShop\Module\AutoUpgrade\AjaxResponse;
-use PrestaShop\Module\AutoUpgrade\Parameters\UpgradeConfiguration;
 use PrestaShop\Module\AutoUpgrade\Router\Router;
 use PrestaShop\Module\AutoUpgrade\Tools14;
 use PrestaShop\Module\AutoUpgrade\UpgradeContainer;
-use PrestaShop\Module\AutoUpgrade\UpgradePage;
 use PrestaShop\Module\AutoUpgrade\VersionUtils;
 use Symfony\Component\HttpFoundation\Request;
 
@@ -48,15 +45,7 @@ class AdminSelfUpgradeController extends ModuleAdminController
      * Initialized in initPath().
      */
     /** @var string */
-    public $autoupgradePath;
-    /** @var string */
-    public $downloadPath;
-    /** @var string */
-    public $backupPath;
-    /** @var string */
-    public $latestPath;
-    /** @var string */
-    public $tmpPath;
+    private $autoupgradePath;
 
     /**
      * autoupgradeDir.
@@ -70,11 +59,6 @@ class AdminSelfUpgradeController extends ModuleAdminController
     /** @var string */
     public $adminDir = '';
 
-    /** @var array<string, mixed[]> */
-    public $_fieldsUpgradeOptions = [];
-    /** @var array<string, mixed[]> */
-    public $_fieldsBackupOptions = [];
-
     /**
      * @var UpgradeContainer
      */
@@ -188,66 +172,6 @@ public function __construct()
         }
     }
 
-    /**
-     * function to set configuration fields display.
-     *
-     * @return void
-     */
-    private function _setFields()
-    {
-        $this->_fieldsBackupOptions = [
-            UpgradeConfiguration::PS_AUTOUP_BACKUP => [
-                'title' => $this->trans('Back up my files and database'),
-                'cast' => 'intval',
-                'validation' => 'isBool',
-                'defaultValue' => '1',
-                'type' => 'bool',
-                'desc' => $this->trans('Automatically back up your database and files in order to restore your shop if needed. This is experimental: you should still perform your own manual backup for safety.'),
-            ],
-            UpgradeConfiguration::PS_AUTOUP_KEEP_IMAGES => [
-                'title' => $this->trans('Back up my images'),
-                'cast' => 'intval',
-                'validation' => 'isBool',
-                'defaultValue' => '1',
-                'type' => 'bool',
-                'desc' => $this->trans('To save time, you can decide not to back your images up. In any case, always make sure you did back them up manually.'),
-            ],
-        ];
-        $this->_fieldsUpgradeOptions = [
-            UpgradeConfiguration::PS_AUTOUP_CUSTOM_MOD_DESACT => [
-                'title' => $this->trans('Disable non-native modules'),
-                'cast' => 'intval',
-                'validation' => 'isBool',
-                'type' => 'bool',
-                'desc' => $this->trans('As non-native modules can experience some compatibility issues, we recommend to disable them by default.') . '<br />' .
-                    $this->trans('Keeping them enabled might prevent you from loading the "Modules" page properly after the upgrade.'),
-            ],
-            UpgradeConfiguration::PS_DISABLE_OVERRIDES => [
-                'title' => $this->trans('Disable all overrides'),
-                'cast' => 'intval',
-                'validation' => 'isBool',
-                'type' => 'bool',
-                'desc' => $this->trans('Enable or disable all classes and controllers overrides.'),
-            ],
-            UpgradeConfiguration::PS_AUTOUP_CHANGE_DEFAULT_THEME => [
-                'title' => $this->trans('Switch to the default theme'),
-                'cast' => 'intval',
-                'validation' => 'isBool',
-                'defaultValue' => '0',
-                'type' => 'bool',
-                'desc' => $this->trans('This will change your theme: your shop will then use the default theme of the version of PrestaShop you are upgrading to.'),
-            ],
-            UpgradeConfiguration::PS_AUTOUP_REGEN_EMAIL => [
-                'title' => $this->trans('Regenerate the customized email templates'),
-                'cast' => 'intval',
-                'validation' => 'isBool',
-                'type' => 'bool',
-                'desc' => $this->trans('This will not upgrade the default PrestaShop e-mails.') . '<br />'
-                    . $this->trans('If you customized the default PrestaShop e-mail templates, switching off this option will keep your modifications.'),
-            ],
-        ];
-    }
-
     /**
      * init to build informations we need.
      *
@@ -276,6 +200,7 @@ public function init()
         $this->prodRootDir = _PS_ROOT_DIR_;
         $this->adminDir = realpath(_PS_ADMIN_DIR_);
         $this->upgradeContainer = new UpgradeContainer($this->prodRootDir, $this->adminDir);
+        $this->autoupgradePath = $this->adminDir . DIRECTORY_SEPARATOR . $this->autoupgradeDir;
         if (!defined('__PS_BASE_URI__')) {
             // _PS_DIRECTORY_ replaces __PS_BASE_URI__ in 1.5
             if (defined('_PS_DIRECTORY_')) {
@@ -286,7 +211,8 @@ public function init()
         }
         // from $_POST or $_GET
         $this->action = empty($_REQUEST['action']) ? null : $_REQUEST['action'];
-        $this->initPath();
+        $moduleDir = $this->upgradeContainer->getProperty(UpgradeContainer::WORKSPACE_PATH);
+        $this->upgradeContainer->getWorkspace()->init($moduleDir);
 
         $this->upgradeContainer->getBackupState()->importFromArray(
             empty($_REQUEST['params']) ? [] : $_REQUEST['params']
@@ -302,25 +228,6 @@ public function init()
         $this->upgradeContainer->getFileStorage()->cleanAllBackupFiles();
         $this->upgradeContainer->getFileStorage()->cleanAllRestoreFiles();
 
-        // TODO: Can be removed when the old UI is not needed anymore
-        if (!$this->upgradeContainer->getUpdateState()->isInitialized()) {
-            $this->upgradeContainer->getPrestaShopConfiguration()->fillInUpdateConfiguration(
-                $this->upgradeContainer->getUpdateConfiguration()
-            );
-            $this->upgradeContainer->getUpdateState()->initDefault(
-                $this->upgradeContainer->getProperty(UpgradeContainer::PS_VERSION),
-                $this->upgradeContainer->getUpgrader(),
-                $this->upgradeContainer->getUpdateConfiguration()
-            );
-        }
-
-        // TODO: Can be removed when the old UI is not needed anymore
-        if (!$this->upgradeContainer->getBackupState()->isInitialized()) {
-            $this->upgradeContainer->getBackupState()->initDefault(
-                $this->upgradeContainer->getProperty(UpgradeContainer::PS_VERSION)
-            );
-        }
-
         // If you have defined this somewhere, you know what you do
         // load options from configuration if we're not in ajax mode
         if (!$this->ajax) {
@@ -339,105 +246,17 @@ public function init()
         }
     }
 
-    /**
-     * create some required directories if they does not exists.
-     *
-     * @return void
-     */
-    public function initPath()
-    {
-        $this->upgradeContainer->getWorkspace()->createFolders();
-
-        // set autoupgradePath, to be used in backupFiles and backupDb config values
-        $this->autoupgradePath = $this->adminDir . DIRECTORY_SEPARATOR . $this->autoupgradeDir;
-        $this->backupPath = $this->autoupgradePath . DIRECTORY_SEPARATOR . 'backup';
-        $this->downloadPath = $this->autoupgradePath . DIRECTORY_SEPARATOR . 'download';
-        $this->latestPath = $this->autoupgradePath . DIRECTORY_SEPARATOR . 'latest';
-        $this->tmpPath = $this->autoupgradePath . DIRECTORY_SEPARATOR . 'tmp';
-
-        if (!file_exists($this->backupPath . DIRECTORY_SEPARATOR . 'index.php')) {
-            if (!copy(_PS_ROOT_DIR_ . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'index.php', $this->backupPath . DIRECTORY_SEPARATOR . 'index.php')) {
-                $this->_errors[] = $this->trans('Unable to create file %s', [$this->backupPath . DIRECTORY_SEPARATOR . 'index.php']);
-            }
-        }
-
-        $tmp = "order deny,allow\ndeny from all";
-        if (!file_exists($this->backupPath . DIRECTORY_SEPARATOR . '.htaccess')) {
-            if (!file_put_contents($this->backupPath . DIRECTORY_SEPARATOR . '.htaccess', $tmp)) {
-                $this->_errors[] = $this->trans('Unable to create file %s', [$this->backupPath . DIRECTORY_SEPARATOR . '.htaccess']);
-            }
-        }
-    }
-
     public function postProcess()
     {
         if (!$this->isActualPHPVersionCompatible) {
             return true;
         }
 
-        $this->_setFields();
-
-        if (Tools14::isSubmit('customSubmitAutoUpgrade')) {
-            $this->handleCustomSubmitAutoUpgradeForm();
-        }
-
-        if (Tools14::isSubmit('deletebackup')) {
-            $this->handleDeletebackupForm();
-        }
         parent::postProcess();
 
         return true;
     }
 
-    /**
-     * @return void
-     */
-    private function handleDeletebackupForm()
-    {
-        $name = Tools14::getValue('name');
-        try {
-            $this->upgradeContainer->getBackupManager()->deleteBackup($name);
-            Tools14::redirectAdmin(self::$currentIndex . '&conf=1&token=' . Tools14::getValue('token'));
-        } catch (InvalidArgumentException $e) {
-            $this->_errors[] = $this->trans('Error when trying to delete backups %s', [$name]);
-        }
-    }
-
-    /**
-     * @return void
-     *
-     * @throws Exception
-     */
-    private function handleCustomSubmitAutoUpgradeForm()
-    {
-        $config_keys = array_keys(array_merge($this->_fieldsUpgradeOptions, $this->_fieldsBackupOptions));
-        $config = [];
-        foreach ($config_keys as $key) {
-            if (!isset($_POST[$key])) {
-                continue;
-            }
-            // The PS_DISABLE_OVERRIDES variable must only be updated on the database side
-            if ($key === UpgradeConfiguration::PS_DISABLE_OVERRIDES) {
-                UpgradeConfiguration::updatePSDisableOverrides((bool) $_POST[$key]);
-            } else {
-                $config[$key] = $_POST[$key];
-            }
-        }
-
-        $error = $this->upgradeContainer->getConfigurationValidator()->validate($config);
-        if (!empty($error)) {
-            throw new UnexpectedValueException(reset($error)['message']);
-        }
-
-        $UpConfig = $this->upgradeContainer->getUpdateConfiguration();
-        $UpConfig->merge($config);
-
-        if ($this->upgradeContainer->getConfigurationStorage()->save($UpConfig)
-        ) {
-            Tools14::redirectAdmin(self::$currentIndex . '&conf=6&token=' . Tools14::getValue('token'));
-        }
-    }
-
     /**
      * @return string
      */
@@ -466,57 +285,19 @@ public function initContent()
             return parent::initContent();
         }
 
-        if (Tools::getValue('new-ui')) {
-            $this->content = $this->upgradeContainer->getTwig()->render('@ModuleAutoUpgrade/module-script-variables.html.twig', [
-                'autoupgrade_variables' => $this->getScriptsVariables(),
-            ]);
-            $request = Request::createFromGlobals();
-            $this->addNewUIAssets($request);
-
-            $response = (new Router($this->upgradeContainer))->handle($request);
-
-            if ($response instanceof \Symfony\Component\HttpFoundation\Response) {
-                $response->send();
-                exit;
-            }
-            $this->content .= $response;
+        $this->content = $this->upgradeContainer->getTwig()->render('@ModuleAutoUpgrade/module-script-variables.html.twig', [
+            'autoupgrade_variables' => $this->getScriptsVariables(),
+        ]);
+        $request = Request::createFromGlobals();
+        $this->addUIAssets($request);
 
-            return parent::initContent();
-        }
+        $response = (new Router($this->upgradeContainer))->handle($request);
 
-        // update backup name
-        $backupFinder = $this->upgradeContainer->getBackupFinder();
-        $availableBackups = $backupFinder->getAvailableBackups();
-        $updateConfiguration = $this->upgradeContainer->getUpdateConfiguration();
-        if (!$updateConfiguration->shouldBackupFilesAndDatabase()
-            && !empty($availableBackups)
-            && !in_array($this->upgradeContainer->getBackupState()->getBackupName(), $availableBackups)
-        ) {
-            $this->upgradeContainer->getBackupState()->setBackupName(end($availableBackups));
+        if ($response instanceof \Symfony\Component\HttpFoundation\Response) {
+            $response->send();
+            exit;
         }
-
-        $upgrader = $this->upgradeContainer->getUpgrader();
-
-        $response = new AjaxResponse($this->upgradeContainer->getUpdateState(), $this->upgradeContainer->getLogger());
-        $this->content = (new UpgradePage(
-            $updateConfiguration,
-            $this->upgradeContainer->getTwig(),
-            $this->upgradeContainer->getTranslator(),
-            $this->upgradeContainer->getUpgradeSelfCheck(),
-            $upgrader,
-            $backupFinder,
-            $this->autoupgradePath,
-            $this->prodRootDir,
-            $this->adminDir,
-            self::$currentIndex,
-            $this->token,
-            $this->upgradeContainer->getBackupState()->getBackupName(),
-            $this->downloadPath
-        ))->display(
-            $response
-                ->setUpgradeConfiguration($updateConfiguration)
-                ->getJson()
-        );
+        $this->content .= $response;
 
         return parent::initContent();
     }
@@ -544,7 +325,7 @@ private function getScriptsVariables()
      *
      * @return void
      */
-    private function addNewUIAssets(Request $request)
+    private function addUIAssets(Request $request)
     {
         $assetsEnvironment = $this->upgradeContainer->getAssetsEnvironment();
         $assetsBaseUrl = $assetsEnvironment->getAssetsBaseUrl($request);
diff --git a/css/index.php b/css/index.php
deleted file mode 100644
index 45df26c54..000000000
--- a/css/index.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-/**
- * Copyright since 2007 PrestaShop SA and Contributors
- * PrestaShop is an International Registered Trademark & Property of PrestaShop SA
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Academic Free License 3.0 (AFL-3.0)
- * that is bundled with this package in the file LICENSE.md.
- * It is also available through the world-wide-web at this URL:
- * https://opensource.org/licenses/AFL-3.0
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@prestashop.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
- * versions in the future. If you wish to customize PrestaShop for your
- * needs please refer to https://devdocs.prestashop.com/ for more information.
- *
- * @author    PrestaShop SA and Contributors <contact@prestashop.com>
- * @copyright Since 2007 PrestaShop SA and Contributors
- * @license   https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
- */
-header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
-header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
-
-header('Cache-Control: no-store, no-cache, must-revalidate');
-header('Cache-Control: post-check=0, pre-check=0', false);
-header('Pragma: no-cache');
-
-header('Location: ../');
-exit;
diff --git a/css/styles.css b/css/styles.css
deleted file mode 100644
index 1604c3c04..000000000
--- a/css/styles.css
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * Copyright since 2007 PrestaShop SA and Contributors
- * PrestaShop is an International Registered Trademark & Property of PrestaShop SA
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Academic Free License 3.0 (AFL-3.0)
- * that is bundled with this package in the file LICENSE.md.
- * It is also available through the world-wide-web at this URL:
- * https://opensource.org/licenses/AFL-3.0
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@prestashop.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
- * versions in the future. If you wish to customize PrestaShop for your
- * needs please refer to https://devdocs.prestashop.com/ for more information.
- *
- * @author    PrestaShop SA and Contributors <contact@prestashop.com>
- * @copyright Since 2007 PrestaShop SA and Contributors
- * @license   https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
- */
-.upgradestep { margin-right: 5px;padding-left: 10px; padding-right: 5px;}
-.processing {border:2px outset gray;margin-top:1px;overflow: auto;}
-#infoStep {height:100px;}
-#infoError {height:100px;}
-#quickInfo {height:200px;}
-#errorDuringUpgrade {color: #CC0000}
-#checkPrestaShopFilesVersion, #checkPrestaShopModifiedFiles{margin-bottom:20px;}
-.changedFileList {margin-left:20px; padding-left:5px;}
-.changedNotice li{color:gray;}
-.changedImportant li{color:red;font-weight:bold}
-.upgradeDbError{background-color:#FEEFB3}
-.upgradeDbOk{background-color:#DFF2BF}
-.small_label{font-weight:normal;width:300px;float:none;text-align:left;padding:0}
-.ocu-feature-list{margin:0;padding:0;list-style:none}
-.ocu-feature-list li{background:url(../img/admin/enabled.gif) no-repeat; padding-left:20px;margin:0;}
-.label-small {width: 130px;}
-.margin-form-small {padding: 0 0 1em 130px;}
-.nextStep {font-weight: bold;}
-#diffList, #changedList {margin-top: 20px;}
-#autoupgradePhpWarningMainIcon {font-size: 3em;}
-#autoupgradePhpWarn .icon-stack-text {color: white;}
-.panel-heading {text-transform: uppercase;}
-.required {color: #CC0000}
diff --git a/js/dashboard.js b/js/dashboard.js
deleted file mode 100644
index bc79c771c..000000000
--- a/js/dashboard.js
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * Copyright since 2007 PrestaShop SA and Contributors
- * PrestaShop is an International Registered Trademark & Property of PrestaShop SA
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Academic Free License 3.0 (AFL-3.0)
- * that is bundled with this package in the file LICENSE.md.
- * It is also available through the world-wide-web at this URL:
- * https://opensource.org/licenses/AFL-3.0
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@prestashop.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
- * versions in the future. If you wish to customize PrestaShop for your
- * needs please refer to https://devdocs.prestashop.com/ for more information.
- *
- * @author    PrestaShop SA and Contributors <contact@prestashop.com>
- * @copyright Since 2007 PrestaShop SA and Contributors
- * @license   https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
- */
-$(document).ready(function () {
-  var autoUpgradePanel = $("#autoupgradePhpWarn");
-
-  $(".list-toolbar-btn", autoUpgradePanel).click(function (event) {
-    event.preventDefault();
-    autoUpgradePanel.fadeOut();
-
-    $.post($(this).attr("href"));
-  });
-});
diff --git a/js/index.php b/js/index.php
deleted file mode 100644
index 45df26c54..000000000
--- a/js/index.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-/**
- * Copyright since 2007 PrestaShop SA and Contributors
- * PrestaShop is an International Registered Trademark & Property of PrestaShop SA
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Academic Free License 3.0 (AFL-3.0)
- * that is bundled with this package in the file LICENSE.md.
- * It is also available through the world-wide-web at this URL:
- * https://opensource.org/licenses/AFL-3.0
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@prestashop.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
- * versions in the future. If you wish to customize PrestaShop for your
- * needs please refer to https://devdocs.prestashop.com/ for more information.
- *
- * @author    PrestaShop SA and Contributors <contact@prestashop.com>
- * @copyright Since 2007 PrestaShop SA and Contributors
- * @license   https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
- */
-header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
-header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
-
-header('Cache-Control: no-store, no-cache, must-revalidate');
-header('Cache-Control: post-check=0, pre-check=0', false);
-header('Pragma: no-cache');
-
-header('Location: ../');
-exit;
diff --git a/js/jquery-1.6.2.min.js b/js/jquery-1.6.2.min.js
deleted file mode 100755
index 48590ecb9..000000000
--- a/js/jquery-1.6.2.min.js
+++ /dev/null
@@ -1,18 +0,0 @@
-/*!
- * jQuery JavaScript Library v1.6.2
- * http://jquery.com/
- *
- * Copyright 2011, John Resig
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- * Copyright 2011, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- *
- * Date: Thu Jun 30 14:16:56 2011 -0400
- */
-(function(a,b){function cv(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cs(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cr(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cq(){cn=b}function cp(){setTimeout(cq,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bZ(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bY(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bC.test(a)?d(a,e):bY(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)bY(a+"["+e+"]",b[e],c,d);else d(a,b)}function bX(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bR,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bX(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bX(a,c,d,e,"*",g));return l}function bW(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bN),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bA(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bv:bw;if(d>0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bx(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bm(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(be,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bl(a){f.nodeName(a,"input")?bk(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bk)}function bk(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bj(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bi(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bh(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)f.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function bg(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function W(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(R.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;i<s.length;i++)g=s[i],g.origType.replace(x,"")===a.type?q.push(g.selector):s.splice(i--,1);e=f(a.target).closest(q,a.currentTarget);for(j=0,k=e.length;j<k;j++){m=e[j];for(i=0;i<s.length;i++){g=s[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,d=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,d=f(a.relatedTarget).closest(g.selector)[0],d&&f.contains(h,d)&&(d=h);(!d||d!==h)&&p.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=p.length;j<k;j++){e=p[j];if(c&&e.level>c)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z])/ig,x=function(a,b){return b.toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!A){A=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||D.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b){if(H)return H.call(b,a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=s.exec(a)||t.exec(a)||u.exec(a)||a.indexOf("compatible")<0&&v.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g="done fail isResolved isRejected promise then always pipe".split(" "),h=[].slice;f.extend({_Deferred:function(){var a=[],b,c,d,e={done:function(){if(!d){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=f.type(i),j==="array"?e.done.apply(e,i):j==="function"&&a.push(i);k&&e.resolveWith(k[0],k[1])}return this},resolveWith:function(e,f){if(!d&&!b&&!c){f=f||[],c=1;try{while(a[0])a.shift().apply(e,f)}finally{b=[e,f],c=0}}return this},resolve:function(){e.resolveWith(this,arguments);return this},isResolved:function(){return!!c||!!b},cancel:function(){d=1,a=[];return this}};return e},Deferred:function(a){var b=f._Deferred(),c=f._Deferred(),d;f.extend(b,{then:function(a,c){b.done(a).fail(c);return this},always:function(){return b.done.apply(b,arguments).fail.apply(this,arguments)},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,pipe:function(a,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[c,"reject"]},function(a,c){var e=c[0],g=c[1],h;f.isFunction(e)?b[a](function(){h=e.apply(this,arguments),h&&f.isFunction(h.promise)?h.promise().then(d.resolve,d.reject):d[g](h)}):b[a](d[g])})}).promise()},promise:function(a){if(a==null){if(d)return d;d=a={}}var c=g.length;while(c--)a[g[c]]=b[g[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){function i(a){return function(c){b[a]=arguments.length>1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c<d;c++)b[c]&&f.isFunction(b[c].promise)?b[c].promise().then(i(c),g.reject):--e;e||g.resolveWith(g,b)}else g!==a&&g.resolveWith(g,d?[a]:[]);return g.promise()}}),f.support=function(){var a=c.createElement("div"),b=c.documentElement,d,e,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;a.setAttribute("className","t"),a.innerHTML="   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0},m&&f.extend(p,{position:"absolute",left:-1e3,top:-1e3});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]||i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h<i;h++)g=e[h].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),k(this[0],g,d[g]))}}return d}if(typeof a=="object")return this.each(function(){f.data(this,a)});var j=a.split(".");j[1]=j[1]?"."+j[1]:"";if(c===b){d=this.triggerHandler("getData"+j[1]+"!",[j[0]]),d===b&&this.length&&(d=f.data(this[0],a),d=k(this[0],a,d));return d===b&&j[1]?this.data(j[0]):d}return this.each(function(){var b=f(this),d=[j[0],c];b.triggerHandler("setData"+j[1]+"!",d),f.data(this,a,c),b.triggerHandler("changeData"+j[1]+"!",d)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,c){a&&(c=(c||"fx")+"mark",f.data(a,c,(f.data(a,c,b,!0)||0)+1,!0))},_unmark:function(a,c,d){a!==!0&&(d=c,c=a,a=!1);if(c){d=d||"fx";var e=d+"mark",g=a?0:(f.data(c,e,b,!0)||1)-1;g?f.data(c,e,g,!0):(f.removeData(c,e,!0),m(c,d,"mark"))}},queue:function(a,c,d){if(a){c=(c||"fx")+"queue";var e=f.data(a,c,b,!0);d&&(!e||f.isArray(d)?e=f.data(a,c,f.makeArray(d),!0):e.push(d));return e||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e;d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),d.call(a,function(){f.dequeue(a,b)})),c.length||(f.removeData(a,b+"queue",!0),m(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){f.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f._Deferred(),!0))h++,l.done(m);m();return d.promise()}});var n=/[\n\t\r]/g,o=/\s+/,p=/\r/g,q=/^(?:button|input)$/i,r=/^(?:button|input|object|select|textarea)$/i,s=/^a(?:rea)?$/i,t=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,u=/\:|^on/,v,w;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(o);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(o);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(n," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(o);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if((" "+this[c].className+" ").replace(n," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h<i;h++){var j=e[h];if(j.selected&&(f.support.optDisabled?!j.disabled:j.getAttribute("disabled")===null)&&(!j.parentNode.disabled||!f.nodeName(j.parentNode,"optgroup"))){b=f(j).val();if(g)return b;d.push(b)}}if(g&&!d.length&&e.length)return f(e[c]).val();return d},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=w:v&&c!=="className"&&(f.nodeName(a,"form")||u.test(c))&&(i=v)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}},value:{get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return f.prop(a,c)?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.attrHooks.title=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))f.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=f.event.special[h]||{};for(j=e||0;j<p.length;j++){q=p[j];if(d.guid===q.guid){if(l||n.test(q.namespace))e==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(e!=null)break}}if(p.length===0||e!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&f.removeEvent(a,h,s.handle),g=null,delete t[h]}if(f.isEmptyObject(t)){var u=s.handle;u&&(u.elem=null),delete s.events,delete s.handle,f.isEmptyObject(s)&&f.removeData(a,b,!0)}}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){var h=c.type||c,i=[],j;h.indexOf("!")>=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.
-shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h<i;h++){var j=d[h];if(e||c.namespace_re.test(j.namespace)){c.handler=j.handler,c.data=j.data,c.handleObj=j;var k=j.handler.apply(this,g);k!==b&&(c.result=k,k===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[f.expando])return a;var d=a;a=f.Event(d);for(var e=this.props.length,g;e;)g=this.props[--e],a[g]=d[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=a.target.ownerDocument||c,i=h.documentElement,j=h.body;a.pageX=a.clientX+(i&&i.scrollLeft||j&&j.scrollLeft||0)-(i&&i.clientLeft||j&&j.clientLeft||0),a.pageY=a.clientY+(i&&i.scrollTop||j&&j.scrollTop||0)-(i&&i.clientTop||j&&j.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:f.proxy,special:{ready:{setup:f.bindReady,teardown:f.noop},live:{add:function(a){f.event.add(this,N(a.origType,a.selector),f.extend({},a,{handler:M,guid:a.handler.guid}))},remove:function(a){f.event.remove(this,N(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!this.preventDefault)return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?E:D):this.type=a,b&&f.extend(this,b),this.timeStamp=f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=E;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=E;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=E,this.stopPropagation()},isDefaultPrevented:D,isPropagationStopped:D,isImmediatePropagationStopped:D};var F=function(a){var b=a.relatedTarget,c=!1,d=a.type;a.type=a.data,b!==this&&(b&&(c=f.contains(this,b)),c||(f.event.handle.apply(this,arguments),a.type=d))},G=function(a){a.type=a.data,f.event.handle.apply(this,arguments)};f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={setup:function(c){f.event.add(this,b,c&&c.selector?G:F,a)},teardown:function(a){f.event.remove(this,b,a&&a.selector?G:F)}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(a,b){if(!f.nodeName(this,"form"))f.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=b.type;(c==="submit"||c==="image")&&f(b).closest("form").length&&K("submit",this,arguments)}),f.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=b.type;(c==="text"||c==="password")&&f(b).closest("form").length&&a.keyCode===13&&K("submit",this,arguments)});else return!1},teardown:function(a){f.event.remove(this,".specialSubmit")}});if(!f.support.changeBubbles){var H,I=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function(c){var d=c.target,e,g;if(!!y.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=I(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i<j;i++)f.event.add(this[i],a,g,d);return this}}),f.fn.extend({unbind:function(a,b){if(typeof a=="object"&&!a.preventDefault)for(var c in a)this.unbind(c,a[c]);else for(var d=0,e=this.length;d<e;d++)f.event.remove(this[d],a,b);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f.data(this,"lastToggle"+a.guid)||0)%d;f.data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var L={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};f.each(["live","die"],function(a,c){f.fn[c]=function(a,d,e,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:f(this.context);if(typeof a=="object"&&!a.preventDefault){for(var o in a)n[c](o,d,a[o],m);return this}if(c==="die"&&!a&&g&&g.charAt(0)==="."){n.unbind(g);return this}if(d===!1||f.isFunction(d))e=d||D,d=b;a=(a||"").split(" ");while((h=a[i++])!=null){j=x.exec(h),k="",j&&(k=j[0],h=h.replace(x,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,L[h]?(a.push(L[h]+k),h=h+k):h=(L[h]||h)+k;if(c==="live")for(var p=0,q=n.length;p<q;p++)f.event.add(n[p],"live."+N(h,m),{data:d,selector:m,handler:e,origType:h,origHandler:e,preType:l});else n.unbind("live."+N(h,m),e)}return this}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(!f)g=o=!0;else if(f===!0)continue}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("parentNode",b,f,a,e,c)},"~":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("previousSibling",b,f,a,e,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c<f;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocumentPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){if(a===b){g=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};f.find=k,f.expr=k.selectors,f.expr[":"]=f.expr.filters,f.unique=k.uniqueSort,f.text=k.getText,f.isXMLDoc=k.isXML,f.contains=k.contains}();var O=/Until$/,P=/^(?:parents|prevUntil|prevAll)/,Q=/,/,R=/^.[^:#\[\.,]*$/,S=Array.prototype.slice,T=f.expr.match.POS,U={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(W(this,a,!1),"not",a)},filter:function(a){return this.pushStack(W(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d<e;d++)i=a[d],j[i]||(j[i]=T.test(i)?f(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(l?l.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/<tbody/i,ba=/<|&#?\w+;/,bb=/<(?:script|object|embed|option|style)/i,bc=/checked\s*(?:[^=]|=\s*.checked.)/i,bd=/\/(java|ecma)script/i,be=/^\s*<!(?:\[CDATA\[|\-\-)/,bf={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};bf.optgroup=bf.option,bf.tbody=bf.tfoot=bf.colgroup=bf.caption=bf.thead,bf.th=bf.td,f.support.htmlSerialize||(bf._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!bf[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bc.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bg(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bm)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i;b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof a[0]=="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!bb.test(a[0])&&(f.support.checkClone||!bc.test(a[0]))&&(g=!0,h=f.fragments[a[0]],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[a[0]]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j
-)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bi(a,d),e=bj(a),g=bj(d);for(h=0;e[h];++h)bi(e[h],g[h])}if(b){bh(a,d);if(c){e=bj(a),g=bj(d);for(h=0;e[h];++h)bh(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!ba.test(k))k=b.createTextNode(k);else{k=k.replace(Z,"<$1></$2>");var l=($.exec(k)||["",""])[1].toLowerCase(),m=bf[l]||bf._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=_.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Y.test(k)&&o.insertBefore(b.createTextNode(Y.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bl(k[i]);else bl(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||bd.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.expando,g=f.event.special,h=f.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&f.noData[j.nodeName.toLowerCase()])continue;c=j[f.expando];if(c){b=d[c]&&d[c][e];if(b&&b.events){for(var k in b.events)g[k]?f.event.remove(j,k):f.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[f.expando]:j.removeAttribute&&j.removeAttribute(f.expando),delete d[c]}}}});var bn=/alpha\([^)]*\)/i,bo=/opacity=([^)]*)/,bp=/([A-Z]|^ms)/g,bq=/^-?\d+(?:px)?$/i,br=/^-?\d/,bs=/^[+\-]=/,bt=/[^+\-\.\de]+/g,bu={position:"absolute",visibility:"hidden",display:"block"},bv=["Left","Right"],bw=["Top","Bottom"],bx,by,bz;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bx(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d;if(h==="number"&&isNaN(d)||d==null)return;h==="string"&&bs.test(d)&&(d=+d.replace(bt,"")+parseFloat(f.css(a,c)),h="number"),h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bx)return bx(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bA(a,b,d);f.swap(a,bu,function(){e=bA(a,b,d)});return e}},set:function(a,b){if(!bq.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bo.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bn.test(g)?g.replace(bn,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bB=/%20/g,bC=/\[\]$/,bD=/\r?\n/g,bE=/#.*$/,bF=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bG=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bH=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bI=/^(?:GET|HEAD)$/,bJ=/^\/\//,bK=/\?/,bL=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bM=/^(?:select|textarea)/i,bN=/\s+/,bO=/([?&])_=[^&]*/,bP=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bQ=f.fn.load,bR={},bS={},bT,bU;try{bT=e.href}catch(bV){bT=c.createElement("a"),bT.href="",bT=bT.href}bU=bP.exec(bT.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bQ)return bQ.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bL,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bM.test(this.nodeName)||bG.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bD,"\r\n")}}):{name:b.name,value:c.replace(bD,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bT,isLocal:bH.test(bU[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bW(bR),ajaxTransport:bW(bS),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?bZ(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b$(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bF.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bE,"").replace(bJ,bU[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bN),d.crossDomain==null&&(r=bP.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bU[1]&&r[2]==bU[2]&&(r[3]||(r[1]==="http:"?80:443))==(bU[3]||(bU[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bX(bR,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bI.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bK.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bO,"$1_="+x);d.url=y+(y===d.url?(bK.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bX(bS,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bB,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn,co=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cr("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cs(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cr("hide",3),a,b,c);for(var d=0,e=this.length;d<e;d++)if(this[d].style){var g=f.css(this[d],"display");g!=="none"&&!f._data(this[d],"olddisplay")&&f._data(this[d],"olddisplay",g)}for(d=0;d<e;d++)this[d].style&&(this[d].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cr("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return this[e.queue===!1?"each":"queue"](function(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(f.support.inlineBlockNeedsLayout?(j=cs(this.nodeName),j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)):this.style.display="inline-block"))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)k=new f.fx(this,b,i),h=a[i],cj.test(h)?k[h==="toggle"?d?"show":"hide":h]():(l=ck.exec(h),m=k.cur(),l?(n=parseFloat(l[2]),o=l[3]||(f.cssNumber[i]?"":"px"),o!=="px"&&(f.style(this,i,(n||1)+o),m=(n||1)/k.cur()*m,f.style(this,i,m+o)),l[1]&&(n=(l[1]==="-="?-1:1)*n+m),k.custom(m,n,o)):k.custom(m,h,""));return!0})},stop:function(a,b){a&&this.queue([]),this.each(function(){var a=f.timers,c=a.length;b||f._unmark(!0,this);while(c--)a[c].elem===this&&(b&&a[c](!0),a.splice(c,1))}),b||this.dequeue();return this}}),f.each({slideDown:cr("show",1),slideUp:cr("hide",1),slideToggle:cr("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default,d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue!==!1?f.dequeue(this):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function h(a){return d.step(a)}var d=this,e=f.fx,g;this.startTime=cn||cp(),this.start=a,this.end=b,this.unit=c||this.unit||(f.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,h.elem=this.elem,h()&&f.timers.push(h)&&!cl&&(co?(cl=!0,g=function(){cl&&(co(g),e.tick())},co(g)):cl=setInterval(e.tick,e.interval))},show:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=cn||cp(),c=!0,d=this.elem,e=this.options,g,h;if(a||b>=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b<a.length;++b)a[b]()||a.splice(b--,1);a.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cl),cl=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var ct=/^t(?:able|d|h)$/i,cu=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cv(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);f.offset.initialize();var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.offset.doesNotAddBorder&&(!f.offset.doesAddBorderForTableAndCells||!ct.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={initialize:function(){var a=c.body,b=c.createElement("div"),d,e,g,h,i=parseFloat(f.css(a,"marginTop"))||0,j="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cu.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cu.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cv(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cv(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window);
\ No newline at end of file
diff --git a/js/jquery.xml2json.js b/js/jquery.xml2json.js
deleted file mode 100755
index b50c87b16..000000000
--- a/js/jquery.xml2json.js
+++ /dev/null
@@ -1 +0,0 @@
-eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}(';5(10.M)(w($){$.N({11:w(j,k){5(!j)t{};w B(d,e){5(!d)t y;6 f=\'\',2=y,E=y;6 g=d.x,12=l(d.O||d.P);6 h=d.v||d.F||\'\';5(d.G){5(d.G.7>0){$.Q(d.G,w(n,a){6 b=a.x,u=l(a.O||a.P);6 c=a.v||a.F||\'\';5(b==8){t}z 5(b==3||b==4||!u){5(c.13(/^\\s+$/)){t};f+=c.H(/^\\s+/,\'\').H(/\\s+$/,\'\')}z{2=2||{};5(2[u]){5(!2[u].7)2[u]=p(2[u]);2[u][2[u].7]=B(a,R);2[u].7=2[u].7}z{2[u]=B(a)}}})}};5(d.I){5(d.I.7>0){E={};2=2||{};$.Q(d.I,w(a,b){6 c=l(b.14),C=b.15;E[c]=C;5(2[c]){5(!2[c].7)2[c]=p(2[c]);2[c][2[c].7]=C;2[c].7=2[c].7}z{2[c]=C}})}};5(2){2=$.N((f!=\'\'?A J(f):{}),2||{});f=(2.v)?(D(2.v)==\'16\'?2.v:[2.v||\'\']).17([f]):f;5(f)2.v=f;f=\'\'};6 i=2||f;5(k){5(f)i={};f=i.v||f||\'\';5(f)i.v=f;5(!e)i=p(i)};t i};6 l=w(s){t J(s||\'\').H(/-/g,"18")};6 m=w(s){t(D s=="19")||J((s&&D s=="K")?s:\'\').1a(/^((-)?([0-9]*)((\\.{0,1})([0-9]+))?$)/)};6 p=w(o){5(!o.7)o=[o];o.7=o.7;t o};5(D j==\'K\')j=$.S(j);5(!j.x)t;5(j.x==3||j.x==4)t j.F;6 q=(j.x==9)?j.1b:j;6 r=B(q,R);j=y;q=y;t r},S:w(a){6 b;T{6 c=($.U.V)?A 1c("1d.1e"):A 1f();c.1g=W}X(e){Y A L("Z 1h 1i 1j 1k 1l")};T{5($.U.V)b=(c.1m(a))?c:W;z b=c.1n(a,"v/1o")}X(e){Y A L("L 1p Z K")};t b}})})(M);',62,88,'||obj|||if|var|length||||||||||||||||||||||return|cnn|text|function|nodeType|null|else|new|parseXML|atv|typeof|att|nodeValue|childNodes|replace|attributes|String|string|Error|jQuery|extend|localName|nodeName|each|true|text2xml|try|browser|msie|false|catch|throw|XML|window|xml2json|nn|match|name|value|object|concat|_|number|test|documentElement|ActiveXObject|Microsoft|XMLDOM|DOMParser|async|Parser|could|not|be|instantiated|loadXML|parseFromString|xml|parsing'.split('|'),0,{}))
diff --git a/js/sentry-8.2.1.min.js b/js/sentry-8.2.1.min.js
deleted file mode 100644
index 4076c494f..000000000
--- a/js/sentry-8.2.1.min.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! @sentry/browser 8.2.1 (bb2f1bc) | https://github.com/getsentry/sentry-javascript */
-var Sentry=function(t){const n=Object.prototype.toString;function e(t){switch(n.call(t)){case"[object Error]":case"[object Exception]":case"[object DOMException]":return!0;default:return l(t,Error)}}function r(t,e){return n.call(t)===`[object ${e}]`}function o(t){return r(t,"ErrorEvent")}function i(t){return r(t,"DOMError")}function s(t){return r(t,"String")}function c(t){return"object"==typeof t&&null!==t&&"__sentry_template_string__"in t&&"__sentry_template_values__"in t}function u(t){return null===t||c(t)||"object"!=typeof t&&"function"!=typeof t}function a(t){return r(t,"Object")}function f(t){return"undefined"!=typeof Event&&l(t,Event)}function h(t){return Boolean(t&&t.then&&"function"==typeof t.then)}function l(t,n){try{return t instanceof n}catch(t){return!1}}function d(t){return!("object"!=typeof t||null===t||!t.__isVue&&!t.t)}function p(t,n=0){return"string"!=typeof t||0===n||t.length<=n?t:`${t.slice(0,n)}...`}function m(t,n){if(!Array.isArray(t))return"";const e=[];for(let n=0;n<t.length;n++){const r=t[n];try{d(r)?e.push("[VueViewModel]"):e.push(String(r))}catch(t){e.push("[value cannot be serialized]")}}return e.join(n)}function y(t,n,e=!1){return!!s(t)&&(r(n,"RegExp")?n.test(t):!!s(n)&&(e?t===n:t.includes(n)))}function g(t,n=[],e=!1){return n.some((n=>y(t,n,e)))}function v(t,n,e=250,r,o,i,s){if(!(i.exception&&i.exception.values&&s&&l(s.originalException,Error)))return;const c=i.exception.values.length>0?i.exception.values[i.exception.values.length-1]:void 0;var u,a;c&&(i.exception.values=(u=b(t,n,o,s.originalException,r,i.exception.values,c,0),a=e,u.map((t=>(t.value&&(t.value=p(t.value,a)),t)))))}function b(t,n,e,r,o,i,s,c){if(i.length>=e+1)return i;let u=[...i];if(l(r[o],Error)){_(s,c);const i=t(n,r[o]),a=u.length;w(i,o,a,c),u=b(t,n,e,r[o],o,[i,...u],i,a)}return Array.isArray(r.errors)&&r.errors.forEach(((r,i)=>{if(l(r,Error)){_(s,c);const a=t(n,r),f=u.length;w(a,`errors[${i}]`,f,c),u=b(t,n,e,r,o,[a,...u],a,f)}})),u}function _(t,n){t.mechanism=t.mechanism||{type:"generic",handled:!0},t.mechanism={...t.mechanism,..."AggregateError"===t.type&&{is_exception_group:!0},exception_id:n}}function w(t,n,e,r){t.mechanism=t.mechanism||{type:"generic",handled:!0},t.mechanism={...t.mechanism,type:"chained",source:n,exception_id:e,parent_id:r}}const $=globalThis;function E(t,n,e){const r=e||$,o=r.__SENTRY__=r.__SENTRY__||{};return o[t]||(o[t]=n())}const S=$,x=80;function k(t,n={}){if(!t)return"<unknown>";try{let e=t;const r=5,o=[];let i=0,s=0;const c=" > ",u=c.length;let a;const f=Array.isArray(n)?n:n.keyAttrs,h=!Array.isArray(n)&&n.maxStringLength||x;for(;e&&i++<r&&(a=I(e,f),!("html"===a||i>1&&s+o.length*u+a.length>=h));)o.push(a),s+=a.length,e=e.parentNode;return o.reverse().join(c)}catch(t){return"<unknown>"}}function I(t,n){const e=t,r=[];let o,i,c,u,a;if(!e||!e.tagName)return"";if(S.HTMLElement&&e instanceof HTMLElement&&e.dataset){if(e.dataset.sentryComponent)return e.dataset.sentryComponent;if(e.dataset.sentryElement)return e.dataset.sentryElement}r.push(e.tagName.toLowerCase());const f=n&&n.length?n.filter((t=>e.getAttribute(t))).map((t=>[t,e.getAttribute(t)])):null;if(f&&f.length)f.forEach((t=>{r.push(`[${t[0]}="${t[1]}"]`)}));else if(e.id&&r.push(`#${e.id}`),o=e.className,o&&s(o))for(i=o.split(/\s+/),a=0;a<i.length;a++)r.push(`.${i[a]}`);const h=["aria-label","type","name","title","alt"];for(a=0;a<h.length;a++)c=h[a],u=e.getAttribute(c),u&&r.push(`[${c}="${u}"]`);return r.join("")}const j=["debug","info","warn","error","log","assert","trace"],T={};function O(t){if(!("console"in $))return t();const n=$.console,e={},r=Object.keys(T);r.forEach((t=>{const r=T[t];e[t]=n[t],n[t]=r}));try{return t()}finally{r.forEach((t=>{n[t]=e[t]}))}}const M=function(){let t=!1;const n={enable:()=>{t=!0},disable:()=>{t=!1},isEnabled:()=>t};return j.forEach((t=>{n[t]=()=>{}})),n}(),C=/^(?:(\w+):)\/\/(?:(\w+)(?::(\w+)?)?@)([\w.-]+)(?::(\d+))?\/(.+)/;function R(t,n=!1){const{host:e,path:r,pass:o,port:i,projectId:s,protocol:c,publicKey:u}=t;return`${c}://${u}${n&&o?`:${o}`:""}@${e}${i?`:${i}`:""}/${r?`${r}/`:r}${s}`}function D(t){return{protocol:t.protocol,publicKey:t.publicKey||"",pass:t.pass||"",host:t.host,port:t.port||"",path:t.path||"",projectId:t.projectId}}function A(t){const n="string"==typeof t?function(t){const n=C.exec(t);if(!n)return void O((()=>{console.error(`Invalid Sentry Dsn: ${t}`)}));const[e,r,o="",i,s="",c]=n.slice(1);let u="",a=c;const f=a.split("/");if(f.length>1&&(u=f.slice(0,-1).join("/"),a=f.pop()),a){const t=a.match(/^\d+/);t&&(a=t[0])}return D({host:i,pass:o,path:u,projectId:a,port:s,protocol:e,publicKey:r})}(t):D(t);if(n)return n}class N extends Error{constructor(t,n="warn"){super(t),this.message=t,this.name=new.target.prototype.constructor.name,Object.setPrototypeOf(this,new.target.prototype),this.logLevel=n}}function L(t,n,e){if(!(n in t))return;const r=t[n],o=e(r);"function"==typeof o&&U(o,r),t[n]=o}function P(t,n,e){try{Object.defineProperty(t,n,{value:e,writable:!0,configurable:!0})}catch(t){}}function U(t,n){try{const e=n.prototype||{};t.prototype=n.prototype=e,P(t,"__sentry_original__",n)}catch(t){}}function F(t){return t.__sentry_original__}function q(t){if(e(t))return{message:t.message,name:t.name,stack:t.stack,...H(t)};if(f(t)){const n={type:t.type,target:B(t.target),currentTarget:B(t.currentTarget),...H(t)};return"undefined"!=typeof CustomEvent&&l(t,CustomEvent)&&(n.detail=t.detail),n}return t}function B(t){try{return n=t,"undefined"!=typeof Element&&l(n,Element)?k(t):Object.prototype.toString.call(t)}catch(t){return"<unknown>"}var n}function H(t){if("object"==typeof t&&null!==t){const n={};for(const e in t)Object.prototype.hasOwnProperty.call(t,e)&&(n[e]=t[e]);return n}return{}}function W(t){return z(t,new Map)}function z(t,n){if(function(t){if(!a(t))return!1;try{const n=Object.getPrototypeOf(t).constructor.name;return!n||"Object"===n}catch(t){return!0}}(t)){const e=n.get(t);if(void 0!==e)return e;const r={};n.set(t,r);for(const e of Object.keys(t))void 0!==t[e]&&(r[e]=z(t[e],n));return r}if(Array.isArray(t)){const e=n.get(t);if(void 0!==e)return e;const r=[];return n.set(t,r),t.forEach((t=>{r.push(z(t,n))})),r}return t}const X=50,J="?",G=/\(error: (.*)\)/,K=/captureMessage|captureException/;function V(...t){const n=t.sort(((t,n)=>t[0]-n[0])).map((t=>t[1]));return(t,e=0,r=0)=>{const o=[],i=t.split("\n");for(let t=e;t<i.length;t++){const e=i[t];if(e.length>1024)continue;const s=G.test(e)?e.replace(G,"$1"):e;if(!s.match(/\S*Error: /)){for(const t of n){const n=t(s);if(n){o.push(n);break}}if(o.length>=X+r)break}}return function(t){if(!t.length)return[];const n=Array.from(t);/sentryWrapped/.test(n[n.length-1].function||"")&&n.pop();n.reverse(),K.test(n[n.length-1].function||"")&&(n.pop(),K.test(n[n.length-1].function||"")&&n.pop());return n.slice(0,X).map((t=>({...t,filename:t.filename||n[n.length-1].filename,function:t.function||J})))}(o.slice(r))}}const Y="<anonymous>";function Q(t){try{return t&&"function"==typeof t&&t.name||Y}catch(t){return Y}}const Z={},tt={};function nt(t,n){Z[t]=Z[t]||[],Z[t].push(n)}function et(t,n){tt[t]||(n(),tt[t]=!0)}function rt(t,n){const e=t&&Z[t];if(e)for(const t of e)try{t(n)}catch(t){}}function ot(){"console"in $&&j.forEach((function(t){t in $.console&&L($.console,t,(function(n){return T[t]=n,function(...n){rt("console",{args:n,level:t});const e=T[t];e&&e.apply($.console,n)}}))}))}const it=$;function st(t){return t&&/^function fetch\(\)\s+\{\s+\[native code\]\s+\}$/.test(t.toString())}function ct(){if("string"==typeof EdgeRuntime)return!0;if(!function(){if(!("fetch"in it))return!1;try{return new Headers,new Request("http://www.example.com"),new Response,!0}catch(t){return!1}}())return!1;if(st(it.fetch))return!0;let t=!1;const n=it.document;if(n&&"function"==typeof n.createElement)try{const e=n.createElement("iframe");e.hidden=!0,n.head.appendChild(e),e.contentWindow&&e.contentWindow.fetch&&(t=st(e.contentWindow.fetch)),n.head.removeChild(e)}catch(t){}return t}const ut=1e3;function at(){return Date.now()/ut}const ft=function(){const{performance:t}=$;if(!t||!t.now)return at;const n=Date.now()-t.now(),e=null==t.timeOrigin?n:t.timeOrigin;return()=>(e+t.now())/ut}();function ht(){ct()&&L($,"fetch",(function(t){return function(...n){const{method:e,url:r}=function(t){if(0===t.length)return{method:"GET",url:""};if(2===t.length){const[n,e]=t;return{url:dt(n),method:lt(e,"method")?String(e.method).toUpperCase():"GET"}}const n=t[0];return{url:dt(n),method:lt(n,"method")?String(n.method).toUpperCase():"GET"}}(n),o={args:n,fetchData:{method:e,url:r},startTimestamp:1e3*ft()};return rt("fetch",{...o}),t.apply($,n).then((t=>(rt("fetch",{...o,endTimestamp:1e3*ft(),response:t}),t)),(t=>{throw rt("fetch",{...o,endTimestamp:1e3*ft(),error:t}),t}))}}))}function lt(t,n){return!!t&&"object"==typeof t&&!!t[n]}function dt(t){return"string"==typeof t?t:t?lt(t,"url")?t.url:t.toString?t.toString():"":""}(()=>{const{performance:t}=$;if(!t||!t.now)return;const n=36e5,e=t.now(),r=Date.now(),o=t.timeOrigin?Math.abs(t.timeOrigin+e-r):n,i=o<n,s=t.timing&&t.timing.navigationStart,c="number"==typeof s?Math.abs(s+e-r):n;(i||c<n)&&(o<=c&&t.timeOrigin)})();let pt=null;function mt(){pt=$.onerror,$.onerror=function(t,n,e,r,o){return rt("error",{column:r,error:o,line:e,msg:t,url:n}),!(!pt||pt.__SENTRY_LOADER__)&&pt.apply(this,arguments)},$.onerror.__SENTRY_INSTRUMENTED__=!0}let yt=null;function gt(){yt=$.onunhandledrejection,$.onunhandledrejection=function(t){return rt("unhandledrejection",t),!(yt&&!yt.__SENTRY_LOADER__)||yt.apply(this,arguments)},$.onunhandledrejection.__SENTRY_INSTRUMENTED__=!0}function vt(){const t=$,n=t.crypto||t.msCrypto;let e=()=>16*Math.random();try{if(n&&n.randomUUID)return n.randomUUID().replace(/-/g,"");n&&n.getRandomValues&&(e=()=>{const t=new Uint8Array(1);return n.getRandomValues(t),t[0]})}catch(t){}return([1e7]+1e3+4e3+8e3+1e11).replace(/[018]/g,(t=>(t^(15&e())>>t/4).toString(16)))}function bt(t){return t.exception&&t.exception.values?t.exception.values[0]:void 0}function _t(t){const{message:n,event_id:e}=t;if(n)return n;const r=bt(t);return r?r.type&&r.value?`${r.type}: ${r.value}`:r.type||r.value||e||"<unknown>":e||"<unknown>"}function wt(t,n,e){const r=t.exception=t.exception||{},o=r.values=r.values||[],i=o[0]=o[0]||{};i.value||(i.value=n||""),i.type||(i.type=e||"Error")}function $t(t,n){const e=bt(t);if(!e)return;const r=e.mechanism;if(e.mechanism={type:"generic",handled:!0,...r,...n},n&&"data"in n){const t={...r&&r.data,...n.data};e.mechanism.data=t}}function Et(t){if(t&&t.__sentry_captured__)return!0;try{P(t,"__sentry_captured__",!0)}catch(t){}return!1}function St(t){return Array.isArray(t)?t:[t]}function xt(t,n=100,e=1/0){try{return It("",t,n,e)}catch(t){return{ERROR:`**non-serializable** (${t})`}}}function kt(t,n=3,e=102400){const r=xt(t,n);return o=r,function(t){return~-encodeURI(t).split(/%..|./).length}(JSON.stringify(o))>e?kt(t,n-1,e):r;var o}function It(t,n,e=1/0,r=1/0,o=function(){const t="function"==typeof WeakSet,n=t?new WeakSet:[];return[function(e){if(t)return!!n.has(e)||(n.add(e),!1);for(let t=0;t<n.length;t++)if(n[t]===e)return!0;return n.push(e),!1},function(e){if(t)n.delete(e);else for(let t=0;t<n.length;t++)if(n[t]===e){n.splice(t,1);break}}]}()){const[i,s]=o;if(null==n||["number","boolean","string"].includes(typeof n)&&!Number.isNaN(n))return n;const c=function(t,n){try{if("domain"===t&&n&&"object"==typeof n&&n.o)return"[Domain]";if("domainEmitter"===t)return"[DomainEmitter]";if("undefined"!=typeof global&&n===global)return"[Global]";if("undefined"!=typeof window&&n===window)return"[Window]";if("undefined"!=typeof document&&n===document)return"[Document]";if(d(n))return"[VueViewModel]";if(a(e=n)&&"nativeEvent"in e&&"preventDefault"in e&&"stopPropagation"in e)return"[SyntheticEvent]";if("number"==typeof n&&n!=n)return"[NaN]";if("function"==typeof n)return`[Function: ${Q(n)}]`;if("symbol"==typeof n)return`[${String(n)}]`;if("bigint"==typeof n)return`[BigInt: ${String(n)}]`;const r=function(t){const n=Object.getPrototypeOf(t);return n?n.constructor.name:"null prototype"}(n);return/^HTML(\w*)Element$/.test(r)?`[HTMLElement: ${r}]`:`[object ${r}]`}catch(t){return`**non-serializable** (${t})`}var e}(t,n);if(!c.startsWith("[object "))return c;if(n.__sentry_skip_normalization__)return n;const u="number"==typeof n.__sentry_override_normalization_depth__?n.__sentry_override_normalization_depth__:e;if(0===u)return c.replace("object ","");if(i(n))return"[Circular ~]";const f=n;if(f&&"function"==typeof f.toJSON)try{return It("",f.toJSON(),u-1,r,o)}catch(t){}const h=Array.isArray(n)?[]:{};let l=0;const p=q(n);for(const t in p){if(!Object.prototype.hasOwnProperty.call(p,t))continue;if(l>=r){h[t]="[MaxProperties ~]";break}const n=p[t];h[t]=It(t,n,u-1,r,o),l++}return s(n),h}var jt;function Tt(t){return new Mt((n=>{n(t)}))}function Ot(t){return new Mt(((n,e)=>{e(t)}))}!function(t){t[t.PENDING=0]="PENDING";t[t.RESOLVED=1]="RESOLVED";t[t.REJECTED=2]="REJECTED"}(jt||(jt={}));class Mt{constructor(t){Mt.prototype.__init.call(this),Mt.prototype.__init2.call(this),Mt.prototype.__init3.call(this),Mt.prototype.__init4.call(this),this.i=jt.PENDING,this.u=[];try{t(this.h,this.l)}catch(t){this.l(t)}}then(t,n){return new Mt(((e,r)=>{this.u.push([!1,n=>{if(t)try{e(t(n))}catch(t){r(t)}else e(n)},t=>{if(n)try{e(n(t))}catch(t){r(t)}else r(t)}]),this.p()}))}catch(t){return this.then((t=>t),t)}finally(t){return new Mt(((n,e)=>{let r,o;return this.then((n=>{o=!1,r=n,t&&t()}),(n=>{o=!0,r=n,t&&t()})).then((()=>{o?e(r):n(r)}))}))}__init(){this.h=t=>{this.m(jt.RESOLVED,t)}}__init2(){this.l=t=>{this.m(jt.REJECTED,t)}}__init3(){this.m=(t,n)=>{this.i===jt.PENDING&&(h(n)?n.then(this.h,this.l):(this.i=t,this.v=n,this.p()))}}__init4(){this.p=()=>{if(this.i===jt.PENDING)return;const t=this.u.slice();this.u=[],t.forEach((t=>{t[0]||(this.i===jt.RESOLVED&&t[1](this.v),this.i===jt.REJECTED&&t[2](this.v),t[0]=!0)}))}}}function Ct(t){const n=[];function e(t){return n.splice(n.indexOf(t),1)[0]}return{$:n,add:function(r){if(!(void 0===t||n.length<t))return Ot(new N("Not adding Promise because buffer limit was reached."));const o=r();return-1===n.indexOf(o)&&n.push(o),o.then((()=>e(o))).then(null,(()=>e(o).then(null,(()=>{})))),o},drain:function(t){return new Mt(((e,r)=>{let o=n.length;if(!o)return e(!0);const i=setTimeout((()=>{t&&t>0&&e(!1)}),t);n.forEach((t=>{Tt(t).then((()=>{--o||(clearTimeout(i),e(!0))}),r)}))}))}}}function Rt(t){if(!t)return{};const n=t.match(/^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/);if(!n)return{};const e=n[6]||"",r=n[8]||"";return{host:n[4],path:n[5],protocol:n[2],search:e,hash:r,relative:n[5]+e+r}}const Dt=["fatal","error","warning","log","info","debug"];function At(t){return"warn"===t?"warning":Dt.includes(t)?t:"log"}const Nt="sentry-",Lt=/^sentry-/,Pt=8192;function Ut(t){const n=function(t){if(!t||!s(t)&&!Array.isArray(t))return;if(Array.isArray(t))return t.reduce(((t,n)=>{const e=qt(n);for(const n of Object.keys(e))t[n]=e[n];return t}),{});return qt(t)}(t);if(!n)return;const e=Object.entries(n).reduce(((t,[n,e])=>{if(n.match(Lt)){t[n.slice(Nt.length)]=e}return t}),{});return Object.keys(e).length>0?e:void 0}function Ft(t){if(!t)return;return function(t){if(0===Object.keys(t).length)return;return Object.entries(t).reduce(((t,[n,e],r)=>{const o=`${encodeURIComponent(n)}=${encodeURIComponent(e)}`,i=0===r?o:`${t},${o}`;return i.length>Pt?t:i}),"")}(Object.entries(t).reduce(((t,[n,e])=>(e&&(t[`${Nt}${n}`]=e),t)),{}))}function qt(t){return t.split(",").map((t=>t.split("=").map((t=>decodeURIComponent(t.trim()))))).reduce(((t,[n,e])=>(t[n]=e,t)),{})}const Bt=new RegExp("^[ \\t]*([0-9a-f]{32})?-?([0-9a-f]{16})?-?([01])?[ \\t]*$");function Ht(t,n){const e=function(t){if(!t)return;const n=t.match(Bt);if(!n)return;let e;return"1"===n[3]?e=!0:"0"===n[3]&&(e=!1),{traceId:n[1],parentSampled:e,parentSpanId:n[2]}}(t),r=Ut(n),{traceId:o,parentSpanId:i,parentSampled:s}=e||{};return e?{traceId:o||vt(),parentSpanId:i||vt().substring(16),spanId:vt().substring(16),sampled:s,dsc:r||{}}:{traceId:o||vt(),spanId:vt().substring(16)}}function Wt(t,n=[]){return[t,n]}function zt(t,n){const[e,r]=t;return[e,[...r,n]]}function Xt(t,n){const e=t[1];for(const t of e){if(n(t,t[0].type))return!0}return!1}function Jt(t){return $.__SENTRY__&&$.__SENTRY__.encodePolyfill?$.__SENTRY__.encodePolyfill(t):(new TextEncoder).encode(t)}function Gt(t){const[n,e]=t;let r=JSON.stringify(n);function o(t){"string"==typeof r?r="string"==typeof t?r+t:[Jt(r),t]:r.push("string"==typeof t?Jt(t):t)}for(const t of e){const[n,e]=t;if(o(`\n${JSON.stringify(n)}\n`),"string"==typeof e||e instanceof Uint8Array)o(e);else{let t;try{t=JSON.stringify(e)}catch(n){t=JSON.stringify(xt(e))}o(t)}}return"string"==typeof r?r:function(t){const n=t.reduce(((t,n)=>t+n.length),0),e=new Uint8Array(n);let r=0;for(const n of t)e.set(n,r),r+=n.length;return e}(r)}function Kt(t){const n="string"==typeof t.data?Jt(t.data):t.data;return[W({type:"attachment",length:n.length,filename:t.filename,content_type:t.contentType,attachment_type:t.attachmentType}),n]}const Vt={session:"session",sessions:"session",attachment:"attachment",transaction:"transaction",event:"error",client_report:"internal",user_report:"default",profile:"profile",replay_event:"replay",replay_recording:"replay",check_in:"monitor",feedback:"feedback",span:"span",statsd:"metric_bucket"};function Yt(t){return Vt[t]}function Qt(t){if(!t||!t.sdk)return;const{name:n,version:e}=t.sdk;return{name:n,version:e}}const Zt=6e4;function tn(t,{statusCode:n,headers:e},r=Date.now()){const o={...t},i=e&&e["x-sentry-rate-limits"],s=e&&e["retry-after"];if(i)for(const t of i.trim().split(",")){const[n,e,,,i]=t.split(":",5),s=parseInt(n,10),c=1e3*(isNaN(s)?60:s);if(e)for(const t of e.split(";"))"metric_bucket"===t&&i&&!i.split(";").includes("custom")||(o[t]=r+c);else o.all=r+c}else s?o.all=r+function(t,n=Date.now()){const e=parseInt(`${t}`,10);if(!isNaN(e))return 1e3*e;const r=Date.parse(`${t}`);return isNaN(r)?Zt:r-n}(s,r):429===n&&(o.all=r+6e4);return o}const nn=$;const en=()=>{},rn=["attachTo","createWidget","remove"];function on(t){return O((()=>{console.warn("You are using feedbackIntegration() even though this bundle does not include feedback.")})),{name:"Feedback",...rn.reduce(((t,n)=>(t[n]=en,t)),{})}}const sn=["start","stop","flush"];function cn(){return un($),$}function un(t){return t.__SENTRY__||(t.__SENTRY__={extensions:{}}),t.__SENTRY__}function an(t){const n=ft(),e={sid:vt(),init:!0,timestamp:n,started:n,duration:0,status:"ok",errors:0,ignoreDuration:!1,toJSON:()=>function(t){return W({sid:`${t.sid}`,init:t.init,started:new Date(1e3*t.started).toISOString(),timestamp:new Date(1e3*t.timestamp).toISOString(),status:t.status,errors:t.errors,did:"number"==typeof t.did||"string"==typeof t.did?`${t.did}`:void 0,duration:t.duration,abnormal_mechanism:t.abnormal_mechanism,attrs:{release:t.release,environment:t.environment,ip_address:t.ipAddress,user_agent:t.userAgent}})}(e)};return t&&fn(e,t),e}function fn(t,n={}){if(n.user&&(!t.ipAddress&&n.user.ip_address&&(t.ipAddress=n.user.ip_address),t.did||n.did||(t.did=n.user.id||n.user.email||n.user.username)),t.timestamp=n.timestamp||ft(),n.abnormal_mechanism&&(t.abnormal_mechanism=n.abnormal_mechanism),n.ignoreDuration&&(t.ignoreDuration=n.ignoreDuration),n.sid&&(t.sid=32===n.sid.length?n.sid:vt()),void 0!==n.init&&(t.init=n.init),!t.did&&n.did&&(t.did=`${n.did}`),"number"==typeof n.started&&(t.started=n.started),t.ignoreDuration)t.duration=void 0;else if("number"==typeof n.duration)t.duration=n.duration;else{const n=t.timestamp-t.started;t.duration=n>=0?n:0}n.release&&(t.release=n.release),n.environment&&(t.environment=n.environment),!t.ipAddress&&n.ipAddress&&(t.ipAddress=n.ipAddress),!t.userAgent&&n.userAgent&&(t.userAgent=n.userAgent),"number"==typeof n.errors&&(t.errors=n.errors),n.status&&(t.status=n.status)}const hn="_sentrySpan";function ln(t,n){n?P(t,hn,n):delete t[hn]}function dn(t){return t[hn]}class pn{constructor(){this._=!1,this.S=[],this.k=[],this.I=[],this.j=[],this.T={},this.O={},this.M={},this.C={},this.R={},this.D=yn()}clone(){const t=new pn;return t.I=[...this.I],t.O={...this.O},t.M={...this.M},t.C={...this.C},t.T=this.T,t.A=this.A,t.N=this.N,t.L=this.L,t.P=this.P,t.k=[...this.k],t.U=this.U,t.j=[...this.j],t.R={...this.R},t.D={...this.D},t.F=this.F,t.q=this.q,ln(t,dn(this)),t}setClient(t){this.F=t}setLastEventId(t){this.q=t}getClient(){return this.F}lastEventId(){return this.q}addScopeListener(t){this.S.push(t)}addEventProcessor(t){return this.k.push(t),this}setUser(t){return this.T=t||{email:void 0,id:void 0,ip_address:void 0,username:void 0},this.N&&fn(this.N,{user:t}),this.B(),this}getUser(){return this.T}getRequestSession(){return this.U}setRequestSession(t){return this.U=t,this}setTags(t){return this.O={...this.O,...t},this.B(),this}setTag(t,n){return this.O={...this.O,[t]:n},this.B(),this}setExtras(t){return this.M={...this.M,...t},this.B(),this}setExtra(t,n){return this.M={...this.M,[t]:n},this.B(),this}setFingerprint(t){return this.P=t,this.B(),this}setLevel(t){return this.A=t,this.B(),this}setTransactionName(t){return this.L=t,this.B(),this}setContext(t,n){return null===n?delete this.C[t]:this.C[t]=n,this.B(),this}setSession(t){return t?this.N=t:delete this.N,this.B(),this}getSession(){return this.N}update(t){if(!t)return this;const n="function"==typeof t?t(this):t,[e,r]=n instanceof mn?[n.getScopeData(),n.getRequestSession()]:a(n)?[t,t.requestSession]:[],{tags:o,extra:i,user:s,contexts:c,level:u,fingerprint:f=[],propagationContext:h}=e||{};return this.O={...this.O,...o},this.M={...this.M,...i},this.C={...this.C,...c},s&&Object.keys(s).length&&(this.T=s),u&&(this.A=u),f.length&&(this.P=f),h&&(this.D=h),r&&(this.U=r),this}clear(){return this.I=[],this.O={},this.M={},this.T={},this.C={},this.A=void 0,this.L=void 0,this.P=void 0,this.U=void 0,this.N=void 0,ln(this,void 0),this.j=[],this.D=yn(),this.B(),this}addBreadcrumb(t,n){const e="number"==typeof n?n:100;if(e<=0)return this;const r={timestamp:at(),...t},o=this.I;return o.push(r),this.I=o.length>e?o.slice(-e):o,this.B(),this}getLastBreadcrumb(){return this.I[this.I.length-1]}clearBreadcrumbs(){return this.I=[],this.B(),this}addAttachment(t){return this.j.push(t),this}clearAttachments(){return this.j=[],this}getScopeData(){return{breadcrumbs:this.I,attachments:this.j,contexts:this.C,tags:this.O,extra:this.M,user:this.T,level:this.A,fingerprint:this.P||[],eventProcessors:this.k,propagationContext:this.D,sdkProcessingMetadata:this.R,transactionName:this.L,span:dn(this)}}setSDKProcessingMetadata(t){return this.R={...this.R,...t},this}setPropagationContext(t){return this.D=t,this}getPropagationContext(){return this.D}captureException(t,n){const e=n&&n.event_id?n.event_id:vt();if(!this.F)return M.warn("No client configured on scope - will not capture exception!"),e;const r=new Error("Sentry syntheticException");return this.F.captureException(t,{originalException:t,syntheticException:r,...n,event_id:e},this),e}captureMessage(t,n,e){const r=e&&e.event_id?e.event_id:vt();if(!this.F)return M.warn("No client configured on scope - will not capture message!"),r;const o=new Error(t);return this.F.captureMessage(t,n,{originalException:t,syntheticException:o,...e,event_id:r},this),r}captureEvent(t,n){const e=n&&n.event_id?n.event_id:vt();return this.F?(this.F.captureEvent(t,{...n,event_id:e},this),e):(M.warn("No client configured on scope - will not capture event!"),e)}B(){this._||(this._=!0,this.S.forEach((t=>{t(this)})),this._=!1)}}const mn=pn;function yn(){return{traceId:vt(),spanId:vt().substring(16)}}function gn(){return In(cn()).getCurrentScope()}function vn(){return In(cn()).getIsolationScope()}function bn(){return E("globalScope",(()=>new mn))}function _n(...t){const n=In(cn());if(2===t.length){const[e,r]=t;return e?n.withSetScope(e,r):n.withScope(r)}return n.withScope(t[0])}function wn(){return gn().getClient()}class $n{constructor(t,n){let e,r;e=t||new mn,r=n||new mn,this.H=[{scope:e}],this.W=r}withScope(t){const n=this.X();let e;try{e=t(n)}catch(t){throw this.J(),t}return h(e)?e.then((t=>(this.J(),t)),(t=>{throw this.J(),t})):(this.J(),e)}getClient(){return this.getStackTop().client}getScope(){return this.getStackTop().scope}getIsolationScope(){return this.W}getStack(){return this.H}getStackTop(){return this.H[this.H.length-1]}X(){const t=this.getScope().clone();return this.getStack().push({client:this.getClient(),scope:t}),t}J(){return!(this.getStack().length<=1)&&!!this.getStack().pop()}}function En(){const t=un(cn());return t.hub||(t.hub=new $n(E("defaultCurrentScope",(()=>new mn)),E("defaultIsolationScope",(()=>new mn)))),t.hub}function Sn(t){return En().withScope(t)}function xn(t,n){const e=En();return e.withScope((()=>(e.getStackTop().scope=t,n(t))))}function kn(t){return En().withScope((()=>t(En().getIsolationScope())))}function In(t){const n=un(t);return n.acs?n.acs:{withIsolationScope:kn,withScope:Sn,withSetScope:xn,withSetIsolationScope:(t,n)=>kn(n),getCurrentScope:()=>En().getScope(),getIsolationScope:()=>En().getIsolationScope()}}let jn;function Tn(t){return jn?jn.get(t):void 0}function On(t){const n=Tn(t);if(!n)return;const e={};for(const[,[t,r]]of n)e[t]||(e[t]=[]),e[t].push(W(r));return e}const Mn="sentry.source",Cn="sentry.sample_rate",Rn="sentry.op",Dn="sentry.origin",An=0,Nn=1,Ln="production",Pn="_frozenDsc";function Un(t,n){const e=n.getOptions(),{publicKey:r}=n.getDsn()||{},o=W({environment:e.environment||Ln,release:e.release,public_key:r,trace_id:t});return n.emit("createDsc",o),o}function Fn(t){const n=wn();if(!n)return{};const e=Un(zn(t).trace_id||"",n),r=Kn(t);if(!r)return e;const o=r[Pn];if(o)return o;const i=zn(r),s=i.data||{},c=s[Cn];null!=c&&(e.sample_rate=`${c}`);const u=s[Mn];return u&&"url"!==u&&(e.transaction=i.description),e.sampled=String(Xn(r)),n.emit("createDsc",e),e}const qn=1;function Bn(t){const{spanId:n,traceId:e}=t.spanContext(),{parent_span_id:r}=zn(t);return W({parent_span_id:r,span_id:n,trace_id:e})}function Hn(t){return"number"==typeof t?Wn(t):Array.isArray(t)?t[0]+t[1]/1e9:t instanceof Date?Wn(t.getTime()):ft()}function Wn(t){return t>9999999999?t/1e3:t}function zn(t){if(function(t){return"function"==typeof t.getSpanJSON}(t))return t.getSpanJSON();try{const{spanId:n,traceId:e}=t.spanContext();if(function(t){const n=t;return!!(n.attributes&&n.startTime&&n.name&&n.endTime&&n.status)}(t)){const{attributes:r,startTime:o,name:i,endTime:s,parentSpanId:c,status:u}=t;return W({span_id:n,trace_id:e,data:r,description:i,parent_span_id:c,start_timestamp:Hn(o),timestamp:Hn(s)||void 0,status:Jn(u),op:r[Rn],origin:r[Dn],G:On(t)})}return{span_id:n,trace_id:e}}catch(t){return{}}}function Xn(t){const{traceFlags:n}=t.spanContext();return n===qn}function Jn(t){if(t&&t.code!==An)return t.code===Nn?"ok":t.message||"unknown_error"}const Gn="_sentryRootSpan";function Kn(t){return t[Gn]||t}function Vn(){const t=In(cn());return t.getActiveSpan?t.getActiveSpan():dn(gn())}function Yn(t,n,e,r,o,i){const s=Vn();s&&function(t,n,e,r,o,i,s){const c=Tn(t)||new Map,u=`${n}:${e}@${o}`,a=c.get(s);if(a){const[,t]=a;c.set(s,[u,{min:Math.min(t.min,r),max:Math.max(t.max,r),count:t.count+=1,sum:t.sum+=r,tags:t.tags}])}else c.set(s,[u,{min:r,max:r,count:1,sum:r,tags:i}]);jn||(jn=new WeakMap),jn.set(t,c)}(s,t,n,e,r,o,i)}function Qn(t,n,e,r){const o=Qt(e),i=t.type&&"replay_event"!==t.type?t.type:"event";!function(t,n){n&&(t.sdk=t.sdk||{},t.sdk.name=t.sdk.name||n.name,t.sdk.version=t.sdk.version||n.version,t.sdk.integrations=[...t.sdk.integrations||[],...n.integrations||[]],t.sdk.packages=[...t.sdk.packages||[],...n.packages||[]])}(t,e&&e.sdk);const s=function(t,n,e,r){const o=t.sdkProcessingMetadata&&t.sdkProcessingMetadata.dynamicSamplingContext;return{event_id:t.event_id,sent_at:(new Date).toISOString(),...n&&{sdk:n},...!!e&&r&&{dsn:R(r)},...o&&{trace:W({...o})}}}(t,o,r,n);delete t.sdkProcessingMetadata;return Wt(s,[[{type:i},t]])}function Zn(t,n,e,r=0){return new Mt(((o,i)=>{const s=t[r];if(null===n||"function"!=typeof s)o(n);else{const c=s({...n},e);h(c)?c.then((n=>Zn(t,n,e,r+1).then(o))).then(null,i):Zn(t,c,e,r+1).then(o).then(null,i)}}))}function te(t,n){const{fingerprint:e,span:r,breadcrumbs:o,sdkProcessingMetadata:i}=n;!function(t,n){const{extra:e,tags:r,user:o,contexts:i,level:s,transactionName:c}=n,u=W(e);u&&Object.keys(u).length&&(t.extra={...u,...t.extra});const a=W(r);a&&Object.keys(a).length&&(t.tags={...a,...t.tags});const f=W(o);f&&Object.keys(f).length&&(t.user={...f,...t.user});const h=W(i);h&&Object.keys(h).length&&(t.contexts={...h,...t.contexts});s&&(t.level=s);c&&"transaction"!==t.type&&(t.transaction=c)}(t,n),r&&function(t,n){t.contexts={trace:Bn(n),...t.contexts},t.sdkProcessingMetadata={dynamicSamplingContext:Fn(n),...t.sdkProcessingMetadata};const e=Kn(n),r=zn(e).description;r&&!t.transaction&&"transaction"===t.type&&(t.transaction=r)}(t,r),function(t,n){t.fingerprint=t.fingerprint?St(t.fingerprint):[],n&&(t.fingerprint=t.fingerprint.concat(n));t.fingerprint&&!t.fingerprint.length&&delete t.fingerprint}(t,e),function(t,n){const e=[...t.breadcrumbs||[],...n];t.breadcrumbs=e.length?e:void 0}(t,o),function(t,n){t.sdkProcessingMetadata={...t.sdkProcessingMetadata,...n}}(t,i)}function ne(t,n){const{extra:e,tags:r,user:o,contexts:i,level:s,sdkProcessingMetadata:c,breadcrumbs:u,fingerprint:a,eventProcessors:f,attachments:h,propagationContext:l,transactionName:d,span:p}=n;ee(t,"extra",e),ee(t,"tags",r),ee(t,"user",o),ee(t,"contexts",i),ee(t,"sdkProcessingMetadata",c),s&&(t.level=s),d&&(t.transactionName=d),p&&(t.span=p),u.length&&(t.breadcrumbs=[...t.breadcrumbs,...u]),a.length&&(t.fingerprint=[...t.fingerprint,...a]),f.length&&(t.eventProcessors=[...t.eventProcessors,...f]),h.length&&(t.attachments=[...t.attachments,...h]),t.propagationContext={...t.propagationContext,...l}}function ee(t,n,e){if(e&&Object.keys(e).length){t[n]={...t[n]};for(const r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[n][r]=e[r])}}function re(t,n,e,r,o,i){const{normalizeDepth:s=3,normalizeMaxBreadth:c=1e3}=t,u={...n,event_id:n.event_id||e.event_id||vt(),timestamp:n.timestamp||at()},a=e.integrations||t.integrations.map((t=>t.name));!function(t,n){const{environment:e,release:r,dist:o,maxValueLength:i=250}=n;"environment"in t||(t.environment="environment"in n?e:Ln);void 0===t.release&&void 0!==r&&(t.release=r);void 0===t.dist&&void 0!==o&&(t.dist=o);t.message&&(t.message=p(t.message,i));const s=t.exception&&t.exception.values&&t.exception.values[0];s&&s.value&&(s.value=p(s.value,i));const c=t.request;c&&c.url&&(c.url=p(c.url,i))}(u,t),function(t,n){n.length>0&&(t.sdk=t.sdk||{},t.sdk.integrations=[...t.sdk.integrations||[],...n])}(u,a),void 0===n.type&&function(t,n){const e=$._sentryDebugIds;if(!e)return;let r;const o=oe.get(n);o?r=o:(r=new Map,oe.set(n,r));const i=Object.keys(e).reduce(((t,o)=>{let i;const s=r.get(o);s?i=s:(i=n(o),r.set(o,i));for(let n=i.length-1;n>=0;n--){const r=i[n];if(r.filename){t[r.filename]=e[o];break}}return t}),{});try{t.exception.values.forEach((t=>{t.stacktrace.frames.forEach((t=>{t.filename&&(t.debug_id=i[t.filename])}))}))}catch(t){}}(u,t.stackParser);const f=function(t,n){if(!n)return t;const e=t?t.clone():new mn;return e.update(n),e}(r,e.captureContext);e.mechanism&&$t(u,e.mechanism);const h=o?o.getEventProcessors():[],l=bn().getScopeData();if(i){ne(l,i.getScopeData())}if(f){ne(l,f.getScopeData())}const d=[...e.attachments||[],...l.attachments];d.length&&(e.attachments=d),te(u,l);return Zn([...h,...l.eventProcessors],u,e).then((t=>(t&&function(t){const n={};try{t.exception.values.forEach((t=>{t.stacktrace.frames.forEach((t=>{t.debug_id&&(t.abs_path?n[t.abs_path]=t.debug_id:t.filename&&(n[t.filename]=t.debug_id),delete t.debug_id)}))}))}catch(t){}if(0===Object.keys(n).length)return;t.debug_meta=t.debug_meta||{},t.debug_meta.images=t.debug_meta.images||[];const e=t.debug_meta.images;Object.keys(n).forEach((t=>{e.push({type:"sourcemap",code_file:t,debug_id:n[t]})}))}(t),"number"==typeof s&&s>0?function(t,n,e){if(!t)return null;const r={...t,...t.breadcrumbs&&{breadcrumbs:t.breadcrumbs.map((t=>({...t,...t.data&&{data:xt(t.data,n,e)}})))},...t.user&&{user:xt(t.user,n,e)},...t.contexts&&{contexts:xt(t.contexts,n,e)},...t.extra&&{extra:xt(t.extra,n,e)}};t.contexts&&t.contexts.trace&&r.contexts&&(r.contexts.trace=t.contexts.trace,t.contexts.trace.data&&(r.contexts.trace.data=xt(t.contexts.trace.data,n,e)));t.spans&&(r.spans=t.spans.map((t=>({...t,...t.data&&{data:xt(t.data,n,e)}}))));return r}(t,s,c):t)))}const oe=new WeakMap;function ie(t){if(t)return function(t){return t instanceof mn||"function"==typeof t}(t)||function(t){return Object.keys(t).some((t=>se.includes(t)))}(t)?{captureContext:t}:t}const se=["user","level","extra","contexts","tags","fingerprint","requestSession","propagationContext"];function captureException(t,n){return gn().captureException(t,ie(n))}function ce(t,n){return gn().captureEvent(t,n)}function ue(t,n){vn().setContext(t,n)}function ae(t){vn().setExtras(t)}function fe(t,n){vn().setExtra(t,n)}function he(t){vn().setTags(t)}function le(t,n){vn().setTag(t,n)}function de(t){vn().setUser(t)}function pe(){return vn().lastEventId()}function me(t){const n=wn(),e=vn(),r=gn(),{release:o,environment:i=Ln}=n&&n.getOptions()||{},{userAgent:s}=$.navigator||{},c=an({release:o,environment:i,user:r.getUser()||e.getUser(),...s&&{userAgent:s},...t}),u=e.getSession();return u&&"ok"===u.status&&fn(u,{status:"exited"}),ye(),e.setSession(c),r.setSession(c),c}function ye(){const t=vn(),n=gn(),e=n.getSession()||t.getSession();e&&function(t,n){let e={};n?e={status:n}:"ok"===t.status&&(e={status:"exited"}),fn(t,e)}(e),ge(),t.setSession(),n.setSession()}function ge(){const t=vn(),n=gn(),e=wn(),r=n.getSession()||t.getSession();r&&e&&e.captureSession(r)}function ve(t=!1){t?ye():ge()}const be="7";function _e(t){const n=t.protocol?`${t.protocol}:`:"",e=t.port?`:${t.port}`:"";return`${n}//${t.host}${e}${t.path?`/${t.path}`:""}/api/`}function we(t,n){return e={sentry_key:t.publicKey,sentry_version:be,...n&&{sentry_client:`${n.name}/${n.version}`}},Object.keys(e).map((t=>`${encodeURIComponent(t)}=${encodeURIComponent(e[t])}`)).join("&");var e}function $e(t,n,e){return n||`${function(t){return`${_e(t)}${t.projectId}/envelope/`}(t)}?${we(t,e)}`}const Ee=[];function Se(t){const n=t.defaultIntegrations||[],e=t.integrations;let r;n.forEach((t=>{t.isDefaultInstance=!0})),r=Array.isArray(e)?[...n,...e]:"function"==typeof e?St(e(n)):n;const o=function(t){const n={};return t.forEach((t=>{const{name:e}=t,r=n[e];r&&!r.isDefaultInstance&&t.isDefaultInstance||(n[e]=t)})),Object.keys(n).map((t=>n[t]))}(r),i=function(t,n){for(let e=0;e<t.length;e++)if(!0===n(t[e]))return e;return-1}(o,(t=>"Debug"===t.name));if(-1!==i){const[t]=o.splice(i,1);o.push(t)}return o}function xe(t,n){for(const e of n)e&&e.afterAllSetup&&e.afterAllSetup(t)}function ke(t,n,e){if(!e[n.name]){if(e[n.name]=n,-1===Ee.indexOf(n.name)&&"function"==typeof n.setupOnce&&(n.setupOnce(),Ee.push(n.name)),n.setup&&"function"==typeof n.setup&&n.setup(t),"function"==typeof n.preprocessEvent){const e=n.preprocessEvent.bind(n);t.on("preprocessEvent",((n,r)=>e(n,r,t)))}if("function"==typeof n.processEvent){const e=n.processEvent.bind(n),r=Object.assign(((n,r)=>e(n,r,t)),{id:n.name});t.addEventProcessor(r)}}}class Ie{constructor(t){if(this.K=t,this._integrations={},this.V=0,this.Y={},this.Z={},this.k=[],t.dsn&&(this.tt=A(t.dsn)),this.tt){const n=$e(this.tt,t.tunnel,t.nt?t.nt.sdk:void 0);this.et=t.transport({tunnel:this.K.tunnel,recordDroppedEvent:this.recordDroppedEvent.bind(this),...t.transportOptions,url:n})}}captureException(t,n,e){const r=vt();if(Et(t))return r;const o={event_id:r,...n};return this.rt(this.eventFromException(t,o).then((t=>this.ot(t,o,e)))),o.event_id}captureMessage(t,n,e,r){const o={event_id:vt(),...e},i=c(t)?t:String(t),s=u(t)?this.eventFromMessage(i,n,o):this.eventFromException(t,o);return this.rt(s.then((t=>this.ot(t,o,r)))),o.event_id}captureEvent(t,n,e){const r=vt();if(n&&n.originalException&&Et(n.originalException))return r;const o={event_id:r,...n},i=(t.sdkProcessingMetadata||{}).capturedSpanScope;return this.rt(this.ot(t,o,i||e)),o.event_id}captureSession(t){"string"!=typeof t.release||(this.sendSession(t),fn(t,{init:!1}))}getDsn(){return this.tt}getOptions(){return this.K}getSdkMetadata(){return this.K.nt}getTransport(){return this.et}flush(t){const n=this.et;return n?(this.emit("flush"),this.it(t).then((e=>n.flush(t).then((t=>e&&t))))):Tt(!0)}close(t){return this.flush(t).then((t=>(this.getOptions().enabled=!1,this.emit("close"),t)))}getEventProcessors(){return this.k}addEventProcessor(t){this.k.push(t)}init(){this.st()&&this.ct()}getIntegrationByName(t){return this._integrations[t]}addIntegration(t){const n=this._integrations[t.name];ke(this,t,this._integrations),n||xe(this,[t])}sendEvent(t,n={}){this.emit("beforeSendEvent",t,n);let e=Qn(t,this.tt,this.K.nt,this.K.tunnel);for(const t of n.attachments||[])e=zt(e,Kt(t));const r=this.sendEnvelope(e);r&&r.then((n=>this.emit("afterSendEvent",t,n)),null)}sendSession(t){const n=function(t,n,e,r){const o=Qt(e);return Wt({sent_at:(new Date).toISOString(),...o&&{sdk:o},...!!r&&n&&{dsn:R(n)}},["aggregates"in t?[{type:"sessions"},t]:[{type:"session"},t.toJSON()]])}(t,this.tt,this.K.nt,this.K.tunnel);this.sendEnvelope(n)}recordDroppedEvent(t,n,e){if(this.K.sendClientReports){const e=`${t}:${n}`;this.Y[e]=this.Y[e]+1||1}}on(t,n){this.Z[t]||(this.Z[t]=[]),this.Z[t].push(n)}emit(t,...n){this.Z[t]&&this.Z[t].forEach((t=>t(...n)))}sendEnvelope(t){return this.emit("beforeEnvelope",t),this.st()&&this.et?this.et.send(t).then(null,(t=>t)):Tt({})}ct(){const{integrations:t}=this.K;this._integrations=function(t,n){const e={};return n.forEach((n=>{n&&ke(t,n,e)})),e}(this,t),xe(this,t)}ut(t,n){let e=!1,r=!1;const o=n.exception&&n.exception.values;if(o){r=!0;for(const t of o){const n=t.mechanism;if(n&&!1===n.handled){e=!0;break}}}const i="ok"===t.status;(i&&0===t.errors||i&&e)&&(fn(t,{...e&&{status:"crashed"},errors:t.errors||Number(r||e)}),this.captureSession(t))}it(t){return new Mt((n=>{let e=0;const r=setInterval((()=>{0==this.V?(clearInterval(r),n(!0)):(e+=1,t&&e>=t&&(clearInterval(r),n(!1)))}),1)}))}st(){return!1!==this.getOptions().enabled&&void 0!==this.et}ft(t,n,e,r=vn()){const o=this.getOptions(),i=Object.keys(this._integrations);return!n.integrations&&i.length>0&&(n.integrations=i),this.emit("preprocessEvent",t,n),t.type||r.setLastEventId(t.event_id||n.event_id),re(o,t,n,e,this,r).then((t=>{if(null===t)return t;const n={...r.getPropagationContext(),...e?e.getPropagationContext():void 0};if(!(t.contexts&&t.contexts.trace)&&n){const{traceId:e,spanId:r,parentSpanId:o,dsc:i}=n;t.contexts={trace:W({trace_id:e,span_id:r,parent_span_id:o}),...t.contexts};const s=i||Un(e,this);t.sdkProcessingMetadata={dynamicSamplingContext:s,...t.sdkProcessingMetadata}}return t}))}ot(t,n={},e){return this.ht(t,n,e).then((t=>t.event_id),(t=>{}))}ht(t,n,e){const r=this.getOptions(),{sampleRate:o}=r,i=Te(t),s=je(t),c=t.type||"error",u=`before send for type \`${c}\``,f=void 0===o?void 0:function(t){if("boolean"==typeof t)return Number(t);const n="string"==typeof t?parseFloat(t):t;return"number"!=typeof n||isNaN(n)||n<0||n>1?void 0:n}(o);if(s&&"number"==typeof f&&Math.random()>f)return this.recordDroppedEvent("sample_rate","error",t),Ot(new N(`Discarding event because it's not included in the random sample (sampling rate = ${o})`,"log"));const l="replay_event"===c?"replay":c,d=(t.sdkProcessingMetadata||{}).capturedSpanIsolationScope;return this.ft(t,n,e,d).then((e=>{if(null===e)throw this.recordDroppedEvent("event_processor",l,t),new N("An event processor returned `null`, will not send event.","log");if(n.data&&!0===n.data.__sentry__)return e;const o=function(t,n,e){const{beforeSend:r,beforeSendTransaction:o,beforeSendSpan:i}=t;if(je(n)&&r)return r(n,e);if(Te(n)){if(n.spans&&i){const t=[];for(const e of n.spans){const n=i(e);n&&t.push(n)}n.spans=t}if(o)return o(n,e)}return n}(r,e,n);return function(t,n){const e=`${n} must return \`null\` or a valid event.`;if(h(t))return t.then((t=>{if(!a(t)&&null!==t)throw new N(e);return t}),(t=>{throw new N(`${n} rejected with ${t}`)}));if(!a(t)&&null!==t)throw new N(e);return t}(o,u)})).then((r=>{if(null===r)throw this.recordDroppedEvent("before_send",l,t),new N(`${u} returned \`null\`, will not send event.`,"log");const o=e&&e.getSession();!i&&o&&this.ut(o,r);const s=r.transaction_info;if(i&&s&&r.transaction!==t.transaction){const t="custom";r.transaction_info={...s,source:t}}return this.sendEvent(r,n),r})).then(null,(t=>{if(t instanceof N)throw t;throw this.captureException(t,{data:{__sentry__:!0},originalException:t}),new N(`Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\nReason: ${t}`)}))}rt(t){this.V++,t.then((t=>(this.V--,t)),(t=>(this.V--,t)))}lt(){const t=this.Y;return this.Y={},Object.keys(t).map((n=>{const[e,r]=n.split(":");return{reason:e,category:r,quantity:t[n]}}))}}function je(t){return void 0===t.type}function Te(t){return"transaction"===t.type}function Oe(t){gn().setClient(t),function(t){const n=un(cn());n.hub&&"function"==typeof n.hub.getStackTop&&(n.hub.getStackTop().client=t)}(t)}const Me=64;function Ce(t,n,e=Ct(t.bufferSize||Me)){let r={};return{send:function(o){const i=[];if(Xt(o,((n,e)=>{const o=Yt(e);if(function(t,n,e=Date.now()){return function(t,n){return t[n]||t.all||0}(t,n)>e}(r,o)){const r=Re(n,e);t.recordDroppedEvent("ratelimit_backoff",o,r)}else i.push(n)})),0===i.length)return Tt({});const s=Wt(o[0],i),c=n=>{Xt(s,((e,r)=>{const o=Re(e,r);t.recordDroppedEvent(n,Yt(r),o)}))};return e.add((()=>n({body:Gt(s)}).then((t=>(r=tn(r,t),t)),(t=>{throw c("network_error"),t})))).then((t=>t),(t=>{if(t instanceof N)return c("queue_overflow"),Tt({});throw t}))},flush:t=>e.drain(t)}}function Re(t,n){if("event"===n||"transaction"===n)return Array.isArray(t)?t[1]:void 0}const De="8.2.1";const Ae=100;function Ne(t,n){const e=wn(),r=vn();if(!e)return;const{beforeBreadcrumb:o=null,maxBreadcrumbs:i=Ae}=e.getOptions();if(i<=0)return;const s={timestamp:at(),...t},c=o?O((()=>o(s,n))):s;null!==c&&(e.emit&&e.emit("beforeAddBreadcrumb",c,n),r.addBreadcrumb(c,i))}let Le;const Pe=new WeakMap,Ue=()=>({name:"FunctionToString",setupOnce(){Le=Function.prototype.toString;try{Function.prototype.toString=function(...t){const n=F(this),e=Pe.has(wn())&&void 0!==n?n:this;return Le.apply(e,t)}}catch(t){}},setup(t){Pe.set(t,!0)}}),Fe=[/^Script error\.?$/,/^Javascript error: Script error\.? on line 0$/,/^ResizeObserver loop completed with undelivered notifications.$/,/^Cannot redefine property: googletag$/],qe=(t={})=>({name:"InboundFilters",processEvent(n,e,r){const o=r.getOptions(),i=function(t={},n={}){return{allowUrls:[...t.allowUrls||[],...n.allowUrls||[]],denyUrls:[...t.denyUrls||[],...n.denyUrls||[]],ignoreErrors:[...t.ignoreErrors||[],...n.ignoreErrors||[],...t.disableErrorDefaults?[]:Fe],ignoreTransactions:[...t.ignoreTransactions||[],...n.ignoreTransactions||[]],ignoreInternal:void 0===t.ignoreInternal||t.ignoreInternal}}(t,o);return function(t,n){if(n.ignoreInternal&&function(t){try{return"SentryError"===t.exception.values[0].type}catch(t){}return!1}(t))return!0;if(function(t,n){if(t.type||!n||!n.length)return!1;return function(t){const n=[];t.message&&n.push(t.message);let e;try{e=t.exception.values[t.exception.values.length-1]}catch(t){}e&&e.value&&(n.push(e.value),e.type&&n.push(`${e.type}: ${e.value}`));return n}(t).some((t=>g(t,n)))}(t,n.ignoreErrors))return!0;if(function(t,n){if("transaction"!==t.type||!n||!n.length)return!1;const e=t.transaction;return!!e&&g(e,n)}(t,n.ignoreTransactions))return!0;if(function(t,n){if(!n||!n.length)return!1;const e=Be(t);return!!e&&g(e,n)}(t,n.denyUrls))return!0;if(!function(t,n){if(!n||!n.length)return!0;const e=Be(t);return!e||g(e,n)}(t,n.allowUrls))return!0;return!1}(n,i)?null:n}});function Be(t){try{let n;try{n=t.exception.values[0].stacktrace.frames}catch(t){}return n?function(t=[]){for(let n=t.length-1;n>=0;n--){const e=t[n];if(e&&"<anonymous>"!==e.filename&&"[native code]"!==e.filename)return e.filename||null}return null}(n):null}catch(t){return null}}const He=()=>{let t;return{name:"Dedupe",processEvent(n){if(n.type)return n;try{if(function(t,n){if(!n)return!1;if(function(t,n){const e=t.message,r=n.message;if(!e&&!r)return!1;if(e&&!r||!e&&r)return!1;if(e!==r)return!1;if(!ze(t,n))return!1;if(!We(t,n))return!1;return!0}(t,n))return!0;if(function(t,n){const e=Xe(n),r=Xe(t);if(!e||!r)return!1;if(e.type!==r.type||e.value!==r.value)return!1;if(!ze(t,n))return!1;if(!We(t,n))return!1;return!0}(t,n))return!0;return!1}(n,t))return null}catch(t){}return t=n}}};function We(t,n){let e=Je(t),r=Je(n);if(!e&&!r)return!0;if(e&&!r||!e&&r)return!1;if(r.length!==e.length)return!1;for(let t=0;t<r.length;t++){const n=r[t],o=e[t];if(n.filename!==o.filename||n.lineno!==o.lineno||n.colno!==o.colno||n.function!==o.function)return!1}return!0}function ze(t,n){let e=t.fingerprint,r=n.fingerprint;if(!e&&!r)return!0;if(e&&!r||!e&&r)return!1;try{return!(e.join("")!==r.join(""))}catch(t){return!1}}function Xe(t){return t.exception&&t.exception.values&&t.exception.values[0]}function Je(t){const n=t.exception;if(n)try{return n.values[0].stacktrace.frames}catch(t){return}}function Ge(t,n){const e=E("globalMetricsAggregators",(()=>new WeakMap)),r=e.get(t);if(r)return r;const o=new n(t);return t.on("flush",(()=>o.flush())),t.on("close",(()=>o.close())),e.set(t,o),o}function Ke(t,n,e,r,o={}){const i=o.client||wn();if(!i)return;const s=Vn(),c=s?Kn(s):void 0,{unit:u,tags:a,timestamp:f}=o,{release:h,environment:l}=i.getOptions(),d={};h&&(d.release=h),l&&(d.environment=l),c&&(d.transaction=zn(c).description||"");Ge(i,t).add(n,e,r,u,{...d,...a},f)}const Ve={increment:function(t,n,e=1,r){Ke(t,"c",n,e,r)},distribution:function(t,n,e,r){Ke(t,"d",n,e,r)},set:function(t,n,e,r){Ke(t,"s",n,e,r)},gauge:function(t,n,e,r){Ke(t,"g",n,e,r)},getMetricsAggregatorForClient:Ge};function Ye(t){return t.replace(/[^\w\-./]+/gi,"")}const Qe=[["\n","\\n"],["\r","\\r"],["\t","\\t"],["\\","\\\\"],["|","\\u{7c}"],[",","\\u{2c}"]];function Ze(t){return[...t].reduce(((t,n)=>t+function(t){for(const[n,e]of Qe)if(t===n)return e;return t}(n)),"")}function tr(t,n){M.log(`Flushing aggregated metrics, number of metrics: ${n.length}`);const e=function(t,n,e,r){const o={sent_at:(new Date).toISOString()};e&&e.sdk&&(o.sdk={name:e.sdk.name,version:e.sdk.version});r&&n&&(o.dsn=R(n));const i=function(t){const n=function(t){let n="";for(const e of t){const t=Object.entries(e.tags),r=t.length>0?`|#${t.map((([t,n])=>`${t}:${n}`)).join(",")}`:"";n+=`${e.name}@${e.unit}:${e.metric}|${e.metricType}${r}|T${e.timestamp}\n`}return n}(t);return[{type:"statsd",length:n.length},n]}(t);return Wt(o,[i])}(n,t.getDsn(),t.getSdkMetadata(),t.getOptions().tunnel);t.sendEnvelope(e)}const nr={c:class{constructor(t){this.v=t}get weight(){return 1}add(t){this.v+=t}toString(){return`${this.v}`}},g:class{constructor(t){this.dt=t,this.yt=t,this.gt=t,this.vt=t,this.bt=1}get weight(){return 5}add(t){this.dt=t,t<this.yt&&(this.yt=t),t>this.gt&&(this.gt=t),this.vt+=t,this.bt++}toString(){return`${this.dt}:${this.yt}:${this.gt}:${this.vt}:${this.bt}`}},d:class{constructor(t){this.v=[t]}get weight(){return this.v.length}add(t){this.v.push(t)}toString(){return this.v.join(":")}},s:class{constructor(t){this.first=t,this.v=new Set([t])}get weight(){return this.v.size}add(t){this.v.add(t)}toString(){return Array.from(this.v).map((t=>"string"==typeof t?function(t){let n=0;for(let e=0;e<t.length;e++)n=(n<<5)-n+t.charCodeAt(e),n&=n;return n>>>0}(t):t)).join(":")}}};class er{constructor(t){this.F=t,this._t=new Map,this.wt=setInterval((()=>this.flush()),5e3)}add(t,n,e,r="none",o={},i=ft()){const s=Math.floor(i),c=n.replace(/[^\w\-.]+/gi,"_");const u=function(t){const n={};for(const e in t)Object.prototype.hasOwnProperty.call(t,e)&&(n[Ye(e)]=Ze(String(t[e])));return n}(o),a=function(t){return t.replace(/[^\w]+/gi,"_")}(r),f=function(t,n,e,r){return`${t}${n}${e}${Object.entries(W(r)).sort(((t,n)=>t[0].localeCompare(n[0])))}`}(t,c,a,u);let h=this._t.get(f);const l=h&&"s"===t?h.metric.weight:0;h?(h.metric.add(e),h.timestamp<s&&(h.timestamp=s)):(h={metric:new nr[t](e),timestamp:s,metricType:t,name:c,unit:a,tags:u},this._t.set(f,h));Yn(t,c,"string"==typeof e?h.metric.weight-l:e,a,o,f)}flush(){if(0===this._t.size)return;const t=Array.from(this._t.values());tr(this.F,t),this._t.clear()}close(){clearInterval(this.wt),this.flush()}}const rr=function(){return{bindClient(t){gn().setClient(t)},withScope:_n,getClient:()=>wn(),getScope:gn,getIsolationScope:vn,captureException:(t,n)=>gn().captureException(t,n),captureMessage:(t,n,e)=>gn().captureMessage(t,n,e),captureEvent:ce,addBreadcrumb:Ne,setUser:de,setTags:he,setTag:le,setExtra:fe,setExtras:ae,setContext:ue,getIntegration(t){const n=wn();return n&&n.getIntegrationByName(t.id)||null},startSession:me,endSession:ye,captureSession(t){if(t)return ye();!function(){const t=gn(),n=wn(),e=t.getSession();n&&e&&n.captureSession(e)}()}}};const or=t=>(O((()=>{console.warn("You are using browserTracingIntegration() even though this bundle does not include tracing.")})),{name:"BrowserTracing"});const ir={increment:function(t,n=1,e){Ve.increment(er,t,n,e)},distribution:function(t,n,e){Ve.distribution(er,t,n,e)},set:function(t,n,e){Ve.set(er,t,n,e)},gauge:function(t,n,e){Ve.gauge(er,t,n,e)}},sr=$;let cr=0;function ur(){return cr>0}function ar(t,n={},e){if("function"!=typeof t)return t;try{const n=t.__sentry_wrapped__;if(n)return n;if(F(t))return t}catch(n){return t}const sentryWrapped=function(){const r=Array.prototype.slice.call(arguments);try{e&&"function"==typeof e&&e.apply(this,arguments);const o=r.map((t=>ar(t,n)));return t.apply(this,o)}catch(t){throw cr++,setTimeout((()=>{cr--})),_n((e=>{e.addEventProcessor((t=>(n.mechanism&&(wt(t,void 0,void 0),$t(t,n.mechanism)),t.extra={...t.extra,arguments:r},t))),captureException(t)})),t}};try{for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&(sentryWrapped[n]=t[n])}catch(t){}U(sentryWrapped,t),P(t,"__sentry_wrapped__",sentryWrapped);try{Object.getOwnPropertyDescriptor(sentryWrapped,"name").configurable&&Object.defineProperty(sentryWrapped,"name",{get:()=>t.name})}catch(t){}return sentryWrapped}function fr(t,n){const e=dr(t,n),r={type:n&&n.name,value:mr(n)};return e.length&&(r.stacktrace={frames:e}),void 0===r.type&&""===r.value&&(r.value="Unrecoverable error caught"),r}function hr(t,n,e,r){const o=wn(),i=o&&o.getOptions().normalizeDepth,s=function(t){for(const n in t)if(Object.prototype.hasOwnProperty.call(t,n)){const e=t[n];if(e instanceof Error)return e}return}(n),c={__serialized__:kt(n,i)};if(s)return{exception:{values:[fr(t,s)]},extra:c};const u={exception:{values:[{type:f(n)?n.constructor.name:r?"UnhandledRejection":"Error",value:_r(n,{isUnhandledRejection:r})}]},extra:c};if(e){const n=dr(t,e);n.length&&(u.exception.values[0].stacktrace={frames:n})}return u}function lr(t,n){return{exception:{values:[fr(t,n)]}}}function dr(t,n){const e=n.stacktrace||n.stack||"",r=function(t){if(t&&pr.test(t.message))return 1;return 0}(n),o=function(t){if("number"==typeof t.framesToPop)return t.framesToPop;return 0}(n);try{return t(e,r,o)}catch(t){}return[]}const pr=/Minified React error #\d+;/i;function mr(t){const n=t&&t.message;return n?n.error&&"string"==typeof n.error.message?n.error.message:n:"No error message"}function yr(t,n,e,r){const o=vr(t,n,e&&e.syntheticException||void 0,r);return $t(o),o.level="error",e&&e.event_id&&(o.event_id=e.event_id),Tt(o)}function gr(t,n,e="info",r,o){const i=br(t,n,r&&r.syntheticException||void 0,o);return i.level=e,r&&r.event_id&&(i.event_id=r.event_id),Tt(i)}function vr(t,n,s,c,u){let h;if(o(n)&&n.error){return lr(t,n.error)}if(i(n)||r(n,"DOMException")){const e=n;if("stack"in n)h=lr(t,n);else{const n=e.name||(i(e)?"DOMError":"DOMException"),r=e.message?`${n}: ${e.message}`:n;h=br(t,r,s,c),wt(h,r)}return"code"in e&&(h.tags={...h.tags,"DOMException.code":`${e.code}`}),h}if(e(n))return lr(t,n);if(a(n)||f(n)){return h=hr(t,n,s,u),$t(h,{synthetic:!0}),h}return h=br(t,n,s,c),wt(h,`${n}`,void 0),$t(h,{synthetic:!0}),h}function br(t,n,e,r){const o={};if(r&&e){const r=dr(t,e);r.length&&(o.exception={values:[{value:n,stacktrace:{frames:r}}]})}if(c(n)){const{__sentry_template_string__:t,__sentry_template_values__:e}=n;return o.logentry={message:t,params:e},o}return o.message=n,o}function _r(t,{isUnhandledRejection:n}){const e=function(t,n=40){const e=Object.keys(q(t));if(e.sort(),!e.length)return"[object has no keys]";if(e[0].length>=n)return p(e[0],n);for(let t=e.length;t>0;t--){const r=e.slice(0,t).join(", ");if(!(r.length>n))return t===e.length?r:p(r,n)}return""}(t),r=n?"promise rejection":"exception";if(o(t))return`Event \`ErrorEvent\` captured as ${r} with message \`${t.message}\``;if(f(t)){return`Event \`${function(t){try{const n=Object.getPrototypeOf(t);return n?n.constructor.name:void 0}catch(t){}}(t)}\` (type=${t.type}) captured as ${r}`}return`Object captured as ${r} with keys: ${e}`}function wr(t,{metadata:n,tunnel:e,dsn:r}){const o={event_id:t.event_id,sent_at:(new Date).toISOString(),...n&&n.sdk&&{sdk:{name:n.sdk.name,version:n.sdk.version}},...!!e&&!!r&&{dsn:R(r)}},i=function(t){return[{type:"user_report"},t]}(t);return Wt(o,[i])}class $r extends Ie{constructor(t){const n={parentSpanIsAlwaysRootSpan:!0,...t};!function(t,n,e=[n],r="npm"){const o=t.nt||{};o.sdk||(o.sdk={name:`sentry.javascript.${n}`,packages:e.map((t=>({name:`${r}:@sentry/${t}`,version:De}))),version:De}),t.nt=o}(n,"browser",["browser"],sr.SENTRY_SDK_SOURCE||"npm"),super(n),n.sendClientReports&&sr.document&&sr.document.addEventListener("visibilitychange",(()=>{"hidden"===sr.document.visibilityState&&this.$t()}))}eventFromException(t,n){return yr(this.K.stackParser,t,n,this.K.attachStacktrace)}eventFromMessage(t,n="info",e){return gr(this.K.stackParser,t,n,e,this.K.attachStacktrace)}captureUserFeedback(t){if(!this.st())return;const n=wr(t,{metadata:this.getSdkMetadata(),dsn:this.getDsn(),tunnel:this.getOptions().tunnel});this.sendEnvelope(n)}ft(t,n,e){return t.platform=t.platform||"javascript",super.ft(t,n,e)}$t(){const t=this.lt();if(0===t.length)return;if(!this.tt)return;const n=(e=t,Wt((r=this.K.tunnel&&R(this.tt))?{dsn:r}:{},[[{type:"client_report"},{timestamp:o||at(),discarded_events:e}]]));var e,r,o;this.sendEnvelope(n)}}let Er;function Sr(){Er=void 0}function xr(t,n=function(){if(Er)return Er;if(st(sr.fetch))return Er=sr.fetch.bind(sr);const t=sr.document;let n=sr.fetch;if(t&&"function"==typeof t.createElement)try{const e=t.createElement("iframe");e.hidden=!0,t.head.appendChild(e);const r=e.contentWindow;r&&r.fetch&&(n=r.fetch),t.head.removeChild(e)}catch(t){}try{return Er=n.bind(sr)}catch(t){}}()){let e=0,r=0;return Ce(t,(function(o){const i=o.body.length;e+=i,r++;const s={body:o.body,method:"POST",referrerPolicy:"origin",headers:t.headers,keepalive:e<=6e4&&r<15,...t.fetchOptions};if(!n)return Sr(),Ot("No fetch implementation available");try{return n(t.url,s).then((t=>(e-=i,r--,{statusCode:t.status,headers:{"x-sentry-rate-limits":t.headers.get("X-Sentry-Rate-Limits"),"retry-after":t.headers.get("Retry-After")}})))}catch(t){return Sr(),e-=i,r--,Ot(t)}}))}function kr(t,n,e,r){const o={filename:t,function:"<anonymous>"===n?J:n,in_app:!0};return void 0!==e&&(o.lineno=e),void 0!==r&&(o.colno=r),o}const Ir=/^\s*at (?:(.+?\)(?: \[.+\])?|.*?) ?\((?:address at )?)?(?:async )?((?:<anonymous>|[-a-z]+:|.*bundle|\/)?.*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,jr=/\((\S*)(?::(\d+))(?::(\d+))\)/,Tr=[30,t=>{const n=Ir.exec(t);if(n){if(n[2]&&0===n[2].indexOf("eval")){const t=jr.exec(n[2]);t&&(n[2]=t[1],n[3]=t[2],n[4]=t[3])}const[t,e]=qr(n[1]||J,n[2]);return kr(e,t,n[3]?+n[3]:void 0,n[4]?+n[4]:void 0)}}],Or=/^\s*(.*?)(?:\((.*?)\))?(?:^|@)?((?:[-a-z]+)?:\/.*?|\[native code\]|[^@]*(?:bundle|\d+\.js)|\/[\w\-. /=]+)(?::(\d+))?(?::(\d+))?\s*$/i,Mr=/(\S+) line (\d+)(?: > eval line \d+)* > eval/i,Cr=[50,t=>{const n=Or.exec(t);if(n){if(n[3]&&n[3].indexOf(" > eval")>-1){const t=Mr.exec(n[3]);t&&(n[1]=n[1]||"eval",n[3]=t[1],n[4]=t[2],n[5]="")}let t=n[3],e=n[1]||J;return[e,t]=qr(e,t),kr(t,e,n[4]?+n[4]:void 0,n[5]?+n[5]:void 0)}}],Rr=/^\s*at (?:((?:\[object object\])?.+) )?\(?((?:[-a-z]+):.*?):(\d+)(?::(\d+))?\)?\s*$/i,Dr=[40,t=>{const n=Rr.exec(t);return n?kr(n[2],n[1]||J,+n[3],n[4]?+n[4]:void 0):void 0}],Ar=/ line (\d+).*script (?:in )?(\S+)(?:: in function (\S+))?$/i,Nr=[10,t=>{const n=Ar.exec(t);return n?kr(n[2],n[3]||J,+n[1]):void 0}],Lr=/ line (\d+), column (\d+)\s*(?:in (?:<anonymous function: ([^>]+)>|([^)]+))\(.*\))? in (.*):\s*$/i,Pr=[20,t=>{const n=Lr.exec(t);return n?kr(n[5],n[3]||n[4]||J,+n[1],+n[2]):void 0}],Ur=[Tr,Cr],Fr=V(...Ur),qr=(t,n)=>{const e=-1!==t.indexOf("safari-extension"),r=-1!==t.indexOf("safari-web-extension");return e||r?[-1!==t.indexOf("@")?t.split("@")[0]:J,e?`safari-extension:${n}`:`safari-web-extension:${n}`]:[t,n]},Br=$,Hr=1e3;let Wr,zr,Xr,Jr;function Gr(){if(!Br.document)return;const t=rt.bind(null,"dom"),n=Kr(t,!0);Br.document.addEventListener("click",n,!1),Br.document.addEventListener("keypress",n,!1),["EventTarget","Node"].forEach((n=>{const e=Br[n]&&Br[n].prototype;e&&e.hasOwnProperty&&e.hasOwnProperty("addEventListener")&&(L(e,"addEventListener",(function(n){return function(e,r,o){if("click"===e||"keypress"==e)try{const r=this,i=r.__sentry_instrumentation_handlers__=r.__sentry_instrumentation_handlers__||{},s=i[e]=i[e]||{refCount:0};if(!s.handler){const r=Kr(t);s.handler=r,n.call(this,e,r,o)}s.refCount++}catch(t){}return n.call(this,e,r,o)}})),L(e,"removeEventListener",(function(t){return function(n,e,r){if("click"===n||"keypress"==n)try{const e=this,o=e.__sentry_instrumentation_handlers__||{},i=o[n];i&&(i.refCount--,i.refCount<=0&&(t.call(this,n,i.handler,r),i.handler=void 0,delete o[n]),0===Object.keys(o).length&&delete e.__sentry_instrumentation_handlers__)}catch(t){}return t.call(this,n,e,r)}})))}))}function Kr(t,n=!1){return e=>{if(!e||e._sentryCaptured)return;const r=function(t){try{return t.target}catch(t){return null}}(e);if(function(t,n){return"keypress"===t&&(!n||!n.tagName||"INPUT"!==n.tagName&&"TEXTAREA"!==n.tagName&&!n.isContentEditable)}(e.type,r))return;P(e,"_sentryCaptured",!0),r&&!r._sentryId&&P(r,"_sentryId",vt());const o="keypress"===e.type?"input":e.type;if(!function(t){if(t.type!==zr)return!1;try{if(!t.target||t.target._sentryId!==Xr)return!1}catch(t){}return!0}(e)){t({event:e,name:o,global:n}),zr=e.type,Xr=r?r._sentryId:void 0}clearTimeout(Wr),Wr=Br.setTimeout((()=>{Xr=void 0,zr=void 0}),Hr)}}function Vr(t){const n="history";nt(n,t),et(n,Yr)}function Yr(){if(!function(){const t=nn.chrome,n=t&&t.app&&t.app.runtime,e="history"in nn&&!!nn.history.pushState&&!!nn.history.replaceState;return!n&&e}())return;const t=Br.onpopstate;function n(t){return function(...n){const e=n.length>2?n[2]:void 0;if(e){const t=Jr,n=String(e);Jr=n;rt("history",{from:t,to:n})}return t.apply(this,n)}}Br.onpopstate=function(...n){const e=Br.location.href,r=Jr;Jr=e;if(rt("history",{from:r,to:e}),t)try{return t.apply(this,n)}catch(t){}},L(Br.history,"pushState",n),L(Br.history,"replaceState",n)}const Qr="__sentry_xhr_v3__";function Zr(){if(!Br.XMLHttpRequest)return;const t=XMLHttpRequest.prototype;L(t,"open",(function(t){return function(...n){const e=1e3*ft(),r=s(n[0])?n[0].toUpperCase():void 0,o=function(t){if(s(t))return t;try{return t.toString()}catch(t){}return}(n[1]);if(!r||!o)return t.apply(this,n);this[Qr]={method:r,url:o,request_headers:{}},"POST"===r&&o.match(/sentry_key/)&&(this.__sentry_own_request__=!0);const i=()=>{const t=this[Qr];if(t&&4===this.readyState){try{t.status_code=this.status}catch(t){}rt("xhr",{endTimestamp:1e3*ft(),startTimestamp:e,xhr:this})}};return"onreadystatechange"in this&&"function"==typeof this.onreadystatechange?L(this,"onreadystatechange",(function(t){return function(...n){return i(),t.apply(this,n)}})):this.addEventListener("readystatechange",i),L(this,"setRequestHeader",(function(t){return function(...n){const[e,r]=n,o=this[Qr];return o&&s(e)&&s(r)&&(o.request_headers[e.toLowerCase()]=r),t.apply(this,n)}})),t.apply(this,n)}})),L(t,"send",(function(t){return function(...n){const e=this[Qr];if(!e)return t.apply(this,n);void 0!==n[0]&&(e.body=n[0]);return rt("xhr",{startTimestamp:1e3*ft(),xhr:this}),t.apply(this,n)}}))}const to=1024,no=(t={})=>{const n={console:!0,dom:!0,fetch:!0,history:!0,sentry:!0,xhr:!0,...t};return{name:"Breadcrumbs",setup(t){var e;n.console&&function(t){const n="console";nt(n,t),et(n,ot)}(function(t){return function(n){if(wn()!==t)return;const e={category:"console",data:{arguments:n.args,logger:"console"},level:At(n.level),message:m(n.args," ")};if("assert"===n.level){if(!1!==n.args[0])return;e.message=`Assertion failed: ${m(n.args.slice(1)," ")||"console.assert"}`,e.data.arguments=n.args.slice(1)}Ne(e,{input:n.args,level:n.level})}}(t)),n.dom&&(e=function(t,n){return function(e){if(wn()!==t)return;let r,o,i="object"==typeof n?n.serializeAttribute:void 0,s="object"==typeof n&&"number"==typeof n.maxStringLength?n.maxStringLength:void 0;s&&s>to&&(s=to),"string"==typeof i&&(i=[i]);try{const t=e.event,n=function(t){return!!t&&!!t.target}(t)?t.target:t;r=k(n,{keyAttrs:i,maxStringLength:s}),o=function(t){if(!S.HTMLElement)return null;let n=t;for(let t=0;t<5;t++){if(!n)return null;if(n instanceof HTMLElement){if(n.dataset.sentryComponent)return n.dataset.sentryComponent;if(n.dataset.sentryElement)return n.dataset.sentryElement}n=n.parentNode}return null}(n)}catch(t){r="<unknown>"}if(0===r.length)return;const c={category:`ui.${e.name}`,message:r};o&&(c.data={"ui.component_name":o}),Ne(c,{event:e.event,name:e.name,global:e.global})}}(t,n.dom),nt("dom",e),et("dom",Gr)),n.xhr&&function(t){nt("xhr",t),et("xhr",Zr)}(function(t){return function(n){if(wn()!==t)return;const{startTimestamp:e,endTimestamp:r}=n,o=n.xhr[Qr];if(!e||!r||!o)return;const{method:i,url:s,status_code:c,body:u}=o;Ne({category:"xhr",data:{method:i,url:s,status_code:c},type:"http"},{xhr:n.xhr,input:u,startTimestamp:e,endTimestamp:r})}}(t)),n.fetch&&function(t){const n="fetch";nt(n,t),et(n,ht)}(function(t){return function(n){if(wn()!==t)return;const{startTimestamp:e,endTimestamp:r}=n;if(r&&(!n.fetchData.url.match(/sentry_key/)||"POST"!==n.fetchData.method))if(n.error){Ne({category:"fetch",data:n.fetchData,level:"error",type:"http"},{data:n.error,input:n.args,startTimestamp:e,endTimestamp:r})}else{const t=n.response;Ne({category:"fetch",data:{...n.fetchData,status_code:t&&t.status},type:"http"},{input:n.args,response:t,startTimestamp:e,endTimestamp:r})}}}(t)),n.history&&Vr(function(t){return function(n){if(wn()!==t)return;let e=n.from,r=n.to;const o=Rt(sr.location.href);let i=e?Rt(e):void 0;const s=Rt(r);i&&i.path||(i=o),o.protocol===s.protocol&&o.host===s.host&&(r=s.relative),o.protocol===i.protocol&&o.host===i.host&&(e=i.relative),Ne({category:"navigation",data:{from:e,to:r}})}}(t)),n.sentry&&t.on("beforeSendEvent",function(t){return function(n){wn()===t&&Ne({category:"sentry."+("transaction"===n.type?"transaction":"event"),event_id:n.event_id,level:n.level,message:_t(n)},{event:n})}}(t))}}};const eo=["EventTarget","Window","Node","ApplicationCache","AudioTrackList","BroadcastChannel","ChannelMergerNode","CryptoOperation","EventSource","FileReader","HTMLUnknownElement","IDBDatabase","IDBRequest","IDBTransaction","KeyOperation","MediaController","MessagePort","ModalWindow","Notification","SVGElementInstance","Screen","SharedWorker","TextTrack","TextTrackCue","TextTrackList","WebSocket","WebSocketWorker","Worker","XMLHttpRequest","XMLHttpRequestEventTarget","XMLHttpRequestUpload"],ro=(t={})=>{const n={XMLHttpRequest:!0,eventTarget:!0,requestAnimationFrame:!0,setInterval:!0,setTimeout:!0,...t};return{name:"BrowserApiErrors",setupOnce(){n.setTimeout&&L(sr,"setTimeout",oo),n.setInterval&&L(sr,"setInterval",oo),n.requestAnimationFrame&&L(sr,"requestAnimationFrame",io),n.XMLHttpRequest&&"XMLHttpRequest"in sr&&L(XMLHttpRequest.prototype,"send",so);const t=n.eventTarget;if(t){(Array.isArray(t)?t:eo).forEach(co)}}}};function oo(t){return function(...n){const e=n[0];return n[0]=ar(e,{mechanism:{data:{function:Q(t)},handled:!1,type:"instrument"}}),t.apply(this,n)}}function io(t){return function(n){return t.apply(this,[ar(n,{mechanism:{data:{function:"requestAnimationFrame",handler:Q(t)},handled:!1,type:"instrument"}})])}}function so(t){return function(...n){const e=this;return["onload","onerror","onprogress","onreadystatechange"].forEach((t=>{t in e&&"function"==typeof e[t]&&L(e,t,(function(n){const e={mechanism:{data:{function:t,handler:Q(n)},handled:!1,type:"instrument"}},r=F(n);return r&&(e.mechanism.data.handler=Q(r)),ar(n,e)}))})),t.apply(this,n)}}function co(t){const n=sr,e=n[t]&&n[t].prototype;e&&e.hasOwnProperty&&e.hasOwnProperty("addEventListener")&&(L(e,"addEventListener",(function(n){return function(e,r,o){try{"function"==typeof r.handleEvent&&(r.handleEvent=ar(r.handleEvent,{mechanism:{data:{function:"handleEvent",handler:Q(r),target:t},handled:!1,type:"instrument"}}))}catch(t){}return n.apply(this,[e,ar(r,{mechanism:{data:{function:"addEventListener",handler:Q(r),target:t},handled:!1,type:"instrument"}}),o])}})),L(e,"removeEventListener",(function(t){return function(n,e,r){const o=e;try{const e=o&&o.__sentry_wrapped__;e&&t.call(this,n,e,r)}catch(t){}return t.call(this,n,o,r)}})))}const uo=(t={})=>{const n={onerror:!0,onunhandledrejection:!0,...t};return{name:"GlobalHandlers",setupOnce(){Error.stackTraceLimit=50},setup(t){n.onerror&&function(t){!function(t){const n="error";nt(n,t),et(n,mt)}((n=>{const{stackParser:e,attachStacktrace:r}=ao();if(wn()!==t||ur())return;const{msg:o,url:i,line:c,column:u,error:a}=n,f=function(t,n,e,r){const o=t.exception=t.exception||{},i=o.values=o.values||[],c=i[0]=i[0]||{},u=c.stacktrace=c.stacktrace||{},a=u.frames=u.frames||[],f=isNaN(parseInt(r,10))?void 0:r,h=isNaN(parseInt(e,10))?void 0:e,l=s(n)&&n.length>0?n:function(){try{return S.document.location.href}catch(t){return""}}();0===a.length&&a.push({colno:f,filename:l,function:J,in_app:!0,lineno:h});return t}(vr(e,a||o,void 0,r,!1),i,c,u);f.level="error",ce(f,{originalException:a,mechanism:{handled:!1,type:"onerror"}})}))}(t),n.onunhandledrejection&&function(t){!function(t){const n="unhandledrejection";nt(n,t),et(n,gt)}((n=>{const{stackParser:e,attachStacktrace:r}=ao();if(wn()!==t||ur())return;const o=function(t){if(u(t))return t;try{if("reason"in t)return t.reason;if("detail"in t&&"reason"in t.detail)return t.detail.reason}catch(t){}return t}(n),i=u(o)?{exception:{values:[{type:"UnhandledRejection",value:`Non-Error promise rejection captured with value: ${String(o)}`}]}}:vr(e,o,void 0,r,!0);i.level="error",ce(i,{originalException:o,mechanism:{handled:!1,type:"onunhandledrejection"}})}))}(t)}}};function ao(){const t=wn();return t&&t.getOptions()||{stackParser:()=>[],attachStacktrace:!1}}const fo=()=>({name:"HttpContext",preprocessEvent(t){if(!sr.navigator&&!sr.location&&!sr.document)return;const n=t.request&&t.request.url||sr.location&&sr.location.href,{referrer:e}=sr.document||{},{userAgent:r}=sr.navigator||{},o={...t.request&&t.request.headers,...e&&{Referer:e},...r&&{"User-Agent":r}},i={...t.request,...n&&{url:n},headers:o};t.request=i}}),ho=(t={})=>{const n=t.limit||5,e=t.key||"cause";return{name:"LinkedErrors",preprocessEvent(t,r,o){const i=o.getOptions();v(fr,i.stackParser,i.maxValueLength,e,n,t,r)}}};function lo(t){return[qe(),Ue(),ro(),no(),uo(),ho(),He(),fo()]}const po={replayIntegration:"replay",replayCanvasIntegration:"replay-canvas",feedbackIntegration:"feedback",feedbackModalIntegration:"feedback-modal",feedbackScreenshotIntegration:"feedback-screenshot",captureConsoleIntegration:"captureconsole",contextLinesIntegration:"contextlines",linkedErrorsIntegration:"linkederrors",debugIntegration:"debug",dedupeIntegration:"dedupe",extraErrorDataIntegration:"extraerrordata",httpClientIntegration:"httpclient",reportingObserverIntegration:"reportingobserver",rewriteFramesIntegration:"rewriteframes",sessionTimingIntegration:"sessiontiming"},mo=sr;return t.BrowserClient=$r,t.SDK_VERSION=De,t.SEMANTIC_ATTRIBUTE_SENTRY_OP=Rn,t.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN=Dn,t.SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE=Cn,t.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE=Mn,t.Scope=mn,t.WINDOW=sr,t.addBreadcrumb=Ne,t.addEventProcessor=function(t){vn().addEventProcessor(t)},t.addIntegration=function(t){const n=wn();n&&n.addIntegration(t)},t.breadcrumbsIntegration=no,t.browserApiErrorsIntegration=ro,t.browserTracingIntegration=or,t.captureEvent=ce,t.captureException=captureException,t.captureMessage=function(t,n){const e="string"==typeof n?n:void 0,r="string"!=typeof n?{captureContext:n}:void 0;return gn().captureMessage(t,e,r)},t.captureSession=ve,t.captureUserFeedback=function(t){const n=wn();n&&n.captureUserFeedback(t)},t.chromeStackLineParser=Tr,t.close=async function(t){const n=wn();return n?n.close(t):Promise.resolve(!1)},t.continueTrace=({sentryTrace:t,baggage:n},e)=>_n((r=>{const o=Ht(t,n);return r.setPropagationContext(o),e()})),t.createTransport=Ce,t.createUserFeedbackEnvelope=wr,t.dedupeIntegration=He,t.defaultStackLineParsers=Ur,t.defaultStackParser=Fr,t.endSession=ye,t.eventFromException=yr,t.eventFromMessage=gr,t.exceptionFromError=fr,t.feedbackAsyncIntegration=on,t.feedbackIntegration=on,t.flush=async function(t){const n=wn();return n?n.flush(t):Promise.resolve(!1)},t.forceLoad=function(){},t.functionToStringIntegration=Ue,t.geckoStackLineParser=Cr,t.getClient=wn,t.getCurrentHub=rr,t.getCurrentScope=gn,t.getDefaultIntegrations=lo,t.getGlobalScope=bn,t.getIsolationScope=vn,t.globalHandlersIntegration=uo,t.httpContextIntegration=fo,t.inboundFiltersIntegration=qe,t.init=function(t={}){const n=function(t={}){return{defaultIntegrations:lo(),release:"string"==typeof __SENTRY_RELEASE__?__SENTRY_RELEASE__:sr.SENTRY_RELEASE&&sr.SENTRY_RELEASE.id?sr.SENTRY_RELEASE.id:void 0,autoSessionTracking:!0,sendClientReports:!0,...t}}(t);if(function(){const t=sr,n=t&&t.chrome&&t.chrome.runtime&&t.chrome.runtime.id,e=sr;return!!(e&&e.browser&&e.browser.runtime&&e.browser.runtime.id)||!!n}())return void O((()=>{console.error("[Sentry] You cannot run Sentry this way in a browser extension, check: https://docs.sentry.io/platforms/javascript/best-practices/browser-extensions/")}));const e={...n,stackParser:(r=n.stackParser||Fr,Array.isArray(r)?V(...r):r),integrations:Se(n),transport:n.transport||xr};var r;!function(t,n){!0===n.debug&&O((()=>{console.warn("[Sentry] Cannot initialize SDK with `debug` option using a non-debug bundle.")})),gn().update(n.initialScope);const e=new t(n);Oe(e),e.init()}($r,e),n.autoSessionTracking&&function(){if(void 0===sr.document)return;me({ignoreDuration:!0}),ve(),Vr((({from:t,to:n})=>{void 0!==t&&t!==n&&(me({ignoreDuration:!0}),ve())}))}()},t.isInitialized=function(){return!!wn()},t.lastEventId=pe,t.lazyLoadIntegration=async function(t){const n=po[t],e=mo.Sentry=mo.Sentry||{};if(!n)throw new Error(`Cannot lazy load integration: ${t}`);const r=e[t];if("function"==typeof r)return r;const o=function(t){const n=wn(),e=n&&n.getOptions(),r=e&&e.cdnBaseUrl||"https://browser.sentry-cdn.com";return new URL(`/${De}/${t}.min.js`,r).toString()}(n),i=sr.document.createElement("script");i.src=o,i.crossOrigin="anonymous";const s=new Promise(((t,n)=>{i.addEventListener("load",(()=>t())),i.addEventListener("error",n)}));sr.document.body.appendChild(i);try{await s}catch(n){throw new Error(`Error when loading integration: ${t}`)}const c=e[t];if("function"!=typeof c)throw new Error(`Could not load integration: ${t}`);return c},t.linkedErrorsIntegration=ho,t.makeFetchTransport=xr,t.metrics=ir,t.onLoad=function(t){t()},t.opera10StackLineParser=Nr,t.opera11StackLineParser=Pr,t.parameterize=function(t,...n){const e=new String(String.raw(t,...n));return e.__sentry_template_string__=t.join("\0").replace(/%/g,"%%").replace(/\0/g,"%s"),e.__sentry_template_values__=n,e},t.replayIntegration=function(t){return O((()=>{console.warn("You are using replayIntegration() even though this bundle does not include replay.")})),{name:"Replay",...sn.reduce(((t,n)=>(t[n]=en,t)),{})}},t.setContext=ue,t.setCurrentClient=Oe,t.setExtra=fe,t.setExtras=ae,t.setTag=le,t.setTags=he,t.setUser=de,t.showReportDialog=function(t={}){if(!sr.document)return;const n=gn(),e=n.getClient(),r=e&&e.getDsn();if(!r)return;if(n&&(t.user={...n.getUser(),...t.user}),!t.eventId){const n=pe();n&&(t.eventId=n)}const o=sr.document.createElement("script");o.async=!0,o.crossOrigin="anonymous",o.src=function(t,n){const e=A(t);if(!e)return"";const r=`${_e(e)}embed/error-page/`;let o=`dsn=${R(e)}`;for(const t in n)if("dsn"!==t&&"onClose"!==t)if("user"===t){const t=n.user;if(!t)continue;t.name&&(o+=`&name=${encodeURIComponent(t.name)}`),t.email&&(o+=`&email=${encodeURIComponent(t.email)}`)}else o+=`&${encodeURIComponent(t)}=${encodeURIComponent(n[t])}`;return`${r}?${o}`}(r,t),t.onLoad&&(o.onload=t.onLoad);const{onClose:i}=t;if(i){const t=n=>{if("__sentry_reportdialog_closed__"===n.data)try{i()}finally{sr.removeEventListener("message",t)}};sr.addEventListener("message",t)}const s=sr.document.head||sr.document.body;s&&s.appendChild(o)},t.spanToBaggageHeader=function(t){return Ft(Fn(t))},t.spanToJSON=zn,t.spanToTraceHeader=function(t){const{traceId:n,spanId:e}=t.spanContext();return function(t=vt(),n=vt().substring(16),e){let r="";return void 0!==e&&(r=e?"-1":"-0"),`${t}-${n}${r}`}(n,e,Xn(t))},t.startSession=me,t.winjsStackLineParser=Dr,t.withIsolationScope=function(...t){const n=In(cn());if(2===t.length){const[e,r]=t;return e?n.withSetIsolationScope(e,r):n.withIsolationScope(r)}return n.withIsolationScope(t[0])},t.withScope=_n,t}({});
-//# sourceMappingURL=bundle.min.js.map
diff --git a/js/sentry.js b/js/sentry.js
deleted file mode 100644
index e1e97da3f..000000000
--- a/js/sentry.js
+++ /dev/null
@@ -1,95 +0,0 @@
-/**
- * Copyright since 2007 PrestaShop SA and Contributors
- * PrestaShop is an International Registered Trademark & Property of PrestaShop SA
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Academic Free License 3.0 (AFL-3.0)
- * that is bundled with this package in the file LICENSE.md.
- * It is also available through the world-wide-web at this URL:
- * https://opensource.org/licenses/AFL-3.0
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@prestashop.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
- * versions in the future. If you wish to customize PrestaShop for your
- * needs please refer to https://devdocs.prestashop.com/ for more information.
- *
- * @author    PrestaShop SA and Contributors <contact@prestashop.com>
- * @copyright Since 2007 PrestaShop SA and Contributors
- * @license   https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
- */
-
-Sentry.init({
-  dsn: "https://eae192966a8d79509154c65c317a7e5d@o298402.ingest.us.sentry.io/4507254110552064",
-  release: "v" + input.autoupgrade.version,
-  beforeSend(event, hint) {
-    // Only the one we handle via the feedback modal must be sent.
-    if (!event.tags?.source || event.tags.source !== "feedbackModal") {
-      return null;
-    }
-    event.request.url = maskSensitiveInfoInUrl(
-      event.request.url,
-      input.adminUrl,
-    );
-
-    hint.attachments = [
-      { filename: "log.txt", data: readLogPanel("quickInfo") },
-      { filename: "error.txt", data: readLogPanel("infoError") },
-    ];
-
-    return event;
-  },
-});
-
-document
-  .getElementById("submitErrorReport")
-  .addEventListener("click", function () {
-    const errorsElements = document.getElementById("infoError");
-    if (errorsElements) {
-      const childNodes = errorsElements.childNodes;
-      let messages = "";
-      childNodes.forEach((node) => {
-        if (node.nodeType === Node.TEXT_NODE) {
-          messages += node.textContent.trim() + "\n";
-        }
-      });
-
-      const url = maskSensitiveInfoInUrl(window.location.href, input.adminUrl);
-
-      Sentry.setTag("url", url);
-      Sentry.setTag("source", "feedbackModal");
-
-      const eventId = Sentry.captureMessage(messages, "error");
-      const userEmail = document.getElementById("userEmail");
-      const errorDescription = document.getElementById("errorDescription");
-
-      Sentry.captureUserFeedback({
-        event_id: eventId,
-        email: userEmail.value,
-        comments: errorDescription.value,
-      });
-
-      // Clean-up
-      userEmail.value = "";
-      errorDescription.value = "";
-      Sentry.setTag("source", "");
-
-      $("#errorModal").modal("hide");
-    }
-  });
-
-function maskSensitiveInfoInUrl(url, adminFolder) {
-  let regex = new RegExp(adminFolder, "g");
-  url = url.replace(regex, "/********");
-
-  regex = new RegExp("token=[^&]*", "i");
-  return url.replace(regex, "token=********");
-}
-
-function readLogPanel(targetPanel) {
-  return document.getElementById(targetPanel).innerText;
-}
diff --git a/js/upgrade.js b/js/upgrade.js
deleted file mode 100644
index d70d51aef..000000000
--- a/js/upgrade.js
+++ /dev/null
@@ -1,773 +0,0 @@
-if (typeof input === "undefined") {
-  var input = {
-    psBaseUri: "/",
-    _PS_MODE_DEV_: true,
-    PS_AUTOUP_BACKUP: true,
-    adminUrl: "http://test.com/admin",
-    adminDir: "/admin",
-    token: "asdadsasdasdasd",
-    txtError: [],
-    firstTimeParams: {},
-    ajaxUpgradeTabExists: true,
-    currentIndex: "page.php",
-    tab: input.tab,
-    channel: "major",
-    translation: {
-      confirmDeleteBackup: "Are you sure you want to delete this backup?",
-      delete: "Delete",
-      updateInProgress:
-        'An update is currently in progress... Click "OK" to abort.',
-      upgradingPrestaShop: "Upgrading PrestaShop",
-      upgradeComplete: "Upgrade complete",
-      upgradeCompleteWithWarnings:
-        "Upgrade complete, but warning notifications has been found.",
-      startingRestore: "Starting restoration...",
-      restoreComplete: "Restoration complete.",
-      cannotDownloadFile:
-        "Your server cannot download the file. Please upload it first by ftp in your admin/autoupgrade directory",
-      jsonParseErrorForAction:
-        "Javascript error (parseJSON) detected for action ",
-      endOfProcess: "End of process",
-      processCancelledCheckForRestore:
-        "Operation canceled. Checking for restoration...",
-      confirmRestoreBackup: "Do you want to restore SomeBackupName?",
-      processCancelledWithError: "Operation canceled. An error happened.",
-      missingAjaxUpgradeTab:
-        "[TECHNICAL ERROR] ajax-upgradetab.php is missing. Please reinstall the module.",
-      clickToRefreshAndUseNewConfiguration:
-        "Click to refresh the page and use the new configuration",
-      errorDetectedDuring: "Error detected during",
-      downloadTimeout:
-        "The request exceeded the max_time_limit. Please change your server configuration.",
-      seeOrHideList: "See or hide the list",
-      coreFiles: "Core file(s)",
-      mailFiles: "Mail file(s)",
-      translationFiles: "Translation file(s)",
-      linkAndMd5CannotBeEmpty: "Link and MD5 hash cannot be empty",
-      needToEnterArchiveVersionNumber:
-        "You must enter the full version number of the version you want to upgrade. The full version number can be present in the zip name (ex: 1.7.8.1, 8.0.0).",
-      noArchiveSelected: "No archive has been selected.",
-      needToEnterDirectoryVersionNumber:
-        "You need to enter the version number associated with the directory.",
-      confirmSkipBackup: "Please confirm that you want to skip the backup.",
-      confirmPreserveFileOptions:
-        "Please confirm that you want to preserve file options.",
-      lessOptions: "Less options",
-      moreOptions: "More options (Expert mode)",
-      filesWillBeDeleted: "These files will be deleted",
-      filesWillBeReplaced: "These files will be replaced",
-      noXmlSelected: "No XML file has been selected.",
-      noArchiveAndXmlSelected: "No archive and no XML file have been selected.",
-    },
-  };
-}
-
-var firstTimeParams = input.firstTimeParams.nextParams;
-firstTimeParams.firstTime = "1";
-
-function ucFirst(str) {
-  if (str.length > 0) {
-    return str[0].toUpperCase() + str.substring(1);
-  }
-  return str;
-}
-
-function cleanInfo() {
-  $("#infoStep").html("reset<br/>");
-}
-
-function updateInfoStep(msg) {
-  if (msg) {
-    const infoStepElement = $("#infoStep");
-    infoStepElement.append(msg + '<div class="clear"></div>');
-    infoStepElement.prop(
-      { scrollTop: infoStepElement.prop("scrollHeight") },
-      1,
-    );
-  }
-}
-
-function addError(error) {
-  if (error && error.length) {
-    $("#errorDuringUpgrade").show();
-    const infoErrorElement = $("#infoError");
-    if (Array.isArray(error)) {
-      for (let i = 0; i < error.length; i++) {
-        infoErrorElement.append(error[i] + '<div class="clear"></div>');
-      }
-    } else {
-      infoErrorElement.append(error + '<div class="clear"></div>');
-    }
-    // Note: jquery 1.6 makes use of prop() instead of attr()
-    infoErrorElement.prop(
-      { scrollTop: infoErrorElement.prop("scrollHeight") },
-      1,
-    );
-  }
-}
-
-function addQuickInfo(quickInfo) {
-  if (quickInfo && quickInfo.length) {
-    const quickInfoElement = $("#quickInfo");
-    quickInfoElement.show();
-
-    if (Array.isArray(quickInfo)) {
-      for (let i = 0; i < quickInfo.length; i++) {
-        quickInfoElement.append(quickInfo[i] + '<div class="clear"></div>');
-      }
-    } else {
-      quickInfoElement.append(quickInfo + '<div class="clear"></div>');
-    }
-    // Note : jquery 1.6 make uses of prop() instead of attr()
-    quickInfoElement.prop(
-      { scrollTop: quickInfoElement.prop("scrollHeight") },
-      1,
-    );
-  }
-}
-
-// js initialization : prepare upgrade and rollback buttons
-$(document).ready(function () {
-  $(".nobootstrap.no-header-toolbar")
-    .removeClass("nobootstrap")
-    .addClass("bootstrap");
-
-  $(document).on("click", "a.confirmBeforeDelete", function (e) {
-    if (!confirm(input.translation.confirmDeleteBackup)) {
-      e.preventDefault();
-    }
-  });
-
-  $("select[name=channel]").change(function (e) {
-    $(this)
-      .find("option")
-      .each(function () {
-        var $this = $(this);
-        $("#for-" + $this.attr("id")).toggle($this.is(":selected"));
-      });
-
-    refreshChannelInfos();
-  });
-
-  function refreshChannelInfos() {
-    var val = $("select[name=channel]").val();
-    $.ajax({
-      type: "POST",
-      url: input.adminUrl + "/autoupgrade/ajax-upgradetab.php",
-      async: true,
-      data: {
-        dir: input.adminDir,
-        token: input.token,
-        tab: input.tab,
-        action: "getChannelInfo",
-        ajaxMode: "1",
-        params: { channel: val },
-      },
-      success: function (res, textStatus, jqXHR) {
-        if (isJsonString(res)) {
-          res = $.parseJSON(res);
-        } else {
-          res = { nextParams: { status: "error" } };
-        }
-
-        var answer = res.nextParams.result;
-        if (typeof answer !== "undefined") {
-          var $channelInfos = $("#channel-infos");
-          $channelInfos.replaceWith(answer.div);
-          if (answer.available) {
-            $("#channel-infos .all-infos").show();
-          } else {
-            $channelInfos.html(answer.div);
-            $("#channel-infos .all-infos").hide();
-          }
-        }
-      },
-      error: function (res, textStatus, jqXHR) {
-        if (textStatus === "timeout" && action === "download") {
-          updateInfoStep(input.translation.cannotDownloadFile);
-        } else {
-          // technical error : no translation needed
-          $("#checkPrestaShopFilesVersion").html(
-            '<img src="../img/admin/warning.gif" /> Error Unable to check md5 files',
-          );
-        }
-      },
-    });
-  }
-
-  // the following prevents to leave the page at the inappropriate time
-  $.xhrPool = [];
-  $.xhrPool.abortAll = function () {
-    $.each(this, function (jqXHR) {
-      if (jqXHR && jqXHR.readystate !== 4) {
-        jqXHR.abort();
-      }
-    });
-  };
-
-  $(".upgradestep").click(function (e) {
-    e.preventDefault();
-    // $.scrollTo("#options")
-  });
-
-  // set timeout to 120 minutes (before aborting an ajax request)
-  $.ajaxSetup({ timeout: 7200000 });
-
-  // prepare available button here, without params ?
-  prepareNextButton("#UpdateInitialization", firstTimeParams);
-
-  /**
-   * reset rollbackParams js array (used to init rollback button)
-   */
-  $("select[name=restoreName]").change(function () {
-    var val = $(this).val();
-
-    // show delete button if the value is not 0
-    if (val != 0) {
-      $("span#buttonDeleteBackup").html(
-        '<br><a class="button confirmBeforeDelete" href="index.php?controller=AdminSelfUpgrade&token=' +
-          input.token +
-          "&amp;deletebackup&amp;name=" +
-          $(this).val() +
-          '"><img src="../img/admin/disabled.gif" />' +
-          input.translation.delete +
-          "</a>",
-      );
-    }
-
-    if (val != 0) {
-      $("#Restore").removeAttr("disabled");
-      var rollbackParams = $.extend(true, {}, firstTimeParams);
-
-      delete rollbackParams.backupName;
-      delete rollbackParams.backupFilesFilename;
-      delete rollbackParams.backupDbFilename;
-      delete rollbackParams.restoreFilesFilename;
-      delete rollbackParams.restoreDbFilenames;
-
-      // init new name to backup
-      rollbackParams.restoreName = val;
-      prepareNextButton("#Restore", rollbackParams);
-    } else {
-      $("#Restore").attr("disabled", "disabled");
-    }
-  });
-
-  $("div[id|=for]").hide();
-  $("select[name=channel]").change();
-
-  if (!input.ajaxUpgradeTabExists) {
-    $("#checkPrestaShopFilesVersion").html(
-      '<img src="../img/admin/warning.gif" />' +
-        input.translation.missingAjaxUpgradeTab,
-    );
-  }
-});
-
-function showConfigResult(msg, type) {
-  if (!type) {
-    type = "conf";
-  }
-  var $configResult = $("#configResult");
-  $configResult.html('<div class="' + type + '">' + msg + "</div>").show();
-
-  if (type === "conf") {
-    $configResult.delay(3000).fadeOut("slow", function () {
-      location.reload();
-    });
-  }
-}
-
-// reuse previousParams, and handle xml returns to calculate next step
-// (and the correct next param array)
-// a case has to be defined for each requests that returns xml
-function afterUpdateConfig(res) {
-  var params = res.nextParams;
-  var config = params.config;
-  var $oldChannel = $("select[name=channel] option.current");
-
-  if (config.channel != $oldChannel.val()) {
-    var $newChannel = $(
-      "select[name=channel] option[value=" + config.channel + "]",
-    );
-    $oldChannel.removeClass("current").html($oldChannel.html().substr(2));
-
-    $newChannel.addClass("current").html("* " + $newChannel.html());
-  }
-
-  if (res.error == 1) {
-    showConfigResult(res.next_desc, "error");
-  } else {
-    showConfigResult(res.next_desc);
-  }
-
-  $("#UpdateInitialization")
-    .unbind()
-    .replaceWith(
-      '<a class="button-autoupgrade" href="' +
-        input.currentIndex +
-        "&token=" +
-        input.token +
-        '" >' +
-        input.translation.clickToRefreshAndUseNewConfiguration +
-        "</a>",
-    );
-}
-
-function startProcess(type) {
-  // hide useless divs, show activity log
-  $(
-    "#informationBlock,#comparisonBlock,#currentConfigurationBlock,#backupOptionsBlock,#upgradeOptionsBlock,#upgradeButtonBlock",
-  ).slideUp("fast");
-  $(".autoupgradeSteps a").addClass("button");
-  $("#activityLogBlock").fadeIn("slow");
-
-  $(window).bind("beforeunload", function (e) {
-    if (confirm(input.translation.updateInProgress)) {
-      $.xhrPool.abortAll();
-      $(window).unbind("beforeunload");
-      return true;
-    } else {
-      if (type === "upgrade") {
-        e.returnValue = false;
-        e.cancelBubble = true;
-        if (e.stopPropagation) {
-          e.stopPropagation();
-        }
-        if (e.preventDefault) {
-          e.preventDefault();
-        }
-      }
-    }
-  });
-}
-
-function afterUpdateInitialization(res) {
-  startProcess("upgrade");
-  $("#UpdateInitialization")
-    .unbind()
-    .replaceWith(
-      '<span id="upgradeNow" class="button-autoupgrade">' +
-        input.translation.upgradingPrestaShop +
-        " ...</span>",
-    );
-}
-
-function afterBackupInitialization(res) {
-  startProcess("upgrade");
-  $("#UpdateInitialization")
-      .unbind()
-      .replaceWith(
-          '<span id="upgradeNow" class="button-autoupgrade">' +
-          input.translation.upgradingPrestaShop +
-          " ...</span>",
-      );
-}
-
-function afterUpgradeComplete(res) {
-  $("#pleaseWait").hide();
-  if (res.nextParams.warning_exists == "false") {
-    $("#infoStep").html(`
-        <p style="padding: 5px">
-            <img src="${input.psBaseUri}img/admin/enabled.gif" alt="ok"> 
-            ${input.translation.upgradeComplete}
-        </p>
-    `);
-  } else {
-    $("#infoStep").html(`
-        <p style="padding: 5px">
-            <img src="${input.psBaseUri}img/admin/warning.gif" alt="ok">
-            ${input.translation.upgradeCompleteWithWarnings}
-        </p>
-    `);
-  }
-
-  $("#postUpdateChecklist").show();
-
-  $(window).unbind("beforeunload");
-}
-
-function afterError(res) {
-  var params = res.nextParams;
-  if (params.next === "") {
-    $(window).unbind("beforeunload");
-  }
-  $("#pleaseWait").hide();
-
-  addQuickInfo(["unbind :) "]);
-}
-
-function afterRestore(res) {
-  startProcess("rollback");
-}
-
-function afterRestoreComplete(res) {
-  $("#pleaseWait").hide();
-  $("#postRestoreChecklist").show();
-  $(window).unbind();
-}
-
-function afterRestoreDatabase(params) {
-  // $("#restoreBackupContainer").hide();
-}
-
-function afterRestoreFiles(params) {
-  // $("#restoreFilesContainer").hide();
-}
-
-function afterBackupFiles(res) {
-  var params = res.nextParams;
-  // if (params.stepDone)
-}
-
-/**
- * afterBackupDb display the button
- */
-function afterBackupDatabase(res) {
-  var params = res.nextParams;
-
-  if (res.stepDone && input.PS_AUTOUP_BACKUP === true) {
-    $("#restoreBackupContainer").show();
-    $("select[name=restoreName]")
-      .append(
-        '<option selected="selected" value="' +
-          params.backupName +
-          '">' +
-          params.backupName +
-          "</option>",
-      )
-      .val("")
-      .change();
-  }
-}
-
-function call_function(func) {
-  this[func].apply(this, Array.prototype.slice.call(arguments, 1));
-}
-
-function doAjaxRequest(action, nextParams, successCallBack) {
-  if (input._PS_MODE_DEV_ === true) {
-    addQuickInfo(["[DEV] ajax request : " + action]);
-  }
-  $("#pleaseWait").show();
-  $("#rollbackForm").hide();
-  var req = $.ajax({
-    type: "POST",
-    url: input.adminUrl + "/autoupgrade/ajax-upgradetab.php",
-    async: true,
-    data: {
-      dir: input.adminDir,
-      ajaxMode: "1",
-      token: input.token,
-      tab: input.tab,
-      action: action,
-      params: nextParams,
-    },
-    beforeSend: (jqXHR) => $.xhrPool.push(jqXHR),
-    complete: (jqXHR) => $.xhrPool.pop(),
-    success: (res, textStatus, jqXHR) =>
-      handleRequestSuccess(res, textStatus, jqXHR, action, successCallBack),
-    error: (jqXHR, textStatus, errorThrown) =>
-      handleRequestError(jqXHR, textStatus, errorThrown, action),
-  });
-  return req;
-}
-
-function handleRequestSuccess(res, textStatus, jqXHR, action, successCallBack) {
-  $("#pleaseWait").hide();
-  $("#rollbackForm").show();
-
-  try {
-    res = $.parseJSON(res);
-  } catch (e) {
-    addError(`${input.translation.jsonParseErrorForAction} [${action}].`);
-    return;
-  }
-
-  addQuickInfo(res.nextQuickInfo);
-  addError(res.nextErrors);
-  updateInfoStep(res.next_desc);
-
-  if (res.status !== "ok") {
-    addError(`${input.translation.errorDetectedDuring} [${action}].`);
-    return;
-  }
-
-  $("#" + action).addClass("done");
-  if (res.stepDone) {
-    $("#" + action).addClass("stepok");
-  }
-  // if a function "after[action name]" exists, it should be called now.
-  // This is used for enabling restore buttons for example
-  const funcName = "after" + ucFirst(action);
-  if (typeof window[funcName] === "function") {
-    call_function(funcName, res);
-  }
-
-  if (res.next !== "") {
-    // if next is rollback, prepare nextParams with rollbackDbFilename and rollbackFilesFilename
-    if (res.next === "Restore") {
-      res.nextParams.restoreName = "";
-    }
-    doAjaxRequest(res.next, res.nextParams, successCallBack);
-  } else {
-    // Way To Go, end of upgrade process
-    if (successCallBack) {
-      successCallBack();
-    }
-    addQuickInfo(input.translation.endOfProcess);
-  }
-}
-
-function handleRequestError(jqXHR, textStatus, errorThrown, action) {
-  $("#pleaseWait").hide();
-  $("#rollbackForm").show();
-
-  if (textStatus === "timeout") {
-    if (action === "download") {
-      addError(input.translation.cannotDownloadFile);
-    } else {
-      addError(`[Server Error] Timeout: ${input.translation.downloadTimeout}`);
-    }
-  } else {
-    try {
-      const res = $.parseJSON(jqXHR.responseText);
-      addQuickInfo(res.nextQuickInfo);
-      addError(res.nextErrors);
-      updateInfoStep(res.next_desc);
-    } catch (e) {
-      addError(
-        `[Ajax / Server Error for action: ${action}] textStatus: ${textStatus}, errorThrown: ${errorThrown}, jqXHR: ${jqXHR.responseText}`,
-      );
-    }
-  }
-}
-
-/**
- * prepareNextButton make the button button_selector available, and update the nextParams values
- *
- * @param button_selector $button_selector
- * @param nextParams $nextParams
- * @return void
- */
-function prepareNextButton(button_selector, nextParams) {
-  if (button_selector === "#Restore") {
-    $("#postUpdateChecklist").hide();
-  }
-
-  $(button_selector)
-    .unbind()
-    .click(function (e) {
-      e.preventDefault();
-      $("#currentlyProcessing").show();
-      var action = button_selector.substr(1);
-
-      if (action === 'UpdateInitialization') {
-        doAjaxRequest('BackupInitialization', nextParams, () => doAjaxRequest(action, nextParams));
-      } else {
-        doAjaxRequest(action, nextParams);
-      }
-    });
-}
-
-// ajax to check md5 files
-function addModifiedFileList(title, fileList, css_class, container) {
-  var subList = $('<ul class="changedFileList ' + css_class + '"></ul>');
-
-  $(fileList).each(function (k, v) {
-    $(subList).append("<li>" + v + "</li>");
-  });
-
-  $(container)
-    .append(
-      '<h3><a class="toggleSublist" href="#" >' +
-        title +
-        "</a> (" +
-        fileList.length +
-        ")</h3>",
-    )
-    .append(subList)
-    .append("<br/>");
-}
-
-// -- Should be executed only if ajaxUpgradeTabExists
-
-function isJsonString(str) {
-  try {
-    typeof str !== "undefined" && JSON.parse(str);
-  } catch (e) {
-    return false;
-  }
-  return true;
-}
-
-$(document).ready(function () {
-  $.ajax({
-    type: "POST",
-    url: input.adminUrl + "/autoupgrade/ajax-upgradetab.php",
-    async: true,
-    data: {
-      dir: input.adminDir,
-      token: input.token,
-      tab: input.tab,
-      action: "CompareReleases",
-      ajaxMode: "1",
-      params: {},
-    },
-    success: function (res, textStatus, jqXHR) {
-      if (isJsonString(res)) {
-        res = $.parseJSON(res);
-      } else {
-        res = { nextParams: { status: "error" } };
-      }
-      var answer = res.nextParams;
-      var $checkPrestaShopModifiedFiles = $("#checkPrestaShopModifiedFiles");
-
-      $checkPrestaShopModifiedFiles.html("<span> " + answer.msg + " </span> ");
-      if (answer.status === "error" || typeof answer.result === "undefined") {
-        $checkPrestaShopModifiedFiles.prepend(
-          '<img src="../img/admin/warning.gif" /> ',
-        );
-      } else {
-        $checkPrestaShopModifiedFiles
-          .prepend('<img src="../img/admin/warning.gif" /> ')
-          .append(
-            '<a id="toggleDiffList" class="button" href="">' +
-              input.translation.seeOrHideList +
-              "</a><br/>",
-          )
-          .append('<div id="diffList" style="display:none "><br/>');
-
-        if (answer.result.deleted.length) {
-          addModifiedFileList(
-            input.translation.filesWillBeDeleted,
-            answer.result.deleted,
-            "diffImportant",
-            "#diffList",
-          );
-        }
-        if (answer.result.modified.length) {
-          addModifiedFileList(
-            input.translation.filesWillBeReplaced,
-            answer.result.modified,
-            "diffImportant",
-            "#diffList",
-          );
-        }
-
-        $("#toggleDiffList").bind("click", function (e) {
-          e.preventDefault();
-          $("#diffList").toggle();
-        });
-
-        $("body")
-          .on()
-          .on("click", ".toggleSublist", function (e) {
-            e.preventDefault();
-            // this=a, parent=h3, next=ul
-            $(this).parent().next().toggle();
-          });
-      }
-    },
-    error: function (res, textStatus, jqXHR) {
-      if (textStatus === "timeout" && action === "download") {
-        updateInfoStep(input.translation.cannotDownloadFile);
-      } else {
-        // technical error : no translation needed
-        $("#checkPrestaShopFilesVersion").html(
-          '<img src="../img/admin/warning.gif" /> Error: Unable to check md5 files',
-        );
-      }
-    },
-  });
-});
-
-// -- END
-
-// advanced/normal mode
-function switch_to_advanced() {
-  $("input[name=btn_adv]").val(input.translation.lessOptions);
-  $("#advanced").show();
-}
-
-function switch_to_normal() {
-  $("input[name=btn_adv]").val(input.translation.moreOptions);
-  $("#advanced").hide();
-}
-
-$("input[name=btn_adv]").click(function (e) {
-  if ($("#advanced:visible").length) {
-    switch_to_normal();
-  } else {
-    switch_to_advanced();
-  }
-});
-
-$(document).ready(function () {
-  $("input[name|=submitConf], input[name=submitConf-channel]").bind(
-    "click",
-    function (e) {
-      var params = {};
-      var $newChannel = $("select[name=channel] option:selected").val();
-      var $oldChannel = $("select[name=channel] option.current").val();
-
-      $oldChannel = "";
-
-      if ($oldChannel != $newChannel) {
-        var validChannels = ["online"];
-        if (validChannels.indexOf($newChannel) !== -1) {
-          params.channel = $newChannel;
-        }
-
-        if ($newChannel === "local") {
-          var archive_zip = $("select[name=archive_zip]").val();
-          var archive_xml = $("select[name=archive_xml]").val();
-          if (!archive_zip && !archive_xml) {
-            showConfigResult(
-              input.translation.noArchiveAndXmlSelected,
-              "error",
-            );
-            return false;
-          } else if (!archive_zip) {
-            showConfigResult(input.translation.noArchiveSelected, "error");
-            return false;
-          } else if (!archive_xml) {
-            showConfigResult(input.translation.noXmlSelected, "error");
-            return false;
-          }
-          params.channel = "local";
-          params.archive_zip = archive_zip;
-          params.archive_xml = archive_xml;
-        }
-      }
-      // note: skipBackup is currently not used
-      if ($(this).attr("name") == "submitConf-skipBackup") {
-        var skipBackup = $("input[name=submitConf-skipBackup]:checked").length;
-        if (skipBackup == 0 || confirm(input.translation.confirmSkipBackup)) {
-          params.skip_backup = $(
-            "input[name=submitConf-skipBackup]:checked",
-          ).length;
-        } else {
-          $("input[name=submitConf-skipBackup]:checked").removeAttr("checked");
-          return false;
-        }
-      }
-
-      // note: preserveFiles is currently not used
-      if ($(this).attr("name") == "submitConf-preserveFiles") {
-        var preserveFiles = $(
-          "input[name=submitConf-preserveFiles]:checked",
-        ).length;
-        if (confirm(input.translation.confirmPreserveFileOptions)) {
-          params.preserve_files = $(
-            "input[name=submitConf-preserveFiles]:checked",
-          ).length;
-        } else {
-          $("input[name=submitConf-skipBackup]:checked").removeAttr("checked");
-          return false;
-        }
-      }
-      var res = doAjaxRequest("UpdateConfig", params);
-    },
-  );
-});
diff --git a/upgrade/legacy-to-standard-locales.json b/upgrade/legacy-to-standard-locales.json
deleted file mode 100644
index a822ace88..000000000
--- a/upgrade/legacy-to-standard-locales.json
+++ /dev/null
@@ -1,82 +0,0 @@
-{
-  "an": "an-AR",
-  "af": "af-ZA",
-  "ag": "es-AR",
-  "ar": "ar-SA",
-  "az": "az-AZ",
-  "bg": "bg-BG",
-  "bn": "bn-BD",
-  "bs": "bs-BA",
-  "br": "pt-BR",
-  "bz": "br-FR",
-  "ca": "ca-ES",
-  "cb": "es-CO",
-  "cs": "cs-CZ",
-  "da": "da-DK",
-  "de": "de-DE",
-  "dh": "de-CH",
-  "el": "el-GR",
-  "en": "en-US",
-  "eo": "eo-EO",
-  "es": "es-ES",
-  "et": "et-EE",
-  "eu": "eu-ES",
-  "fa": "fa-IR",
-  "fi": "fi-FI",
-  "tl": "tl-PH",
-  "fo": "fo-FO",
-  "fr": "fr-FR",
-  "ga": "ga-IE",
-  "gb": "en-GB",
-  "gl": "gl-ES",
-  "gu": "gu-IN",
-  "he": "he-IL",
-  "hi": "hi-IN",
-  "hr": "hr-HR",
-  "hu": "hu-HU",
-  "hy": "hy-AM",
-  "id": "id-ID",
-  "it": "it-IT",
-  "is": "is-IS",
-  "ja": "ja-JP",
-  "ka": "ka-GE",
-  "km": "km-KH",
-  "ko": "ko-KR",
-  "ku": "ku-IQ",
-  "lo": "lo-LA",
-  "lt": "lt-LT",
-  "lv": "lv-LV",
-  "mg": "mg-MG",
-  "mk": "mk-MK",
-  "ml": "ml-IN",
-  "ms": "ms-MY",
-  "mx": "es-MX",
-  "nl": "nl-NL",
-  "nn": "nn-NO",
-  "no": "no-NO",
-  "pl": "pl-PL",
-  "pe": "es-PE",
-  "pt": "pt-PT",
-  "qc": "fr-CA",
-  "ro": "ro-RO",
-  "ru": "ru-RU",
-  "sh": "si-LK",
-  "si": "sl-SI",
-  "sk": "sk-SK",
-  "sq": "sq-AL",
-  "sr": "sr-CS",
-  "sv": "sv-SE",
-  "sw": "sw-KE",
-  "ta": "ta-IN",
-  "te": "te-IN",
-  "th": "th-TH",
-  "tr": "tr-TR",
-  "tw": "zh-TW",
-  "ug": "ug-CN",
-  "uk": "uk-UA",
-  "ur": "ur-PK",
-  "uz": "uz-UZ",
-  "ve": "es-VE",
-  "vn": "vi-VN",
-  "zh": "zh-CN"
-}
diff --git a/views/templates/block/activityLog.html.twig b/views/templates/block/activityLog.html.twig
deleted file mode 100644
index 569011bc2..000000000
--- a/views/templates/block/activityLog.html.twig
+++ /dev/null
@@ -1,68 +0,0 @@
-<div class="bootstrap" id="activityLogBlock" style="display:none">
-    <div class="panel">
-        <div class="panel-heading">
-            {{ 'Activity Log'|trans({}) }}
-        </div>
-
-        <div>
-            <div id="upgradeResultToDoList" style="display: none;" class="alert alert-info col-xs-12"></div>
-        </div>
-
-        <div class="row">
-            <div id="currentlyProcessing" class="col-xs-12" style="display:none;">
-                <h4 id="pleaseWait">{{ 'Currently processing'|trans({}) }} <img class="pleaseWait"
-                                                                                src="{{ psBaseUri }}img/loader.gif" />
-                </h4>
-                <div id="infoStep" class="processing">{{ 'Analyzing the situation...'|trans({}) }}</div>
-            </div>
-        </div>
-        <div id="quickInfo" class="clear processing" style="margin-top: 15px;"></div>
-        {# this block will show errors and important warnings that happens during upgrade #}
-        <div class="row">
-            <div id="errorDuringUpgrade" class="col-xs-12" style="display:none;">
-                <h4>{{ 'Errors'|trans({}) }}</h4>
-                <div id="infoError" class="processing"></div>
-                <button id="reportErrorButton" class="btn btn-warning" style="margin-top: 10px;" data-toggle="modal"
-                        data-target="#errorModal">
-                    {{ 'Report a bug'|trans({}) }}
-                </button>
-            </div>
-
-            <div id="errorModal" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
-                <div class="modal-dialog modal-dialog-centered" role="document">
-                    <div class="modal-content">
-                        <div class="modal-header">
-                            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                                <span aria-hidden="true">&times;</span>
-                            </button>
-                            <h3 class="modal-title">
-                                {{ 'Give feedbacks'|trans({}) }}
-                            </h3>
-                        </div>
-                        <div class="modal-body">
-                            <label for="userEmail">
-                                {{ 'Email'|trans({}) }}
-                            </label>
-                            <input id="userEmail" type="text" class="form-control" placeholder="{{ 'Email'|trans({}) }}"
-                                   style="display: block; margin-bottom: 10px;">
-                            <label for="errorDescription">
-                                {{ 'Description'|trans({}) }}
-                            </label>
-                            <textarea id="errorDescription" rows="3"
-                                      placeholder="{{ 'Give us details about the error'|trans({}) }}"></textarea>
-                        </div>
-                        <div class="modal-footer">
-                            <button type="button" class="btn btn-secondary" data-dismiss="modal"
-                                    style="text-transform: uppercase;">
-                                {{ 'Cancel'|trans({}) }}
-                            </button>
-                            <button id="submitErrorReport" type="button" class="btn btn-primary">
-                                {{ 'Send a bug report'|trans({}) }}
-                            </button>
-                        </div>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </div>
-</div>
diff --git a/views/templates/block/checklist.html.twig b/views/templates/block/checklist.html.twig
deleted file mode 100644
index e78da51ae..000000000
--- a/views/templates/block/checklist.html.twig
+++ /dev/null
@@ -1,221 +0,0 @@
-{% import "@ModuleAutoUpgrade/macros/icons.html.twig" as icons %}
-
-<div class="bootstrap" id="currentConfigurationBlock">
-    <div class="panel">
-        <div class="panel-heading">
-            {{ 'The pre-Upgrade checklist'|trans({}) }}
-        </div>
-        {% if not moduleIsUpToDate %}
-            <p class="alert alert-warning">
-                {{ 'Your current version of the module is out of date. Update now'|trans({}) }}
-                <a href=" {{ moduleUpdateLink }} ">{{ 'Modules > Module Manager > Updates'|trans({}) }}</a>
-            </p>
-        {% endif %}
-        {% if showErrorMessage %}
-            <p class="alert alert-warning">{{ 'The checklist is not OK. You can only upgrade your shop once all indicators are green.'|trans({}) }}</p>
-        {% endif %}
-        <div id="currentConfiguration">
-            <p class="alert alert-info">{{ 'Before starting the upgrade process, please make sure this checklist is all green.'|trans({}) }}</p>
-            <table class="table" cellpadding="0" cellspacing="0">
-                {% if phpRequirementsState != constant('PrestaShop\\Module\\AutoUpgrade\\Services\\PhpVersionResolverService::COMPATIBILITY_VALID') %}
-                    <tr>
-                        <td>
-                            {% if phpRequirementsState == constant('PrestaShop\\Module\\AutoUpgrade\\Services\\PhpVersionResolverService::COMPATIBILITY_INVALID') %}
-                                {{ 'Your current PHP version isn\'t compatible with your PrestaShop version. (Expected: %s - %s | Current: %s)'|trans([
-                                    phpCompatibilityRange['php_min_version'],
-                                    phpCompatibilityRange['php_max_version'],
-                                    phpCompatibilityRange['php_current_version'],
-                                ]) }}
-                            {% else %}
-                                {{ 'We were unable to check your PHP compatibility with the destination PrestaShop version.'|trans({}) }}
-                            {% endif %}
-                        </td>
-                        <td>
-                            {% if phpRequirementsState == constant('PrestaShop\\Module\\AutoUpgrade\\Services\\PhpVersionResolverService::COMPATIBILITY_INVALID') %}
-                                {{ icons.nok(psBaseUri) }}
-                            {% else %}
-                                {{ icons.warning(psBaseUri) }}
-                            {% endif %}
-                        </td>
-                    </tr>
-                {% endif %}
-                <tr>
-                    <td>{{ 'Your store\'s root directory (%s) is writable (with appropriate CHMOD permissions).'|trans([rootDirectory]) }}</td>
-                    <td>
-                        {% if rootDirectoryIsWritable %}
-                            {{ icons.ok(psBaseUri) }}
-                        {% else %}
-                            {{ icons.nok(psBaseUri) }}
-                        {% endif %}
-                    </td>
-                </tr>
-                {% if adminDirectoryWritableReport %}
-                    <tr>
-                        <td>{{ 'The "/admin/autoupgrade" directory is writable (appropriate CHMOD permissions)'|trans({}) }}</td>
-                        <td>
-                            {% if adminDirectoryIsWritable %}
-                                {{ icons.ok(psBaseUri) }}
-                            {% else %}
-                                {{ icons.nok(psBaseUri) }} {{ adminDirectoryWritableReport }}
-                            {% endif %}
-                        </td>
-                    </tr>
-                {% endif %}
-                <tr>
-                    <td>{{ 'PHP\'s "Safe mode" option is turned off'|trans({})|raw }}</td>
-                    <td>
-                        {% if safeModeIsDisabled %}
-                            {{ icons.ok(psBaseUri) }}
-                        {% else %}
-                            {{ icons.warning(psBaseUri) }}
-                        {% endif %}
-                    </td>
-                </tr>
-                <tr>
-                    <td>{{ 'PHP\'s "allow_url_fopen" option is turned on, or cURL is installed'|trans({})|raw }}</td>
-                    <td>
-                        {% if allowUrlFopenOrCurlIsEnabled %}
-                            {{ icons.ok(psBaseUri) }}
-                        {% else %}
-                            {{ icons.nok(psBaseUri) }}
-                        {% endif %}
-                    </td>
-                </tr>
-                <tr>
-                    <td>{{ 'PHP\'s "zip" extension is enabled'|trans({})|raw }}</td>
-                    <td>
-                        {% if zipIsEnabled %}
-                            {{ icons.ok(psBaseUri) }}
-                        {% else %}
-                            {{ icons.nok(psBaseUri) }}
-                        {% endif %}
-                    </td>
-                </tr>
-                {% if not isLocalEnvironment %}
-                    <tr>
-                        <td>
-                            {% if storeIsInMaintenance %}
-                                {{ 'Your store is in maintenance mode'|trans({}) }}
-                            {% else %}
-                                {{ 'Enable maintenance mode and add your maintenance IP in [1]Shop parameters > General > Maintenance[/1]'|trans({
-                                    '[1]' : '<a href="' ~ maintenanceLink ~'" target="_blank">',
-                                    '[/1]' : '</a>',
-                                })|raw }}
-                            {% endif %}
-                        </td>
-                        <td>
-                            {% if storeIsInMaintenance %}
-                                {{ icons.ok(psBaseUri) }}
-                            {% else %}
-                                {{ icons.nok(psBaseUri) }}
-                            {% endif %}
-                        </td>
-                    </tr>
-                {% endif %}
-                <tr>
-                    <td>{{ 'PrestaShop\'s caching features are disabled'|trans({}) }}</td>
-                    <td>
-                        {% if cachingIsDisabled %}
-                            {{ icons.ok(psBaseUri) }}
-                        {% else %}
-                            {{ icons.nok(psBaseUri) }}
-                        {% endif %}
-                    </td>
-                </tr>
-                <tr>
-                    <td>
-                        {% if maxExecutionTime == 0 %}
-                            {{ 'PHP\'s max_execution_time setting has a high value or is disabled entirely (current value: unlimited)'|trans({}) }}
-                        {% else %}
-                            {{ 'PHP\'s max_execution_time setting has a high value or is disabled entirely (current value: %s seconds)'|trans([maxExecutionTime]) }}
-                        {% endif %}
-                    </td>
-                    <td>
-                        {% if maxExecutionTime == 0 %}
-                            {{ icons.ok(psBaseUri) }}
-                        {% else %}
-                            {{ icons.warning(psBaseUri) }}
-                        {% endif %}
-                    </td>
-                </tr>
-                {% if not checkApacheModRewrite %}
-                    <tr>
-                        <td>{{ 'Apache mod_rewrite is disabled.'|trans({}) }}</td>
-                        <td>{{ icons.nok(psBaseUri) }}</td>
-                    </tr>
-                {% endif %}
-                {% if notLoadedPhpExtensions|length > 0 %}
-                    <tr>
-                        <td>
-                            {% if notLoadedPhpExtensions|length > 1 %}
-                                {{ 'The following PHP extensions are not installed: %s.'|trans([notLoadedPhpExtensions|join(', ')]) }}
-                            {% else %}
-                                {{ 'The following PHP extension is not installed: %s.'|trans([notLoadedPhpExtensions|first]) }}
-                            {% endif %}
-                        </td>
-                        <td>{{ icons.nok(psBaseUri) }}</td>
-                    </tr>
-                {% endif %}
-                {% if not checkMemoryLimit %}
-                    <tr>
-                        <td>{{ 'PHP memory_limit is inferior to 256 MB.'|trans({}) }}</td>
-                        <td>{{ icons.nok(psBaseUri) }}</td>
-                    </tr>
-                {% endif %}
-                {% if not checkFileUploads %}
-                    <tr>
-                        <td>{{ 'PHP file_uploads configuration is disabled.'|trans({}) }}</td>
-                        <td>{{ icons.nok(psBaseUri) }}</td>
-                    </tr>
-                {% endif %}
-                {% if notExistsPhpFunctions|length > 0 %}
-                    <tr>
-                        <td>
-                            {% if notExistsPhpFunctions|length > 1 %}
-                                {{ 'The following PHP functions are not installed: %s.'|trans([notExistsPhpFunctions|join(', ')]) }}
-                            {% else %}
-                                {{ 'The following PHP function is not installed: %s.'|trans([notExistsPhpFunctions|first]) }}
-                            {% endif %}
-                        </td>
-                        <td>{{ icons.nok(psBaseUri) }}</td>
-                    </tr>
-                {% endif %}
-                {% if not checkKeyGeneration %}
-                  <tr>
-                    <td>{{ 'Unable to generate private keys using openssl_pkey_new. Check your OpenSSL configuration, especially the path to openssl.cafile.'|trans({}) }}</td>
-                    <td>{{ icons.nok(psBaseUri) }}</td>
-                  </tr>
-                {% endif %}
-                {% if notWritingDirectories|length > 0 %}
-                    <tr>
-                        <td>
-                            {{ 'It\'s not possible to write in the following folders:'|trans({}) }}
-                            <ul>
-                                {% for missingFile in notWritingDirectories %}
-                                    <li>{{ missingFile }}</li>
-                                {% endfor %}
-                            </ul>
-                        </td>
-                        <td>{{ icons.nok(psBaseUri) }}</td>
-                    </tr>
-                {% endif %}
-                {% if not isShopVersionMatchingVersionInDatabase %}
-                    <tr>
-                        <td>
-                            {{ 'The version of PrestaShop does not match the one stored in database. Your database structure may not be up-to-date and/or the value of PS_VERSION_DB needs to be updated in the configuration table. [1]Learn more[/1].'|trans({
-                                '[1]': '<a href="https://devdocs.prestashop-project.org/8/faq/upgrade#the-version-of-prestashop-does-not-match-the-one-stored-in-database" target="_blank">',
-                                '[/1]': '</a>',
-                            })|raw }}
-                        </td>
-                        <td>{{ icons.nok(psBaseUri) }}</td>
-                    </tr>
-                {% endif %}
-            </table>
-            <br>
-            <p class="alert alert-info">{{ 'Please also make sure you make a full manual backup of your files and database.'|trans({}) }}</p>
-            {% if showErrorMessage %}
-                <p class="alert alert-danger">{{ 'PrestaShop requirements are not satisfied.'|trans({}) }}</p>
-            {% endif %}
-        </div>
-    </div>
-</div>
diff --git a/views/templates/block/footer.html.twig b/views/templates/block/footer.html.twig
deleted file mode 100644
index cd47f31be..000000000
--- a/views/templates/block/footer.html.twig
+++ /dev/null
@@ -1,9 +0,0 @@
-<div style="display: flex; justify-content: center;">
-    <a class="btn" style="display: flex; align-items: center;"
-       href="https://www.prestashop-project.org/data-transparency/" target="_blank">
-        <i class="material-icons" style="font-size: 18px; margin-right: 4px;">
-            launch
-        </i>
-        {{ 'Privacy policy'|trans({}) }}
-    </a>
-</div>
diff --git a/views/templates/block/index.php b/views/templates/block/index.php
deleted file mode 100644
index 45df26c54..000000000
--- a/views/templates/block/index.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-/**
- * Copyright since 2007 PrestaShop SA and Contributors
- * PrestaShop is an International Registered Trademark & Property of PrestaShop SA
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Academic Free License 3.0 (AFL-3.0)
- * that is bundled with this package in the file LICENSE.md.
- * It is also available through the world-wide-web at this URL:
- * https://opensource.org/licenses/AFL-3.0
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@prestashop.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
- * versions in the future. If you wish to customize PrestaShop for your
- * needs please refer to https://devdocs.prestashop.com/ for more information.
- *
- * @author    PrestaShop SA and Contributors <contact@prestashop.com>
- * @copyright Since 2007 PrestaShop SA and Contributors
- * @license   https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
- */
-header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
-header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
-
-header('Cache-Control: no-store, no-cache, must-revalidate');
-header('Cache-Control: post-check=0, pre-check=0', false);
-header('Pragma: no-cache');
-
-header('Location: ../');
-exit;
diff --git a/views/templates/block/postRestoreChecklistBlock.html.twig b/views/templates/block/postRestoreChecklistBlock.html.twig
deleted file mode 100644
index f92617809..000000000
--- a/views/templates/block/postRestoreChecklistBlock.html.twig
+++ /dev/null
@@ -1,39 +0,0 @@
-<div id="postRestoreChecklist" style="display: none; margin-top: 10px;">
-    <div class="alert alert-success">
-        <div style="display: flex;">
-            <div>
-                <div style="font-weight: bold;">
-                    {{ 'Your restoration is complete'|trans({}) }}
-                </div>
-                {{ 'Before continuing with your tasks, please review the following checklist to ensure smooth operation after recent recovery.'|trans({}) }}
-            </div>
-            <div style="margin-left: auto">
-                <a class="btn btn-primary" target="_blank"
-                   href="https://devdocs.prestashop-project.org/8/basics/keeping-up-to-date/upgrade-module/post-restore-checklist/">
-                    <i class="material-icons" style="font-size: 18px; margin-right: 4px;">
-                        launch
-                    </i>
-                    {{ 'Open developer documentation'|trans({}) }}
-                </a>
-            </div>
-        </div>
-    </div>
-
-    <div class="panel">
-        <div class="panel-heading">
-            {{ 'Next steps'|trans({}) }}
-        </div>
-        <ul>
-            <li>{{ 'Disable the maintenance mode in General settings > Maintenance.'|trans({}) }}</li>
-        </ul>
-    </div>
-
-    <div class="panel">
-        <div class="panel-heading">
-            {{ 'Troubleshooting'|trans({}) }}
-        </div>
-        <ul>
-            <li>{{ 'If you can\'t access your back office, try emptying the cache.'|trans({}) }}</li>
-        </ul>
-    </div>
-</div>
diff --git a/views/templates/block/postUpdateChecklistBlock.html.twig b/views/templates/block/postUpdateChecklistBlock.html.twig
deleted file mode 100644
index 3b6d0c8c6..000000000
--- a/views/templates/block/postUpdateChecklistBlock.html.twig
+++ /dev/null
@@ -1,45 +0,0 @@
-<div id="postUpdateChecklist" style="display: none; margin-top: 10px;">
-    <div class="alert alert-success">
-        <div style="display: flex;">
-            <div>
-                <div style="font-weight: bold;">
-                    {{ 'Your store is up to date'|trans({}) }}
-                </div>
-                {{ 'Before continuing with your tasks, please review the following checklist to ensure smooth operation after recent updates'|trans({}) }}
-            </div>
-            <div style="margin-left: auto">
-                <a class="btn btn-primary" target="_blank"
-                   href="https://devdocs.prestashop-project.org/8/basics/keeping-up-to-date/upgrade-module/post-update-checklist/">
-                    <i class="material-icons" style="font-size: 18px; margin-right: 4px;">
-                        launch
-                    </i>
-                    {{ 'Open developer documentation'|trans({}) }}
-                </a>
-            </div>
-        </div>
-    </div>
-
-    <div class="panel">
-        <div class="panel-heading">
-            {{ 'Next steps'|trans({}) }}
-        </div>
-        <ul>
-            <li>{{ 'Re-enable and check your modules one by one.'|trans({}) }}</li>
-            <li>{{ 'Make sure your store\'s front office is working properly: try to create an account, place an order, add a product, etc.'|trans({}) }}</li>
-            <li>{{ 'Disable the maintenance mode in General settings > Maintenance.'|trans({}) }}</li>
-        </ul>
-    </div>
-
-    <div class="panel">
-        <div class="panel-heading">
-            {{ 'Troubleshooting'|trans({}) }}
-        </div>
-        <ul>
-            <li>{{ 'If some images don\'t appear in the front office, try regenerating thumbnails in Preferences > Images.'|trans({}) }}</li>
-            {% if PS_AUTOUP_BACKUP %}
-                <li>{{ 'If something\'s wrong, you can restore a backup with this module. Your backup is available at {admin}/autoupgrade/backup.'|trans({}) }}</li>
-            {% endif %}
-            <li>{{ 'If you can\'t access your back office, try enabling the debug mode manually in config/defines.inc.php by setting _PS_MODE_DEV_ to true.'|trans({}) }}</li>
-        </ul>
-    </div>
-</div>
diff --git a/views/templates/block/rollbackForm.html.twig b/views/templates/block/rollbackForm.html.twig
deleted file mode 100644
index bcd963911..000000000
--- a/views/templates/block/rollbackForm.html.twig
+++ /dev/null
@@ -1,33 +0,0 @@
-<div class="bootstrap" id="rollbackForm">
-    <div class="panel">
-        <div class="panel-heading">
-            {{ 'Rollback'|trans({}) }}
-        </div>
-        <p class="alert alert-info">
-            {{ 'After upgrading your shop, you can rollback to the previous database and files. Use this function if your theme or an essential module is not working correctly.'|trans({}) }}
-        </p>
-
-        <div class="row" id="restoreBackupContainer">
-            <label class="col-lg-3 control-label text-right">{{ 'Choose your backup:'|trans({}) }}</label>
-            <div class="col-lg-9">
-                <select name="restoreName">
-                    <option value="0">{{ '-- Choose a backup to restore --'|trans({}) }}</option>
-                    ';
-                    {% if availableBackups is not empty %}
-                        {% for backupName in availableBackups %}
-                            <option value="{{ backupName }}">{{ backupName }}</option>
-                        {% endfor %}
-                    {% endif %}
-                </select>
-                <span id="buttonDeleteBackup"></span>
-            </div>
-        </div>
-        <br>
-        <div class="row">
-            <p id="rollbackContainer" class="col-lg-offset-3 col-lg-9">
-                <a disabled="disabled" class="upgradestep button btn btn-primary" href=""
-                   id="Restore">{{ 'Rollback'|trans({}) }}</a>
-            </p>
-        </div>
-    </div>
-</div>
diff --git a/views/templates/block/upgradeButtonBlock.html.twig b/views/templates/block/upgradeButtonBlock.html.twig
deleted file mode 100644
index 98a0cc944..000000000
--- a/views/templates/block/upgradeButtonBlock.html.twig
+++ /dev/null
@@ -1,141 +0,0 @@
-<div class="bootstrap" id="upgradeButtonBlock">
-    <div class="panel">
-        <div class="panel-heading">
-            {{ 'Start your Upgrade'|trans({}) }}
-        </div>
-        <div class="blocOneClickUpgrade">
-            {% if isLastVersion %}
-                <p class="alert alert-success">{{ 'Congratulations, you are already using the latest version available!'|trans({}) }}</p>
-            {% endif %}
-            <p>
-                {{ 'Your current PrestaShop version'|trans({}) }}: <strong>{{ currentPsVersion }}</strong>
-            </p>
-            <p>
-                {{ 'Your current PHP version'|trans({}) }}: <strong>{{ phpVersion }}</strong>
-            </p>
-            {% if not isLastVersion %}
-                <p>{{ 'Version available on channel %s:'|trans([channel]) }} <strong>{{ destinationVersion }}</strong></p>
-            {% endif %}
-        </div>
-        <br>
-        {% if showUpgradeButton %}
-            <div>
-                <a href="#" id="UpdateInitialization"
-                   class="button-autoupgrade upgradestep btn btn-primary">{{ 'Upgrade PrestaShop now!'|trans({}) }}</a>
-                {% if showUpgradeLink %}
-                    <small><a href="{{ upgradeLink }}">{{ 'PrestaShop will be downloaded from %s'|trans([upgradeLink]) }}</a></small>
-                    {% if changelogLink is not empty %}
-                        <p>
-                            <a href="{{ changelogLink }}"
-                               target="_blank">{{ 'Open changelog in a new window'|trans({}) }}</a>
-                        </p>
-                    {% endif %}
-                {% else %}
-                    {{ 'No file will be downloaded (channel %s is used)'|trans([channel]) }}
-                {% endif %}
-            </div>
-            {% if skipActions is not empty %}
-                <div id="skipAction-list" class="alert alert-warning">
-                    <p>{{ 'The following action are automatically replaced'|trans({}) }}</p>
-                    <ul>
-                        {% for old, new in skipActions %}
-                            <li>
-                                {{ '%old% will be replaced by %new%'|trans({'%old%': old, '%new%': new}) }}
-                            </li>
-                        {% endfor %}
-                    </ul>
-                    <p>{{ 'To change this behavior, you need to manually edit your php files'|trans({}) }}</p>
-                </div>
-            {% endif %}
-        {% endif %}
-        <br>
-        <p>
-            {% if showUpgradeButton %}
-                <a class="button button-autoupgrade btn btn-default"
-                   href="index.php?controller=AdminSelfUpgrade&amp;token={{ token }}&amp;refreshCurrentVersion=1">{{ 'Refresh the page'|trans({}) }}</a> -
-            {% else %}
-                <a class="button button-autoupgrade btn btn-primary"
-                   href="index.php?controller=AdminSelfUpgrade&amp;token={{ token }}&amp;refreshCurrentVersion=1">{{ 'Check if a new version is available'|trans({}) }}</a> -
-            {% endif %}
-            <span style="font-style: italic; font-size: 11px;">{% if lastVersionCheck %}
-                    {{ 'Last check: %s'|trans([lastVersionCheck|date('Y-m-d H:i:s')]) }}
-                {% else %}
-                    {{ 'Last check: never'|trans({}) }}
-                {% endif %}
-            </span>
-        </p>
-
-        <!-- advanced configuration -->
-        <div class="row">
-            <div class="pull-right">
-                <p><input type="button" class="button btn btn-warning" name="btn_adv"
-                          value="{{ 'More options (Expert mode)'|trans({}) }}" /></p>
-            </div>
-            <div class="col-xs-12">
-                <p class="alert alert-info" style="display:none;" id="configResult">&nbsp;</p>
-                <div id="advanced" style="margin-top: 30px;">
-                    <div class="panel-heading">
-                        {{ 'Expert mode'|trans({}) }}
-                    </div>
-                    <h4 style="margin-top: 0">{{ 'Please select your channel:'|trans({}) }}</h4>
-                    <p>
-                        {{ 'Channels are offering you different ways to perform an upgrade. You can either upload the new version manually or let the Update assistant module download it for you.'|trans({}) }}
-                        <br>
-                        {{ 'The Alpha, Beta and Private channels give you the ability to upgrade to a non-official or unstable release (for testing purposes only).'|trans({}) }}
-                        <br>
-                        {{ 'By default, you should use the "Minor release" channel which is offering the latest stable version available.'|trans({})|raw }}
-                    </p>
-                    <br>
-                    <label for="channel">{{ 'Channel:'|trans({}) }}</label>
-                    <select name="channel" id="channel">
-                        {% for channelOpt in channelOptions %}
-                            {% set selected = (channel == channelOpt[1]) %}
-                            <option id="{{ channelOpt[0] }}" value="{{ channelOpt[1] }}"
-                                    {% if selected %}class="current" selected{% endif %}>
-                                {% if selected %}* {% endif %}{{ channelOpt[2] }}
-                            </option>
-                        {% endfor %}
-                    </select>
-                    <div id="for-useLocal">
-                        {% if archiveFiles is not empty %}
-                            <label for="archive_zip">{{ 'Archive to use:'|trans({}) }} *</label>
-                            <div>
-                                <select id="archive_zip" name="archive_zip" required>
-                                    <option value="">{{ 'Choose an archive'|trans({}) }}</option>
-                                    {% for file in archiveFiles %}
-                                        {% set fileName = file|replace({(downloadPath): ''}) %}
-                                        <option {% if archiveFileName == fileName %} selected{% endif %}
-                                                value="{{ fileName }}">{{ fileName }}</option>
-                                    {% endfor %}
-                                </select>
-                                <br>
-                                <label for="archive_xml">{{ 'XML file to use:'|trans({}) }} *</label>
-                                <select id="archive_xml" name="archive_xml" required>
-                                    <option value="">{{ 'Choose an XML file'|trans({}) }}</option>
-                                    {% for file in xmlFiles %}
-                                        {% set fileName = file|replace({(downloadPath): ''}) %}
-                                        <option {% if xmlFileName == fileName %} selected{% endif %}
-                                                value="{{ fileName }}">{{ fileName }}</option>
-                                    {% endfor %}
-                                </select>
-                            </div>
-                        {% else %}
-                            <div class="alert alert-warning">{{ 'No archive found in your admin/autoupgrade/download directory'|trans({}) }}</div>
-                        {% endif %}
-                        <div class="margin-form">
-                            {{ 'Save in the following directory the archive file and XML file of the version you want to upgrade to: %s'|trans(['<b>/admin/autoupgrade/download/</b>'])|raw }}
-                            <br>
-                            {{ 'Click to save once the archive is there.'|trans({}) }}<br>
-                            {{ 'This option will skip the download step.'|trans({}) }}
-                        </div>
-                    </div>
-                    <br>
-                    <p>
-                        <input type="button" class="button btn btn-primary" value="{{ 'Save'|trans({}) }}"
-                               name="submitConf-channel">
-                    </p>
-                </div>
-            </div>
-        </div>
-    </div>
-</div>
diff --git a/views/templates/block/versionComparison.html.twig b/views/templates/block/versionComparison.html.twig
deleted file mode 100644
index ce69a65ef..000000000
--- a/views/templates/block/versionComparison.html.twig
+++ /dev/null
@@ -1,13 +0,0 @@
-<div class="bootstrap" id="comparisonBlock">
-    <div class="panel">
-        <div class="panel-heading">
-            {{ 'Version comparison'|trans({}) }}
-        </div>
-        <p>
-            <b>{{ 'Differences between versions'|trans({}) }}:</b><br>
-            <span id="checkPrestaShopModifiedFiles">
-                <img id="pleaseWait" src="{{ psBaseUri }}img/loader.gif" />
-            </span>
-        </p>
-    </div>
-</div>
diff --git a/views/templates/macros/form-fields.html.twig b/views/templates/macros/form-fields.html.twig
deleted file mode 100644
index 3f53f7ff5..000000000
--- a/views/templates/macros/form-fields.html.twig
+++ /dev/null
@@ -1,14 +0,0 @@
-{% macro select(labelText, inputId, options) %}
-  <div class="form-group">
-    <label for="{{ inputId }}">
-      {{ labelText|trans({}) }}
-    </label>
-    <select class="form-control" id="{{ inputId }}">
-      {% for option in options %}
-        <option value="{{ option }}">
-          {{ option }}
-        </option>
-      {% endfor %}
-    </select>
-  </div>
-{% endmacro %}
diff --git a/views/templates/macros/icons.html.twig b/views/templates/macros/icons.html.twig
deleted file mode 100644
index 1983a20e7..000000000
--- a/views/templates/macros/icons.html.twig
+++ /dev/null
@@ -1,26 +0,0 @@
-{% macro ok(psBaseUri) %}
-  <img
-    src="{{ psBaseUri }}img/admin/enabled.gif"
-    width="16"
-    height="16"
-    alt="ok"
-  />
-{% endmacro %}
-
-{% macro nok(psBaseUri) %}
-  <img
-    src="{{ psBaseUri }}img/admin/disabled.gif"
-    width="16"
-    height="16"
-    alt="nok"
-  />
-{% endmacro %}
-
-{% macro warning(psBaseUri) %}
-  <img
-    src="{{ psBaseUri }}img/admin/warning.gif"
-    width="16"
-    height="16"
-    alt="warn"
-  />
-{% endmacro %}
diff --git a/views/templates/macros/index.php b/views/templates/macros/index.php
deleted file mode 100644
index 45df26c54..000000000
--- a/views/templates/macros/index.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-/**
- * Copyright since 2007 PrestaShop SA and Contributors
- * PrestaShop is an International Registered Trademark & Property of PrestaShop SA
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Academic Free License 3.0 (AFL-3.0)
- * that is bundled with this package in the file LICENSE.md.
- * It is also available through the world-wide-web at this URL:
- * https://opensource.org/licenses/AFL-3.0
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@prestashop.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
- * versions in the future. If you wish to customize PrestaShop for your
- * needs please refer to https://devdocs.prestashop.com/ for more information.
- *
- * @author    PrestaShop SA and Contributors <contact@prestashop.com>
- * @copyright Since 2007 PrestaShop SA and Contributors
- * @license   https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
- */
-header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
-header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
-
-header('Cache-Control: no-store, no-cache, must-revalidate');
-header('Cache-Control: post-check=0, pre-check=0', false);
-header('Pragma: no-cache');
-
-header('Location: ../');
-exit;
diff --git a/views/templates/main.html.twig b/views/templates/main.html.twig
deleted file mode 100644
index cf6a2cb6d..000000000
--- a/views/templates/main.html.twig
+++ /dev/null
@@ -1,60 +0,0 @@
-<script>
-  var jQueryVersionPS = parseInt($().jquery.replace(/\./g, ''));
-</script>
-<script src="{{ psBaseUri }}modules/autoupgrade/js/jquery-1.6.2.min.js"></script>
-<script src="{{ psBaseUri }}modules/autoupgrade/js/sentry-8.2.1.min.js"></script>
-<script>
-  if (jQueryVersionPS >= 162) {
-    jq162 = jQuery.noConflict(true);
-  }
-</script>
-
-<link
-  type="text/css"
-  rel="stylesheet"
-  href="{{ psBaseUri }}modules/autoupgrade/css/styles.css"
-/>
-
-<div class="bootstrap" id="informationBlock">
-  <div class="panel">
-    <div class="panel-heading">
-      {{ "Welcome!"|trans({}) }}
-    </div>
-    <p>
-      {{ "Upgrade your store to benefit from the latest improvements, bug fixes and security patches."|trans({}) }}
-    </p>
-    <p class="alert alert-warning">
-      {{ "Upgrading your store on your own can be risky. If you don\'t feel comfortable doing the upgrade yourself, many agencies and developers in your area may also provide this kind of service."|trans({}) }}
-    </p>
-  </div>
-</div>
-
-{# content #}
-{% include "@ModuleAutoUpgrade/block/checklist.html.twig" %}
-{% include "@ModuleAutoUpgrade/block/upgradeButtonBlock.html.twig" %}
-
-{% include "@ModuleAutoUpgrade/block/versionComparison.html.twig" %}
-{% include "@ModuleAutoUpgrade/block/postUpdateChecklistBlock.html.twig" %}
-{% include "@ModuleAutoUpgrade/block/postRestoreChecklistBlock.html.twig" %}
-{% include "@ModuleAutoUpgrade/block/activityLog.html.twig" %}
-
-{% include "@ModuleAutoUpgrade/block/rollbackForm.html.twig" %}
-
-<form
-  action="{{ currentIndex }}&amp;customSubmitAutoUpgrade=1&amp;token={{ token }}"
-  method="post"
-  class="form-horizontal"
-  enctype="multipart/form-data"
->
-  {{ backupOptions|raw }}
-  {{ upgradeOptions|raw }}
-</form>
-
-{% include "@ModuleAutoUpgrade/block/footer.html.twig" %}
-
-<script src="{{ psBaseUri }}modules/autoupgrade/js/jquery.xml2json.js"></script>
-<script>
-  var input = {{ jsParams|json_encode|raw }};
-</script>
-<script src="{{ psBaseUri }}modules/autoupgrade/js/upgrade.js"></script>
-<script src="{{ psBaseUri }}modules/autoupgrade/js/sentry.js"></script>