+ */
+class IntlFormatter implements \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Formatter\IntlFormatterInterface
+{
+ private $hasMessageFormatter;
+ private $cache = [];
+ /**
+ * {@inheritdoc}
+ */
+ public function formatIntl(string $message, string $locale, array $parameters = []) : string
+ {
+ // MessageFormatter constructor throws an exception if the message is empty
+ if ('' === $message) {
+ return '';
+ }
+ if (!($formatter = $this->cache[$locale][$message] ?? null)) {
+ if (!($this->hasMessageFormatter ?? ($this->hasMessageFormatter = \class_exists(\MessageFormatter::class)))) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\LogicException('Cannot parse message translation: please install the "intl" PHP extension or the "symfony/polyfill-intl-messageformatter" package.');
+ }
+ try {
+ $this->cache[$locale][$message] = $formatter = new \MessageFormatter($locale, $message);
+ } catch (\IntlException $e) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidArgumentException(\sprintf('Invalid message format (error #%d): %s.', \intl_get_error_code(), \intl_get_error_message()), 0, $e);
+ }
+ }
+ foreach ($parameters as $key => $value) {
+ if (\in_array($key[0] ?? null, ['%', '{'], \true)) {
+ unset($parameters[$key]);
+ $parameters[\trim($key, '%{ }')] = $value;
+ }
+ }
+ if (\false === ($message = $formatter->format($parameters))) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidArgumentException(\sprintf('Unable to format message (error #%s): %s.', $formatter->getErrorCode(), $formatter->getErrorMessage()));
+ }
+ return $message;
+ }
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/Formatter/IntlFormatterInterface.php b/classes/Utilities/Misc/Symfony/Component/Translation/Formatter/IntlFormatterInterface.php
new file mode 100755
index 00000000..76a27da3
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/Formatter/IntlFormatterInterface.php
@@ -0,0 +1,26 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Formatter;
+
+/**
+ * Formats ICU message patterns.
+ *
+ * @author Nicolas Grekas
+ */
+interface IntlFormatterInterface
+{
+ /**
+ * Formats a localized message using rules defined by ICU MessageFormat.
+ *
+ * @see http://icu-project.org/apiref/icu4c/classMessageFormat.html#details
+ */
+ public function formatIntl(string $message, string $locale, array $parameters = []) : string;
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/Formatter/MessageFormatter.php b/classes/Utilities/Misc/Symfony/Component/Translation/Formatter/MessageFormatter.php
new file mode 100755
index 00000000..3595236c
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/Formatter/MessageFormatter.php
@@ -0,0 +1,68 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Formatter;
+
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\IdentityTranslator;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageSelector;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\TranslatorInterface as LegacyTranslatorInterface;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Contracts\Translation\TranslatorInterface;
+/**
+ * @author Abdellatif Ait boudad
+ */
+class MessageFormatter implements \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Formatter\MessageFormatterInterface, \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Formatter\IntlFormatterInterface, \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Formatter\ChoiceMessageFormatterInterface
+{
+ private $translator;
+ private $intlFormatter;
+ /**
+ * @param TranslatorInterface|null $translator An identity translator to use as selector for pluralization
+ */
+ public function __construct($translator = null, \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Formatter\IntlFormatterInterface $intlFormatter = null)
+ {
+ if ($translator instanceof \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageSelector) {
+ $translator = new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\IdentityTranslator($translator);
+ } elseif (null !== $translator && !$translator instanceof \ILAB\MediaCloud\Utilities\Misc\Symfony\Contracts\Translation\TranslatorInterface && !$translator instanceof \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\TranslatorInterface) {
+ throw new \TypeError(\sprintf('Argument 1 passed to %s() must be an instance of %s, %s given.', __METHOD__, \ILAB\MediaCloud\Utilities\Misc\Symfony\Contracts\Translation\TranslatorInterface::class, \is_object($translator) ? \get_class($translator) : \gettype($translator)));
+ }
+ $this->translator = $translator ?? new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\IdentityTranslator();
+ $this->intlFormatter = $intlFormatter ?? new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Formatter\IntlFormatter();
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function format($message, $locale, array $parameters = [])
+ {
+ if ($this->translator instanceof \ILAB\MediaCloud\Utilities\Misc\Symfony\Contracts\Translation\TranslatorInterface) {
+ return $this->translator->trans($message, $parameters, null, $locale);
+ }
+ return \strtr($message, $parameters);
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function formatIntl(string $message, string $locale, array $parameters = []) : string
+ {
+ return $this->intlFormatter->formatIntl($message, $locale, $parameters);
+ }
+ /**
+ * {@inheritdoc}
+ *
+ * @deprecated since Symfony 4.2, use format() with a %count% parameter instead
+ */
+ public function choiceFormat($message, $number, $locale, array $parameters = [])
+ {
+ @\trigger_error(\sprintf('The "%s()" method is deprecated since Symfony 4.2, use the format() one instead with a %%count%% parameter.', __METHOD__), \E_USER_DEPRECATED);
+ $parameters = ['%count%' => $number] + $parameters;
+ if ($this->translator instanceof \ILAB\MediaCloud\Utilities\Misc\Symfony\Contracts\Translation\TranslatorInterface) {
+ return $this->format($message, $locale, $parameters);
+ }
+ return $this->format($this->translator->transChoice($message, $number, [], null, $locale), $locale, $parameters);
+ }
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/Formatter/MessageFormatterInterface.php b/classes/Utilities/Misc/Symfony/Component/Translation/Formatter/MessageFormatterInterface.php
new file mode 100755
index 00000000..3c82ae2e
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/Formatter/MessageFormatterInterface.php
@@ -0,0 +1,29 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Formatter;
+
+/**
+ * @author Guilherme Blanco
+ * @author Abdellatif Ait boudad
+ */
+interface MessageFormatterInterface
+{
+ /**
+ * Formats a localized message pattern with given arguments.
+ *
+ * @param string $message The message (may also be an object that can be cast to string)
+ * @param string $locale The message locale
+ * @param array $parameters An array of parameters for the message
+ *
+ * @return string
+ */
+ public function format($message, $locale, array $parameters = []);
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/IdentityTranslator.php b/classes/Utilities/Misc/Symfony/Component/Translation/IdentityTranslator.php
new file mode 100755
index 00000000..f4c28e29
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/IdentityTranslator.php
@@ -0,0 +1,66 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation;
+
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\TranslatorInterface as LegacyTranslatorInterface;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Contracts\Translation\TranslatorInterface;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Contracts\Translation\TranslatorTrait;
+/**
+ * IdentityTranslator does not translate anything.
+ *
+ * @author Fabien Potencier
+ */
+class IdentityTranslator implements \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\TranslatorInterface, \ILAB\MediaCloud\Utilities\Misc\Symfony\Contracts\Translation\TranslatorInterface
+{
+ use TranslatorTrait {
+ trans as private doTrans;
+ setLocale as private doSetLocale;
+ }
+ private $selector;
+ public function __construct(\ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageSelector $selector = null)
+ {
+ $this->selector = $selector;
+ if (__CLASS__ !== \get_class($this)) {
+ @\trigger_error(\sprintf('Calling "%s()" is deprecated since Symfony 4.2.', __METHOD__), \E_USER_DEPRECATED);
+ }
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function trans($id, array $parameters = [], $domain = null, $locale = null)
+ {
+ return $this->doTrans($id, $parameters, $domain, $locale);
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function setLocale($locale)
+ {
+ $this->doSetLocale($locale);
+ }
+ /**
+ * {@inheritdoc}
+ *
+ * @deprecated since Symfony 4.2, use the trans() method instead with a %count% parameter
+ */
+ public function transChoice($id, $number, array $parameters = [], $domain = null, $locale = null)
+ {
+ @\trigger_error(\sprintf('The "%s()" method is deprecated since Symfony 4.2, use the trans() one instead with a "%%count%%" parameter.', __METHOD__), \E_USER_DEPRECATED);
+ if ($this->selector) {
+ return \strtr($this->selector->choose((string) $id, $number, $locale ?: $this->getLocale()), $parameters);
+ }
+ return $this->trans($id, ['%count%' => $number] + $parameters, $domain, $locale);
+ }
+ private function getPluralizationRule(int $number, string $locale) : int
+ {
+ return \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\PluralizationRules::get($number, $locale, \false);
+ }
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/Interval.php b/classes/Utilities/Misc/Symfony/Component/Translation/Interval.php
new file mode 100755
index 00000000..1e712dee
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/Interval.php
@@ -0,0 +1,99 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation;
+
+@\trigger_error(\sprintf('The "%s" class is deprecated since Symfony 4.2, use IdentityTranslator instead.', \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Interval::class), \E_USER_DEPRECATED);
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidArgumentException;
+/**
+ * Tests if a given number belongs to a given math interval.
+ *
+ * An interval can represent a finite set of numbers:
+ *
+ * {1,2,3,4}
+ *
+ * An interval can represent numbers between two numbers:
+ *
+ * [1, +Inf]
+ * ]-1,2[
+ *
+ * The left delimiter can be [ (inclusive) or ] (exclusive).
+ * The right delimiter can be [ (exclusive) or ] (inclusive).
+ * Beside numbers, you can use -Inf and +Inf for the infinite.
+ *
+ * @author Fabien Potencier
+ *
+ * @see http://en.wikipedia.org/wiki/Interval_%28mathematics%29#The_ISO_notation
+ * @deprecated since Symfony 4.2, use IdentityTranslator instead
+ */
+class Interval
+{
+ /**
+ * Tests if the given number is in the math interval.
+ *
+ * @param int $number A number
+ * @param string $interval An interval
+ *
+ * @return bool
+ *
+ * @throws InvalidArgumentException
+ */
+ public static function test($number, $interval)
+ {
+ $interval = \trim($interval);
+ if (!\preg_match('/^' . self::getIntervalRegexp() . '$/x', $interval, $matches)) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidArgumentException(\sprintf('"%s" is not a valid interval.', $interval));
+ }
+ if ($matches[1]) {
+ foreach (\explode(',', $matches[2]) as $n) {
+ if ($number == $n) {
+ return \true;
+ }
+ }
+ } else {
+ $leftNumber = self::convertNumber($matches['left']);
+ $rightNumber = self::convertNumber($matches['right']);
+ return ('[' === $matches['left_delimiter'] ? $number >= $leftNumber : $number > $leftNumber) && (']' === $matches['right_delimiter'] ? $number <= $rightNumber : $number < $rightNumber);
+ }
+ return \false;
+ }
+ /**
+ * Returns a Regexp that matches valid intervals.
+ *
+ * @return string A Regexp (without the delimiters)
+ */
+ public static function getIntervalRegexp()
+ {
+ return <<[\\[\\]])
+ \\s*
+ (?P-Inf|\\-?\\d+(\\.\\d+)?)
+ \\s*,\\s*
+ (?P\\+?Inf|\\-?\\d+(\\.\\d+)?)
+ \\s*
+ (?P[\\[\\]])
+EOF;
+ }
+ private static function convertNumber(string $number) : float
+ {
+ if ('-Inf' === $number) {
+ return \log(0);
+ } elseif ('+Inf' === $number || 'Inf' === $number) {
+ return -\log(0);
+ }
+ return (float) $number;
+ }
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/Loader/ArrayLoader.php b/classes/Utilities/Misc/Symfony/Component/Translation/Loader/ArrayLoader.php
new file mode 100755
index 00000000..645c3d83
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/Loader/ArrayLoader.php
@@ -0,0 +1,53 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Loader;
+
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogue;
+/**
+ * ArrayLoader loads translations from a PHP array.
+ *
+ * @author Fabien Potencier
+ */
+class ArrayLoader implements \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Loader\LoaderInterface
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function load($resource, $locale, $domain = 'messages')
+ {
+ $resource = $this->flatten($resource);
+ $catalogue = new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogue($locale);
+ $catalogue->add($resource, $domain);
+ return $catalogue;
+ }
+ /**
+ * Flattens an nested array of translations.
+ *
+ * The scheme used is:
+ * 'key' => ['key2' => ['key3' => 'value']]
+ * Becomes:
+ * 'key.key2.key3' => 'value'
+ */
+ private function flatten(array $messages) : array
+ {
+ $result = [];
+ foreach ($messages as $key => $value) {
+ if (\is_array($value)) {
+ foreach ($this->flatten($value) as $k => $v) {
+ $result[$key . '.' . $k] = $v;
+ }
+ } else {
+ $result[$key] = $value;
+ }
+ }
+ return $result;
+ }
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/Loader/CsvFileLoader.php b/classes/Utilities/Misc/Symfony/Component/Translation/Loader/CsvFileLoader.php
new file mode 100755
index 00000000..7ad278c0
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/Loader/CsvFileLoader.php
@@ -0,0 +1,60 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Loader;
+
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\NotFoundResourceException;
+/**
+ * CsvFileLoader loads translations from CSV files.
+ *
+ * @author Saša Stamenković
+ */
+class CsvFileLoader extends \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Loader\FileLoader
+{
+ private $delimiter = ';';
+ private $enclosure = '"';
+ private $escape = '\\';
+ /**
+ * {@inheritdoc}
+ */
+ protected function loadResource($resource)
+ {
+ $messages = [];
+ try {
+ $file = new \SplFileObject($resource, 'rb');
+ } catch (\RuntimeException $e) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\NotFoundResourceException(\sprintf('Error opening file "%s".', $resource), 0, $e);
+ }
+ $file->setFlags(\SplFileObject::READ_CSV | \SplFileObject::SKIP_EMPTY);
+ $file->setCsvControl($this->delimiter, $this->enclosure, $this->escape);
+ foreach ($file as $data) {
+ if (\false === $data) {
+ continue;
+ }
+ if ('#' !== \substr($data[0], 0, 1) && isset($data[1]) && 2 === \count($data)) {
+ $messages[$data[0]] = $data[1];
+ }
+ }
+ return $messages;
+ }
+ /**
+ * Sets the delimiter, enclosure, and escape character for CSV.
+ *
+ * @param string $delimiter Delimiter character
+ * @param string $enclosure Enclosure character
+ * @param string $escape Escape character
+ */
+ public function setCsvControl($delimiter = ';', $enclosure = '"', $escape = '\\')
+ {
+ $this->delimiter = $delimiter;
+ $this->enclosure = $enclosure;
+ $this->escape = $escape;
+ }
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/Loader/FileLoader.php b/classes/Utilities/Misc/Symfony/Component/Translation/Loader/FileLoader.php
new file mode 100755
index 00000000..bd599edf
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/Loader/FileLoader.php
@@ -0,0 +1,55 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Loader;
+
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Config\Resource\FileResource;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidResourceException;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\NotFoundResourceException;
+/**
+ * @author Abdellatif Ait boudad
+ */
+abstract class FileLoader extends \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Loader\ArrayLoader
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function load($resource, $locale, $domain = 'messages')
+ {
+ if (!\stream_is_local($resource)) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidResourceException(\sprintf('This is not a local file "%s".', $resource));
+ }
+ if (!\file_exists($resource)) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\NotFoundResourceException(\sprintf('File "%s" not found.', $resource));
+ }
+ $messages = $this->loadResource($resource);
+ // empty resource
+ if (null === $messages) {
+ $messages = [];
+ }
+ // not an array
+ if (!\is_array($messages)) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidResourceException(\sprintf('Unable to load file "%s".', $resource));
+ }
+ $catalogue = parent::load($messages, $locale, $domain);
+ if (\class_exists('ILAB\\MediaCloud\\Utilities\\Misc\\Symfony\\Component\\Config\\Resource\\FileResource')) {
+ $catalogue->addResource(new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Config\Resource\FileResource($resource));
+ }
+ return $catalogue;
+ }
+ /**
+ * @param string $resource
+ *
+ * @return array
+ *
+ * @throws InvalidResourceException if stream content has an invalid format
+ */
+ protected abstract function loadResource($resource);
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/Loader/IcuDatFileLoader.php b/classes/Utilities/Misc/Symfony/Component/Translation/Loader/IcuDatFileLoader.php
new file mode 100755
index 00000000..f83c9443
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/Loader/IcuDatFileLoader.php
@@ -0,0 +1,53 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Loader;
+
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Config\Resource\FileResource;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidResourceException;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\NotFoundResourceException;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogue;
+/**
+ * IcuResFileLoader loads translations from a resource bundle.
+ *
+ * @author stealth35
+ */
+class IcuDatFileLoader extends \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Loader\IcuResFileLoader
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function load($resource, $locale, $domain = 'messages')
+ {
+ if (!\stream_is_local($resource . '.dat')) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidResourceException(\sprintf('This is not a local file "%s".', $resource));
+ }
+ if (!\file_exists($resource . '.dat')) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\NotFoundResourceException(\sprintf('File "%s" not found.', $resource));
+ }
+ try {
+ $rb = new \ResourceBundle($locale, $resource);
+ } catch (\Exception $e) {
+ $rb = null;
+ }
+ if (!$rb) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidResourceException(\sprintf('Cannot load resource "%s"', $resource));
+ } elseif (\intl_is_failure($rb->getErrorCode())) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidResourceException($rb->getErrorMessage(), $rb->getErrorCode());
+ }
+ $messages = $this->flatten($rb);
+ $catalogue = new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogue($locale);
+ $catalogue->add($messages, $domain);
+ if (\class_exists('ILAB\\MediaCloud\\Utilities\\Misc\\Symfony\\Component\\Config\\Resource\\FileResource')) {
+ $catalogue->addResource(new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Config\Resource\FileResource($resource . '.dat'));
+ }
+ return $catalogue;
+ }
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/Loader/IcuResFileLoader.php b/classes/Utilities/Misc/Symfony/Component/Translation/Loader/IcuResFileLoader.php
new file mode 100755
index 00000000..5410136c
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/Loader/IcuResFileLoader.php
@@ -0,0 +1,81 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Loader;
+
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Config\Resource\DirectoryResource;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidResourceException;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\NotFoundResourceException;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogue;
+/**
+ * IcuResFileLoader loads translations from a resource bundle.
+ *
+ * @author stealth35
+ */
+class IcuResFileLoader implements \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Loader\LoaderInterface
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function load($resource, $locale, $domain = 'messages')
+ {
+ if (!\stream_is_local($resource)) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidResourceException(\sprintf('This is not a local file "%s".', $resource));
+ }
+ if (!\is_dir($resource)) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\NotFoundResourceException(\sprintf('File "%s" not found.', $resource));
+ }
+ try {
+ $rb = new \ResourceBundle($locale, $resource);
+ } catch (\Exception $e) {
+ $rb = null;
+ }
+ if (!$rb) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidResourceException(\sprintf('Cannot load resource "%s"', $resource));
+ } elseif (\intl_is_failure($rb->getErrorCode())) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidResourceException($rb->getErrorMessage(), $rb->getErrorCode());
+ }
+ $messages = $this->flatten($rb);
+ $catalogue = new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogue($locale);
+ $catalogue->add($messages, $domain);
+ if (\class_exists('ILAB\\MediaCloud\\Utilities\\Misc\\Symfony\\Component\\Config\\Resource\\DirectoryResource')) {
+ $catalogue->addResource(new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Config\Resource\DirectoryResource($resource));
+ }
+ return $catalogue;
+ }
+ /**
+ * Flattens an ResourceBundle.
+ *
+ * The scheme used is:
+ * key { key2 { key3 { "value" } } }
+ * Becomes:
+ * 'key.key2.key3' => 'value'
+ *
+ * This function takes an array by reference and will modify it
+ *
+ * @param \ResourceBundle $rb The ResourceBundle that will be flattened
+ * @param array $messages Used internally for recursive calls
+ * @param string $path Current path being parsed, used internally for recursive calls
+ *
+ * @return array the flattened ResourceBundle
+ */
+ protected function flatten(\ResourceBundle $rb, array &$messages = [], $path = null)
+ {
+ foreach ($rb as $key => $value) {
+ $nodePath = $path ? $path . '.' . $key : $key;
+ if ($value instanceof \ResourceBundle) {
+ $this->flatten($value, $messages, $nodePath);
+ } else {
+ $messages[$nodePath] = $value;
+ }
+ }
+ return $messages;
+ }
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/Loader/IniFileLoader.php b/classes/Utilities/Misc/Symfony/Component/Translation/Loader/IniFileLoader.php
new file mode 100755
index 00000000..ee6b8aa4
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/Loader/IniFileLoader.php
@@ -0,0 +1,27 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Loader;
+
+/**
+ * IniFileLoader loads translations from an ini file.
+ *
+ * @author stealth35
+ */
+class IniFileLoader extends \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Loader\FileLoader
+{
+ /**
+ * {@inheritdoc}
+ */
+ protected function loadResource($resource)
+ {
+ return \parse_ini_file($resource, \true);
+ }
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/Loader/JsonFileLoader.php b/classes/Utilities/Misc/Symfony/Component/Translation/Loader/JsonFileLoader.php
new file mode 100755
index 00000000..48724d82
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/Loader/JsonFileLoader.php
@@ -0,0 +1,55 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Loader;
+
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidResourceException;
+/**
+ * JsonFileLoader loads translations from an json file.
+ *
+ * @author singles
+ */
+class JsonFileLoader extends \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Loader\FileLoader
+{
+ /**
+ * {@inheritdoc}
+ */
+ protected function loadResource($resource)
+ {
+ $messages = [];
+ if ($data = \file_get_contents($resource)) {
+ $messages = \json_decode($data, \true);
+ if (0 < ($errorCode = \json_last_error())) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidResourceException(\sprintf('Error parsing JSON - %s', $this->getJSONErrorMessage($errorCode)));
+ }
+ }
+ return $messages;
+ }
+ /**
+ * Translates JSON_ERROR_* constant into meaningful message.
+ */
+ private function getJSONErrorMessage(int $errorCode) : string
+ {
+ switch ($errorCode) {
+ case \JSON_ERROR_DEPTH:
+ return 'Maximum stack depth exceeded';
+ case \JSON_ERROR_STATE_MISMATCH:
+ return 'Underflow or the modes mismatch';
+ case \JSON_ERROR_CTRL_CHAR:
+ return 'Unexpected control character found';
+ case \JSON_ERROR_SYNTAX:
+ return 'Syntax error, malformed JSON';
+ case \JSON_ERROR_UTF8:
+ return 'Malformed UTF-8 characters, possibly incorrectly encoded';
+ default:
+ return 'Unknown error';
+ }
+ }
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/Loader/LoaderInterface.php b/classes/Utilities/Misc/Symfony/Component/Translation/Loader/LoaderInterface.php
new file mode 100755
index 00000000..3ca3d098
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/Loader/LoaderInterface.php
@@ -0,0 +1,36 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Loader;
+
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidResourceException;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\NotFoundResourceException;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogue;
+/**
+ * LoaderInterface is the interface implemented by all translation loaders.
+ *
+ * @author Fabien Potencier
+ */
+interface LoaderInterface
+{
+ /**
+ * Loads a locale.
+ *
+ * @param mixed $resource A resource
+ * @param string $locale A locale
+ * @param string $domain The domain
+ *
+ * @return MessageCatalogue A MessageCatalogue instance
+ *
+ * @throws NotFoundResourceException when the resource cannot be found
+ * @throws InvalidResourceException when the resource cannot be loaded
+ */
+ public function load($resource, $locale, $domain = 'messages');
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/Loader/MoFileLoader.php b/classes/Utilities/Misc/Symfony/Component/Translation/Loader/MoFileLoader.php
new file mode 100755
index 00000000..8b890991
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/Loader/MoFileLoader.php
@@ -0,0 +1,114 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Loader;
+
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidResourceException;
+/**
+ * @copyright Copyright (c) 2010, Union of RAD http://union-of-rad.org (http://lithify.me/)
+ */
+class MoFileLoader extends \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Loader\FileLoader
+{
+ /**
+ * Magic used for validating the format of a MO file as well as
+ * detecting if the machine used to create that file was little endian.
+ */
+ const MO_LITTLE_ENDIAN_MAGIC = 0x950412de;
+ /**
+ * Magic used for validating the format of a MO file as well as
+ * detecting if the machine used to create that file was big endian.
+ */
+ const MO_BIG_ENDIAN_MAGIC = 0xde120495;
+ /**
+ * The size of the header of a MO file in bytes.
+ */
+ const MO_HEADER_SIZE = 28;
+ /**
+ * Parses machine object (MO) format, independent of the machine's endian it
+ * was created on. Both 32bit and 64bit systems are supported.
+ *
+ * {@inheritdoc}
+ */
+ protected function loadResource($resource)
+ {
+ $stream = \fopen($resource, 'r');
+ $stat = \fstat($stream);
+ if ($stat['size'] < self::MO_HEADER_SIZE) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidResourceException('MO stream content has an invalid format.');
+ }
+ $magic = \unpack('V1', \fread($stream, 4));
+ $magic = \hexdec(\substr(\dechex(\current($magic)), -8));
+ if (self::MO_LITTLE_ENDIAN_MAGIC == $magic) {
+ $isBigEndian = \false;
+ } elseif (self::MO_BIG_ENDIAN_MAGIC == $magic) {
+ $isBigEndian = \true;
+ } else {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidResourceException('MO stream content has an invalid format.');
+ }
+ // formatRevision
+ $this->readLong($stream, $isBigEndian);
+ $count = $this->readLong($stream, $isBigEndian);
+ $offsetId = $this->readLong($stream, $isBigEndian);
+ $offsetTranslated = $this->readLong($stream, $isBigEndian);
+ // sizeHashes
+ $this->readLong($stream, $isBigEndian);
+ // offsetHashes
+ $this->readLong($stream, $isBigEndian);
+ $messages = [];
+ for ($i = 0; $i < $count; ++$i) {
+ $pluralId = null;
+ $translated = null;
+ \fseek($stream, $offsetId + $i * 8);
+ $length = $this->readLong($stream, $isBigEndian);
+ $offset = $this->readLong($stream, $isBigEndian);
+ if ($length < 1) {
+ continue;
+ }
+ \fseek($stream, $offset);
+ $singularId = \fread($stream, $length);
+ if (\false !== \strpos($singularId, "\0")) {
+ list($singularId, $pluralId) = \explode("\0", $singularId);
+ }
+ \fseek($stream, $offsetTranslated + $i * 8);
+ $length = $this->readLong($stream, $isBigEndian);
+ $offset = $this->readLong($stream, $isBigEndian);
+ if ($length < 1) {
+ continue;
+ }
+ \fseek($stream, $offset);
+ $translated = \fread($stream, $length);
+ if (\false !== \strpos($translated, "\0")) {
+ $translated = \explode("\0", $translated);
+ }
+ $ids = ['singular' => $singularId, 'plural' => $pluralId];
+ $item = \compact('ids', 'translated');
+ if (!empty($item['ids']['singular'])) {
+ $id = $item['ids']['singular'];
+ if (isset($item['ids']['plural'])) {
+ $id .= '|' . $item['ids']['plural'];
+ }
+ $messages[$id] = \stripcslashes(\implode('|', (array) $item['translated']));
+ }
+ }
+ \fclose($stream);
+ return \array_filter($messages);
+ }
+ /**
+ * Reads an unsigned long from stream respecting endianness.
+ *
+ * @param resource $stream
+ */
+ private function readLong($stream, bool $isBigEndian) : int
+ {
+ $result = \unpack($isBigEndian ? 'N1' : 'V1', \fread($stream, 4));
+ $result = \current($result);
+ return (int) \substr($result, -8);
+ }
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/Loader/PhpFileLoader.php b/classes/Utilities/Misc/Symfony/Component/Translation/Loader/PhpFileLoader.php
new file mode 100755
index 00000000..104889f0
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/Loader/PhpFileLoader.php
@@ -0,0 +1,27 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Loader;
+
+/**
+ * PhpFileLoader loads translations from PHP files returning an array of translations.
+ *
+ * @author Fabien Potencier
+ */
+class PhpFileLoader extends \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Loader\FileLoader
+{
+ /**
+ * {@inheritdoc}
+ */
+ protected function loadResource($resource)
+ {
+ return require $resource;
+ }
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/Loader/PoFileLoader.php b/classes/Utilities/Misc/Symfony/Component/Translation/Loader/PoFileLoader.php
new file mode 100755
index 00000000..a69e043a
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/Loader/PoFileLoader.php
@@ -0,0 +1,136 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Loader;
+
+/**
+ * @copyright Copyright (c) 2010, Union of RAD https://github.com/UnionOfRAD/lithium
+ * @copyright Copyright (c) 2012, Clemens Tolboom
+ */
+class PoFileLoader extends \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Loader\FileLoader
+{
+ /**
+ * Parses portable object (PO) format.
+ *
+ * From https://www.gnu.org/software/gettext/manual/gettext.html#PO-Files
+ * we should be able to parse files having:
+ *
+ * white-space
+ * # translator-comments
+ * #. extracted-comments
+ * #: reference...
+ * #, flag...
+ * #| msgid previous-untranslated-string
+ * msgid untranslated-string
+ * msgstr translated-string
+ *
+ * extra or different lines are:
+ *
+ * #| msgctxt previous-context
+ * #| msgid previous-untranslated-string
+ * msgctxt context
+ *
+ * #| msgid previous-untranslated-string-singular
+ * #| msgid_plural previous-untranslated-string-plural
+ * msgid untranslated-string-singular
+ * msgid_plural untranslated-string-plural
+ * msgstr[0] translated-string-case-0
+ * ...
+ * msgstr[N] translated-string-case-n
+ *
+ * The definition states:
+ * - white-space and comments are optional.
+ * - msgid "" that an empty singleline defines a header.
+ *
+ * This parser sacrifices some features of the reference implementation the
+ * differences to that implementation are as follows.
+ * - No support for comments spanning multiple lines.
+ * - Translator and extracted comments are treated as being the same type.
+ * - Message IDs are allowed to have other encodings as just US-ASCII.
+ *
+ * Items with an empty id are ignored.
+ *
+ * {@inheritdoc}
+ */
+ protected function loadResource($resource)
+ {
+ $stream = \fopen($resource, 'r');
+ $defaults = ['ids' => [], 'translated' => null];
+ $messages = [];
+ $item = $defaults;
+ $flags = [];
+ while ($line = \fgets($stream)) {
+ $line = \trim($line);
+ if ('' === $line) {
+ // Whitespace indicated current item is done
+ if (!\in_array('fuzzy', $flags)) {
+ $this->addMessage($messages, $item);
+ }
+ $item = $defaults;
+ $flags = [];
+ } elseif ('#,' === \substr($line, 0, 2)) {
+ $flags = \array_map('trim', \explode(',', \substr($line, 2)));
+ } elseif ('msgid "' === \substr($line, 0, 7)) {
+ // We start a new msg so save previous
+ // TODO: this fails when comments or contexts are added
+ $this->addMessage($messages, $item);
+ $item = $defaults;
+ $item['ids']['singular'] = \substr($line, 7, -1);
+ } elseif ('msgstr "' === \substr($line, 0, 8)) {
+ $item['translated'] = \substr($line, 8, -1);
+ } elseif ('"' === $line[0]) {
+ $continues = isset($item['translated']) ? 'translated' : 'ids';
+ if (\is_array($item[$continues])) {
+ \end($item[$continues]);
+ $item[$continues][\key($item[$continues])] .= \substr($line, 1, -1);
+ } else {
+ $item[$continues] .= \substr($line, 1, -1);
+ }
+ } elseif ('msgid_plural "' === \substr($line, 0, 14)) {
+ $item['ids']['plural'] = \substr($line, 14, -1);
+ } elseif ('msgstr[' === \substr($line, 0, 7)) {
+ $size = \strpos($line, ']');
+ $item['translated'][(int) \substr($line, 7, 1)] = \substr($line, $size + 3, -1);
+ }
+ }
+ // save last item
+ if (!\in_array('fuzzy', $flags)) {
+ $this->addMessage($messages, $item);
+ }
+ \fclose($stream);
+ return $messages;
+ }
+ /**
+ * Save a translation item to the messages.
+ *
+ * A .po file could contain by error missing plural indexes. We need to
+ * fix these before saving them.
+ */
+ private function addMessage(array &$messages, array $item)
+ {
+ if (!empty($item['ids']['singular'])) {
+ $id = \stripcslashes($item['ids']['singular']);
+ if (isset($item['ids']['plural'])) {
+ $id .= '|' . \stripcslashes($item['ids']['plural']);
+ }
+ $translated = (array) $item['translated'];
+ // PO are by definition indexed so sort by index.
+ \ksort($translated);
+ // Make sure every index is filled.
+ \end($translated);
+ $count = \key($translated);
+ // Fill missing spots with '-'.
+ $empties = \array_fill(0, $count + 1, '-');
+ $translated += $empties;
+ \ksort($translated);
+ $messages[$id] = \stripcslashes(\implode('|', $translated));
+ }
+ }
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/Loader/QtFileLoader.php b/classes/Utilities/Misc/Symfony/Component/Translation/Loader/QtFileLoader.php
new file mode 100755
index 00000000..2866755a
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/Loader/QtFileLoader.php
@@ -0,0 +1,62 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Loader;
+
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Config\Resource\FileResource;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Config\Util\XmlUtils;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidResourceException;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\NotFoundResourceException;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogue;
+/**
+ * QtFileLoader loads translations from QT Translations XML files.
+ *
+ * @author Benjamin Eberlei
+ */
+class QtFileLoader implements \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Loader\LoaderInterface
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function load($resource, $locale, $domain = 'messages')
+ {
+ if (!\stream_is_local($resource)) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidResourceException(\sprintf('This is not a local file "%s".', $resource));
+ }
+ if (!\file_exists($resource)) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\NotFoundResourceException(\sprintf('File "%s" not found.', $resource));
+ }
+ try {
+ $dom = \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Config\Util\XmlUtils::loadFile($resource);
+ } catch (\InvalidArgumentException $e) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidResourceException(\sprintf('Unable to load "%s".', $resource), $e->getCode(), $e);
+ }
+ $internalErrors = \libxml_use_internal_errors(\true);
+ \libxml_clear_errors();
+ $xpath = new \DOMXPath($dom);
+ $nodes = $xpath->evaluate('//TS/context/name[text()="' . $domain . '"]');
+ $catalogue = new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogue($locale);
+ if (1 == $nodes->length) {
+ $translations = $nodes->item(0)->nextSibling->parentNode->parentNode->getElementsByTagName('message');
+ foreach ($translations as $translation) {
+ $translationValue = (string) $translation->getElementsByTagName('translation')->item(0)->nodeValue;
+ if (!empty($translationValue)) {
+ $catalogue->set((string) $translation->getElementsByTagName('source')->item(0)->nodeValue, $translationValue, $domain);
+ }
+ $translation = $translation->nextSibling;
+ }
+ if (\class_exists('ILAB\\MediaCloud\\Utilities\\Misc\\Symfony\\Component\\Config\\Resource\\FileResource')) {
+ $catalogue->addResource(new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Config\Resource\FileResource($resource));
+ }
+ }
+ \libxml_use_internal_errors($internalErrors);
+ return $catalogue;
+ }
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/Loader/XliffFileLoader.php b/classes/Utilities/Misc/Symfony/Component/Translation/Loader/XliffFileLoader.php
new file mode 100755
index 00000000..7646a26b
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/Loader/XliffFileLoader.php
@@ -0,0 +1,165 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Loader;
+
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Config\Resource\FileResource;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Config\Util\XmlUtils;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidResourceException;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\NotFoundResourceException;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogue;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Util\XliffUtils;
+/**
+ * XliffFileLoader loads translations from XLIFF files.
+ *
+ * @author Fabien Potencier
+ */
+class XliffFileLoader implements \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Loader\LoaderInterface
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function load($resource, $locale, $domain = 'messages')
+ {
+ if (!\stream_is_local($resource)) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidResourceException(\sprintf('This is not a local file "%s".', $resource));
+ }
+ if (!\file_exists($resource)) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\NotFoundResourceException(\sprintf('File "%s" not found.', $resource));
+ }
+ $catalogue = new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogue($locale);
+ $this->extract($resource, $catalogue, $domain);
+ if (\class_exists('ILAB\\MediaCloud\\Utilities\\Misc\\Symfony\\Component\\Config\\Resource\\FileResource')) {
+ $catalogue->addResource(new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Config\Resource\FileResource($resource));
+ }
+ return $catalogue;
+ }
+ private function extract($resource, \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogue $catalogue, string $domain)
+ {
+ try {
+ $dom = \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Config\Util\XmlUtils::loadFile($resource);
+ } catch (\InvalidArgumentException $e) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidResourceException(\sprintf('Unable to load "%s": %s', $resource, $e->getMessage()), $e->getCode(), $e);
+ }
+ $xliffVersion = \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Util\XliffUtils::getVersionNumber($dom);
+ if ($errors = \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Util\XliffUtils::validateSchema($dom)) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidResourceException(\sprintf('Invalid resource provided: "%s"; Errors: %s', $resource, \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Util\XliffUtils::getErrorsAsString($errors)));
+ }
+ if ('1.2' === $xliffVersion) {
+ $this->extractXliff1($dom, $catalogue, $domain);
+ }
+ if ('2.0' === $xliffVersion) {
+ $this->extractXliff2($dom, $catalogue, $domain);
+ }
+ }
+ /**
+ * Extract messages and metadata from DOMDocument into a MessageCatalogue.
+ */
+ private function extractXliff1(\DOMDocument $dom, \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogue $catalogue, string $domain)
+ {
+ $xml = \simplexml_import_dom($dom);
+ $encoding = \strtoupper($dom->encoding);
+ $namespace = 'urn:oasis:names:tc:xliff:document:1.2';
+ $xml->registerXPathNamespace('xliff', $namespace);
+ foreach ($xml->xpath('//xliff:file') as $file) {
+ $fileAttributes = $file->attributes();
+ $file->registerXPathNamespace('xliff', $namespace);
+ foreach ($file->xpath('.//xliff:trans-unit') as $translation) {
+ $attributes = $translation->attributes();
+ if (!(isset($attributes['resname']) || isset($translation->source))) {
+ continue;
+ }
+ $source = isset($attributes['resname']) && $attributes['resname'] ? $attributes['resname'] : $translation->source;
+ // If the xlf file has another encoding specified, try to convert it because
+ // simple_xml will always return utf-8 encoded values
+ $target = $this->utf8ToCharset((string) ($translation->target ?? $translation->source), $encoding);
+ $catalogue->set((string) $source, $target, $domain);
+ $metadata = ['source' => (string) $translation->source, 'file' => ['original' => (string) $fileAttributes['original']]];
+ if ($notes = $this->parseNotesMetadata($translation->note, $encoding)) {
+ $metadata['notes'] = $notes;
+ }
+ if (isset($translation->target) && $translation->target->attributes()) {
+ $metadata['target-attributes'] = [];
+ foreach ($translation->target->attributes() as $key => $value) {
+ $metadata['target-attributes'][$key] = (string) $value;
+ }
+ }
+ if (isset($attributes['id'])) {
+ $metadata['id'] = (string) $attributes['id'];
+ }
+ $catalogue->setMetadata((string) $source, $metadata, $domain);
+ }
+ }
+ }
+ private function extractXliff2(\DOMDocument $dom, \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogue $catalogue, string $domain)
+ {
+ $xml = \simplexml_import_dom($dom);
+ $encoding = \strtoupper($dom->encoding);
+ $xml->registerXPathNamespace('xliff', 'urn:oasis:names:tc:xliff:document:2.0');
+ foreach ($xml->xpath('//xliff:unit') as $unit) {
+ foreach ($unit->segment as $segment) {
+ $source = $segment->source;
+ // If the xlf file has another encoding specified, try to convert it because
+ // simple_xml will always return utf-8 encoded values
+ $target = $this->utf8ToCharset((string) (isset($segment->target) ? $segment->target : $source), $encoding);
+ $catalogue->set((string) $source, $target, $domain);
+ $metadata = [];
+ if (isset($segment->target) && $segment->target->attributes()) {
+ $metadata['target-attributes'] = [];
+ foreach ($segment->target->attributes() as $key => $value) {
+ $metadata['target-attributes'][$key] = (string) $value;
+ }
+ }
+ if (isset($unit->notes)) {
+ $metadata['notes'] = [];
+ foreach ($unit->notes->note as $noteNode) {
+ $note = [];
+ foreach ($noteNode->attributes() as $key => $value) {
+ $note[$key] = (string) $value;
+ }
+ $note['content'] = (string) $noteNode;
+ $metadata['notes'][] = $note;
+ }
+ }
+ $catalogue->setMetadata((string) $source, $metadata, $domain);
+ }
+ }
+ }
+ /**
+ * Convert a UTF8 string to the specified encoding.
+ */
+ private function utf8ToCharset(string $content, string $encoding = null) : string
+ {
+ if ('UTF-8' !== $encoding && !empty($encoding)) {
+ return \mb_convert_encoding($content, $encoding, 'UTF-8');
+ }
+ return $content;
+ }
+ private function parseNotesMetadata(\SimpleXMLElement $noteElement = null, string $encoding = null) : array
+ {
+ $notes = [];
+ if (null === $noteElement) {
+ return $notes;
+ }
+ /** @var \SimpleXMLElement $xmlNote */
+ foreach ($noteElement as $xmlNote) {
+ $noteAttributes = $xmlNote->attributes();
+ $note = ['content' => $this->utf8ToCharset((string) $xmlNote, $encoding)];
+ if (isset($noteAttributes['priority'])) {
+ $note['priority'] = (int) $noteAttributes['priority'];
+ }
+ if (isset($noteAttributes['from'])) {
+ $note['from'] = (string) $noteAttributes['from'];
+ }
+ $notes[] = $note;
+ }
+ return $notes;
+ }
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/Loader/YamlFileLoader.php b/classes/Utilities/Misc/Symfony/Component/Translation/Loader/YamlFileLoader.php
new file mode 100755
index 00000000..9081edfb
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/Loader/YamlFileLoader.php
@@ -0,0 +1,47 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Loader;
+
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidResourceException;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\LogicException;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Yaml\Exception\ParseException;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Yaml\Parser as YamlParser;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Yaml\Yaml;
+/**
+ * YamlFileLoader loads translations from Yaml files.
+ *
+ * @author Fabien Potencier
+ */
+class YamlFileLoader extends \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Loader\FileLoader
+{
+ private $yamlParser;
+ /**
+ * {@inheritdoc}
+ */
+ protected function loadResource($resource)
+ {
+ if (null === $this->yamlParser) {
+ if (!\class_exists('ILAB\\MediaCloud\\Utilities\\Misc\\Symfony\\Component\\Yaml\\Parser')) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\LogicException('Loading translations from the YAML format requires the Symfony Yaml component.');
+ }
+ $this->yamlParser = new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Yaml\Parser();
+ }
+ try {
+ $messages = $this->yamlParser->parseFile($resource, \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Yaml\Yaml::PARSE_CONSTANT);
+ } catch (\ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Yaml\Exception\ParseException $e) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidResourceException(\sprintf('Error parsing YAML, invalid file "%s"', $resource), 0, $e);
+ }
+ if (null !== $messages && !\is_array($messages)) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidResourceException(\sprintf('Unable to load file "%s".', $resource));
+ }
+ return $messages ?: [];
+ }
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/LocaleAwareInterface.php b/classes/Utilities/Misc/Symfony/Component/Translation/LocaleAwareInterface.php
new file mode 100755
index 00000000..cdef0129
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/LocaleAwareInterface.php
@@ -0,0 +1,29 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Contracts\Translation;
+
+interface LocaleAwareInterface
+{
+ /**
+ * Sets the current locale.
+ *
+ * @param string $locale The locale
+ *
+ * @throws \InvalidArgumentException If the locale contains invalid characters
+ */
+ public function setLocale(string $locale);
+ /**
+ * Returns the current locale.
+ *
+ * @return string The locale
+ */
+ public function getLocale();
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/LoggingTranslator.php b/classes/Utilities/Misc/Symfony/Component/Translation/LoggingTranslator.php
new file mode 100755
index 00000000..55cc7e66
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/LoggingTranslator.php
@@ -0,0 +1,131 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation;
+
+use ILAB\MediaCloud\Utilities\Misc\Psr\Log\LoggerInterface;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidArgumentException;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\TranslatorInterface as LegacyTranslatorInterface;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Contracts\Translation\LocaleAwareInterface;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Contracts\Translation\TranslatorInterface;
+/**
+ * @author Abdellatif Ait boudad
+ */
+class LoggingTranslator implements \ILAB\MediaCloud\Utilities\Misc\Symfony\Contracts\Translation\TranslatorInterface, \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\TranslatorInterface, \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\TranslatorBagInterface
+{
+ /**
+ * @var TranslatorInterface|TranslatorBagInterface
+ */
+ private $translator;
+ private $logger;
+ /**
+ * @param TranslatorInterface $translator The translator must implement TranslatorBagInterface
+ */
+ public function __construct($translator, \ILAB\MediaCloud\Utilities\Misc\Psr\Log\LoggerInterface $logger)
+ {
+ if (!$translator instanceof \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\TranslatorInterface && !$translator instanceof \ILAB\MediaCloud\Utilities\Misc\Symfony\Contracts\Translation\TranslatorInterface) {
+ throw new \TypeError(\sprintf('Argument 1 passed to %s() must be an instance of %s, %s given.', __METHOD__, \ILAB\MediaCloud\Utilities\Misc\Symfony\Contracts\Translation\TranslatorInterface::class, \is_object($translator) ? \get_class($translator) : \gettype($translator)));
+ }
+ if (!$translator instanceof \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\TranslatorBagInterface || !$translator instanceof \ILAB\MediaCloud\Utilities\Misc\Symfony\Contracts\Translation\LocaleAwareInterface) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidArgumentException(\sprintf('The Translator "%s" must implement TranslatorInterface, TranslatorBagInterface and LocaleAwareInterface.', \get_class($translator)));
+ }
+ $this->translator = $translator;
+ $this->logger = $logger;
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function trans($id, array $parameters = [], $domain = null, $locale = null)
+ {
+ $trans = $this->translator->trans($id, $parameters, $domain, $locale);
+ $this->log($id, $domain, $locale);
+ return $trans;
+ }
+ /**
+ * {@inheritdoc}
+ *
+ * @deprecated since Symfony 4.2, use the trans() method instead with a %count% parameter
+ */
+ public function transChoice($id, $number, array $parameters = [], $domain = null, $locale = null)
+ {
+ @\trigger_error(\sprintf('The "%s()" method is deprecated since Symfony 4.2, use the trans() one instead with a "%%count%%" parameter.', __METHOD__), \E_USER_DEPRECATED);
+ if ($this->translator instanceof \ILAB\MediaCloud\Utilities\Misc\Symfony\Contracts\Translation\TranslatorInterface) {
+ $trans = $this->translator->trans($id, ['%count%' => $number] + $parameters, $domain, $locale);
+ } else {
+ $trans = $this->translator->transChoice($id, $number, $parameters, $domain, $locale);
+ }
+ $this->log($id, $domain, $locale);
+ return $trans;
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function setLocale($locale)
+ {
+ $prev = $this->translator->getLocale();
+ $this->translator->setLocale($locale);
+ if ($prev === $locale) {
+ return;
+ }
+ $this->logger->debug(\sprintf('The locale of the translator has changed from "%s" to "%s".', $prev, $locale));
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function getLocale()
+ {
+ return $this->translator->getLocale();
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function getCatalogue($locale = null)
+ {
+ return $this->translator->getCatalogue($locale);
+ }
+ /**
+ * Gets the fallback locales.
+ *
+ * @return array The fallback locales
+ */
+ public function getFallbackLocales()
+ {
+ if ($this->translator instanceof \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Translator || \method_exists($this->translator, 'getFallbackLocales')) {
+ return $this->translator->getFallbackLocales();
+ }
+ return [];
+ }
+ /**
+ * Passes through all unknown calls onto the translator object.
+ */
+ public function __call($method, $args)
+ {
+ return $this->translator->{$method}(...$args);
+ }
+ /**
+ * Logs for missing translations.
+ */
+ private function log(?string $id, ?string $domain, ?string $locale)
+ {
+ if (null === $domain) {
+ $domain = 'messages';
+ }
+ $id = (string) $id;
+ $catalogue = $this->translator->getCatalogue($locale);
+ if ($catalogue->defines($id, $domain)) {
+ return;
+ }
+ if ($catalogue->has($id, $domain)) {
+ $this->logger->debug('Translation use fallback catalogue.', ['id' => $id, 'domain' => $domain, 'locale' => $catalogue->getLocale()]);
+ } else {
+ $this->logger->warning('Translation not found.', ['id' => $id, 'domain' => $domain, 'locale' => $catalogue->getLocale()]);
+ }
+ }
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/MessageCatalogue.php b/classes/Utilities/Misc/Symfony/Component/Translation/MessageCatalogue.php
new file mode 100755
index 00000000..2827a7c2
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/MessageCatalogue.php
@@ -0,0 +1,264 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation;
+
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Config\Resource\ResourceInterface;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\LogicException;
+/**
+ * @author Fabien Potencier
+ */
+class MessageCatalogue implements \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogueInterface, \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MetadataAwareInterface
+{
+ private $messages = [];
+ private $metadata = [];
+ private $resources = [];
+ private $locale;
+ private $fallbackCatalogue;
+ private $parent;
+ /**
+ * @param string $locale The locale
+ * @param array $messages An array of messages classified by domain
+ */
+ public function __construct(?string $locale, array $messages = [])
+ {
+ if (null === $locale) {
+ @\trigger_error(\sprintf('Passing "null" to the first argument of the "%s" method has been deprecated since Symfony 4.4 and will throw an error in 5.0.', __METHOD__), \E_USER_DEPRECATED);
+ }
+ $this->locale = $locale;
+ $this->messages = $messages;
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function getLocale()
+ {
+ return $this->locale;
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function getDomains()
+ {
+ $domains = [];
+ $suffixLength = \strlen(self::INTL_DOMAIN_SUFFIX);
+ foreach ($this->messages as $domain => $messages) {
+ if (\strlen($domain) > $suffixLength && \false !== ($i = \strpos($domain, self::INTL_DOMAIN_SUFFIX, -$suffixLength))) {
+ $domain = \substr($domain, 0, $i);
+ }
+ $domains[$domain] = $domain;
+ }
+ return \array_values($domains);
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function all($domain = null)
+ {
+ if (null !== $domain) {
+ return ($this->messages[$domain . self::INTL_DOMAIN_SUFFIX] ?? []) + ($this->messages[$domain] ?? []);
+ }
+ $allMessages = [];
+ $suffixLength = \strlen(self::INTL_DOMAIN_SUFFIX);
+ foreach ($this->messages as $domain => $messages) {
+ if (\strlen($domain) > $suffixLength && \false !== ($i = \strpos($domain, self::INTL_DOMAIN_SUFFIX, -$suffixLength))) {
+ $domain = \substr($domain, 0, $i);
+ $allMessages[$domain] = $messages + ($allMessages[$domain] ?? []);
+ } else {
+ $allMessages[$domain] = ($allMessages[$domain] ?? []) + $messages;
+ }
+ }
+ return $allMessages;
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function set($id, $translation, $domain = 'messages')
+ {
+ $this->add([$id => $translation], $domain);
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function has($id, $domain = 'messages')
+ {
+ if (isset($this->messages[$domain][$id]) || isset($this->messages[$domain . self::INTL_DOMAIN_SUFFIX][$id])) {
+ return \true;
+ }
+ if (null !== $this->fallbackCatalogue) {
+ return $this->fallbackCatalogue->has($id, $domain);
+ }
+ return \false;
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function defines($id, $domain = 'messages')
+ {
+ return isset($this->messages[$domain][$id]) || isset($this->messages[$domain . self::INTL_DOMAIN_SUFFIX][$id]);
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function get($id, $domain = 'messages')
+ {
+ if (isset($this->messages[$domain . self::INTL_DOMAIN_SUFFIX][$id])) {
+ return $this->messages[$domain . self::INTL_DOMAIN_SUFFIX][$id];
+ }
+ if (isset($this->messages[$domain][$id])) {
+ return $this->messages[$domain][$id];
+ }
+ if (null !== $this->fallbackCatalogue) {
+ return $this->fallbackCatalogue->get($id, $domain);
+ }
+ return $id;
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function replace($messages, $domain = 'messages')
+ {
+ unset($this->messages[$domain], $this->messages[$domain . self::INTL_DOMAIN_SUFFIX]);
+ $this->add($messages, $domain);
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function add($messages, $domain = 'messages')
+ {
+ if (!isset($this->messages[$domain])) {
+ $this->messages[$domain] = $messages;
+ } else {
+ $this->messages[$domain] = \array_replace($this->messages[$domain], $messages);
+ }
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function addCatalogue(\ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogueInterface $catalogue)
+ {
+ if ($catalogue->getLocale() !== $this->locale) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\LogicException(\sprintf('Cannot add a catalogue for locale "%s" as the current locale for this catalogue is "%s"', $catalogue->getLocale(), $this->locale));
+ }
+ foreach ($catalogue->all() as $domain => $messages) {
+ if ($intlMessages = $catalogue->all($domain . self::INTL_DOMAIN_SUFFIX)) {
+ $this->add($intlMessages, $domain . self::INTL_DOMAIN_SUFFIX);
+ $messages = \array_diff_key($messages, $intlMessages);
+ }
+ $this->add($messages, $domain);
+ }
+ foreach ($catalogue->getResources() as $resource) {
+ $this->addResource($resource);
+ }
+ if ($catalogue instanceof \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MetadataAwareInterface) {
+ $metadata = $catalogue->getMetadata('', '');
+ $this->addMetadata($metadata);
+ }
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function addFallbackCatalogue(\ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogueInterface $catalogue)
+ {
+ // detect circular references
+ $c = $catalogue;
+ while ($c = $c->getFallbackCatalogue()) {
+ if ($c->getLocale() === $this->getLocale()) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\LogicException(\sprintf('Circular reference detected when adding a fallback catalogue for locale "%s".', $catalogue->getLocale()));
+ }
+ }
+ $c = $this;
+ do {
+ if ($c->getLocale() === $catalogue->getLocale()) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\LogicException(\sprintf('Circular reference detected when adding a fallback catalogue for locale "%s".', $catalogue->getLocale()));
+ }
+ foreach ($catalogue->getResources() as $resource) {
+ $c->addResource($resource);
+ }
+ } while ($c = $c->parent);
+ $catalogue->parent = $this;
+ $this->fallbackCatalogue = $catalogue;
+ foreach ($catalogue->getResources() as $resource) {
+ $this->addResource($resource);
+ }
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function getFallbackCatalogue()
+ {
+ return $this->fallbackCatalogue;
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function getResources()
+ {
+ return \array_values($this->resources);
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function addResource(\ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Config\Resource\ResourceInterface $resource)
+ {
+ $this->resources[$resource->__toString()] = $resource;
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function getMetadata($key = '', $domain = 'messages')
+ {
+ if ('' == $domain) {
+ return $this->metadata;
+ }
+ if (isset($this->metadata[$domain])) {
+ if ('' == $key) {
+ return $this->metadata[$domain];
+ }
+ if (isset($this->metadata[$domain][$key])) {
+ return $this->metadata[$domain][$key];
+ }
+ }
+ return null;
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function setMetadata($key, $value, $domain = 'messages')
+ {
+ $this->metadata[$domain][$key] = $value;
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function deleteMetadata($key = '', $domain = 'messages')
+ {
+ if ('' == $domain) {
+ $this->metadata = [];
+ } elseif ('' == $key) {
+ unset($this->metadata[$domain]);
+ } else {
+ unset($this->metadata[$domain][$key]);
+ }
+ }
+ /**
+ * Adds current values with the new values.
+ *
+ * @param array $values Values to add
+ */
+ private function addMetadata(array $values)
+ {
+ foreach ($values as $domain => $keys) {
+ foreach ($keys as $key => $value) {
+ $this->setMetadata($key, $value, $domain);
+ }
+ }
+ }
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/MessageCatalogueInterface.php b/classes/Utilities/Misc/Symfony/Component/Translation/MessageCatalogueInterface.php
new file mode 100755
index 00000000..65f4a1e7
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/MessageCatalogueInterface.php
@@ -0,0 +1,122 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation;
+
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Config\Resource\ResourceInterface;
+/**
+ * MessageCatalogueInterface.
+ *
+ * @author Fabien Potencier
+ */
+interface MessageCatalogueInterface
+{
+ const INTL_DOMAIN_SUFFIX = '+intl-icu';
+ /**
+ * Gets the catalogue locale.
+ *
+ * @return string The locale
+ */
+ public function getLocale();
+ /**
+ * Gets the domains.
+ *
+ * @return array An array of domains
+ */
+ public function getDomains();
+ /**
+ * Gets the messages within a given domain.
+ *
+ * If $domain is null, it returns all messages.
+ *
+ * @param string $domain The domain name
+ *
+ * @return array An array of messages
+ */
+ public function all($domain = null);
+ /**
+ * Sets a message translation.
+ *
+ * @param string $id The message id
+ * @param string $translation The messages translation
+ * @param string $domain The domain name
+ */
+ public function set($id, $translation, $domain = 'messages');
+ /**
+ * Checks if a message has a translation.
+ *
+ * @param string $id The message id
+ * @param string $domain The domain name
+ *
+ * @return bool true if the message has a translation, false otherwise
+ */
+ public function has($id, $domain = 'messages');
+ /**
+ * Checks if a message has a translation (it does not take into account the fallback mechanism).
+ *
+ * @param string $id The message id
+ * @param string $domain The domain name
+ *
+ * @return bool true if the message has a translation, false otherwise
+ */
+ public function defines($id, $domain = 'messages');
+ /**
+ * Gets a message translation.
+ *
+ * @param string $id The message id
+ * @param string $domain The domain name
+ *
+ * @return string The message translation
+ */
+ public function get($id, $domain = 'messages');
+ /**
+ * Sets translations for a given domain.
+ *
+ * @param array $messages An array of translations
+ * @param string $domain The domain name
+ */
+ public function replace($messages, $domain = 'messages');
+ /**
+ * Adds translations for a given domain.
+ *
+ * @param array $messages An array of translations
+ * @param string $domain The domain name
+ */
+ public function add($messages, $domain = 'messages');
+ /**
+ * Merges translations from the given Catalogue into the current one.
+ *
+ * The two catalogues must have the same locale.
+ */
+ public function addCatalogue(self $catalogue);
+ /**
+ * Merges translations from the given Catalogue into the current one
+ * only when the translation does not exist.
+ *
+ * This is used to provide default translations when they do not exist for the current locale.
+ */
+ public function addFallbackCatalogue(self $catalogue);
+ /**
+ * Gets the fallback catalogue.
+ *
+ * @return self|null A MessageCatalogueInterface instance or null when no fallback has been set
+ */
+ public function getFallbackCatalogue();
+ /**
+ * Returns an array of resources loaded to build this collection.
+ *
+ * @return ResourceInterface[] An array of resources
+ */
+ public function getResources();
+ /**
+ * Adds a resource for this collection.
+ */
+ public function addResource(\ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Config\Resource\ResourceInterface $resource);
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/MessageSelector.php b/classes/Utilities/Misc/Symfony/Component/Translation/MessageSelector.php
new file mode 100755
index 00000000..28c20b19
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/MessageSelector.php
@@ -0,0 +1,88 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation;
+
+@\trigger_error(\sprintf('The "%s" class is deprecated since Symfony 4.2, use IdentityTranslator instead.', \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageSelector::class), \E_USER_DEPRECATED);
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidArgumentException;
+/**
+ * MessageSelector.
+ *
+ * @author Fabien Potencier
+ * @author Bernhard Schussek
+ *
+ * @deprecated since Symfony 4.2, use IdentityTranslator instead.
+ */
+class MessageSelector
+{
+ /**
+ * Given a message with different plural translations separated by a
+ * pipe (|), this method returns the correct portion of the message based
+ * on the given number, locale and the pluralization rules in the message
+ * itself.
+ *
+ * The message supports two different types of pluralization rules:
+ *
+ * interval: {0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples
+ * indexed: There is one apple|There are %count% apples
+ *
+ * The indexed solution can also contain labels (e.g. one: There is one apple).
+ * This is purely for making the translations more clear - it does not
+ * affect the functionality.
+ *
+ * The two methods can also be mixed:
+ * {0} There are no apples|one: There is one apple|more: There are %count% apples
+ *
+ * @param string $message The message being translated
+ * @param int|float $number The number of items represented for the message
+ * @param string $locale The locale to use for choosing
+ *
+ * @return string
+ *
+ * @throws InvalidArgumentException
+ */
+ public function choose($message, $number, $locale)
+ {
+ $parts = [];
+ if (\preg_match('/^\\|++$/', $message)) {
+ $parts = \explode('|', $message);
+ } elseif (\preg_match_all('/(?:\\|\\||[^\\|])++/', $message, $matches)) {
+ $parts = $matches[0];
+ }
+ $explicitRules = [];
+ $standardRules = [];
+ foreach ($parts as $part) {
+ $part = \trim(\str_replace('||', '|', $part));
+ if (\preg_match('/^(?P' . \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Interval::getIntervalRegexp() . ')\\s*(?P.*?)$/xs', $part, $matches)) {
+ $explicitRules[$matches['interval']] = $matches['message'];
+ } elseif (\preg_match('/^\\w+\\:\\s*(.*?)$/', $part, $matches)) {
+ $standardRules[] = $matches[1];
+ } else {
+ $standardRules[] = $part;
+ }
+ }
+ // try to match an explicit rule, then fallback to the standard ones
+ foreach ($explicitRules as $interval => $m) {
+ if (\ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Interval::test($number, $interval)) {
+ return $m;
+ }
+ }
+ $position = \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\PluralizationRules::get($number, $locale);
+ if (!isset($standardRules[$position])) {
+ // when there's exactly one rule given, and that rule is a standard
+ // rule, use this rule
+ if (1 === \count($parts) && isset($standardRules[0])) {
+ return $standardRules[0];
+ }
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidArgumentException(\sprintf('Unable to choose a translation for "%s" with locale "%s" for value "%d". Double check that this translation has the correct plural options (e.g. "There is one apple|There are %%count%% apples").', $message, $locale, $number));
+ }
+ return $standardRules[$position];
+ }
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/MetadataAwareInterface.php b/classes/Utilities/Misc/Symfony/Component/Translation/MetadataAwareInterface.php
new file mode 100755
index 00000000..ad9f4bdb
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/MetadataAwareInterface.php
@@ -0,0 +1,51 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation;
+
+/**
+ * MetadataAwareInterface.
+ *
+ * @author Fabien Potencier
+ */
+interface MetadataAwareInterface
+{
+ /**
+ * Gets metadata for the given domain and key.
+ *
+ * Passing an empty domain will return an array with all metadata indexed by
+ * domain and then by key. Passing an empty key will return an array with all
+ * metadata for the given domain.
+ *
+ * @param string $key The key
+ * @param string $domain The domain name
+ *
+ * @return mixed The value that was set or an array with the domains/keys or null
+ */
+ public function getMetadata($key = '', $domain = 'messages');
+ /**
+ * Adds metadata to a message domain.
+ *
+ * @param string $key The key
+ * @param mixed $value The value
+ * @param string $domain The domain name
+ */
+ public function setMetadata($key, $value, $domain = 'messages');
+ /**
+ * Deletes metadata for the given key and domain.
+ *
+ * Passing an empty domain will delete all metadata. Passing an empty key will
+ * delete all metadata for the given domain.
+ *
+ * @param string $key The key
+ * @param string $domain The domain name
+ */
+ public function deleteMetadata($key = '', $domain = 'messages');
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/PluralizationRules.php b/classes/Utilities/Misc/Symfony/Component/Translation/PluralizationRules.php
new file mode 100755
index 00000000..b71ee5c7
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/PluralizationRules.php
@@ -0,0 +1,191 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation;
+
+/**
+ * Returns the plural rules for a given locale.
+ *
+ * @author Fabien Potencier
+ *
+ * @deprecated since Symfony 4.2, use IdentityTranslator instead
+ */
+class PluralizationRules
+{
+ private static $rules = [];
+ /**
+ * Returns the plural position to use for the given locale and number.
+ *
+ * @param int $number The number
+ * @param string $locale The locale
+ *
+ * @return int The plural position
+ */
+ public static function get($number, $locale)
+ {
+ if (3 > \func_num_args() || \func_get_arg(2)) {
+ @\trigger_error(\sprintf('The "%s" class is deprecated since Symfony 4.2.', __CLASS__), \E_USER_DEPRECATED);
+ }
+ if ('pt_BR' === $locale) {
+ // temporary set a locale for brazilian
+ $locale = 'xbr';
+ }
+ if (\strlen($locale) > 3) {
+ $locale = \substr($locale, 0, -\strlen(\strrchr($locale, '_')));
+ }
+ if (isset(self::$rules[$locale])) {
+ $return = self::$rules[$locale]($number);
+ if (!\is_int($return) || $return < 0) {
+ return 0;
+ }
+ return $return;
+ }
+ /*
+ * The plural rules are derived from code of the Zend Framework (2010-09-25),
+ * which is subject to the new BSD license (http://framework.zend.com/license/new-bsd).
+ * Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
+ */
+ switch ($locale) {
+ case 'az':
+ case 'bo':
+ case 'dz':
+ case 'id':
+ case 'ja':
+ case 'jv':
+ case 'ka':
+ case 'km':
+ case 'kn':
+ case 'ko':
+ case 'ms':
+ case 'th':
+ case 'tr':
+ case 'vi':
+ case 'zh':
+ return 0;
+ case 'af':
+ case 'bn':
+ case 'bg':
+ case 'ca':
+ case 'da':
+ case 'de':
+ case 'el':
+ case 'en':
+ case 'eo':
+ case 'es':
+ case 'et':
+ case 'eu':
+ case 'fa':
+ case 'fi':
+ case 'fo':
+ case 'fur':
+ case 'fy':
+ case 'gl':
+ case 'gu':
+ case 'ha':
+ case 'he':
+ case 'hu':
+ case 'is':
+ case 'it':
+ case 'ku':
+ case 'lb':
+ case 'ml':
+ case 'mn':
+ case 'mr':
+ case 'nah':
+ case 'nb':
+ case 'ne':
+ case 'nl':
+ case 'nn':
+ case 'no':
+ case 'oc':
+ case 'om':
+ case 'or':
+ case 'pa':
+ case 'pap':
+ case 'ps':
+ case 'pt':
+ case 'so':
+ case 'sq':
+ case 'sv':
+ case 'sw':
+ case 'ta':
+ case 'te':
+ case 'tk':
+ case 'ur':
+ case 'zu':
+ return 1 == $number ? 0 : 1;
+ case 'am':
+ case 'bh':
+ case 'fil':
+ case 'fr':
+ case 'gun':
+ case 'hi':
+ case 'hy':
+ case 'ln':
+ case 'mg':
+ case 'nso':
+ case 'xbr':
+ case 'ti':
+ case 'wa':
+ return 0 == $number || 1 == $number ? 0 : 1;
+ case 'be':
+ case 'bs':
+ case 'hr':
+ case 'ru':
+ case 'sh':
+ case 'sr':
+ case 'uk':
+ return 1 == $number % 10 && 11 != $number % 100 ? 0 : ($number % 10 >= 2 && $number % 10 <= 4 && ($number % 100 < 10 || $number % 100 >= 20) ? 1 : 2);
+ case 'cs':
+ case 'sk':
+ return 1 == $number ? 0 : ($number >= 2 && $number <= 4 ? 1 : 2);
+ case 'ga':
+ return 1 == $number ? 0 : (2 == $number ? 1 : 2);
+ case 'lt':
+ return 1 == $number % 10 && 11 != $number % 100 ? 0 : ($number % 10 >= 2 && ($number % 100 < 10 || $number % 100 >= 20) ? 1 : 2);
+ case 'sl':
+ return 1 == $number % 100 ? 0 : (2 == $number % 100 ? 1 : (3 == $number % 100 || 4 == $number % 100 ? 2 : 3));
+ case 'mk':
+ return 1 == $number % 10 ? 0 : 1;
+ case 'mt':
+ return 1 == $number ? 0 : (0 == $number || $number % 100 > 1 && $number % 100 < 11 ? 1 : ($number % 100 > 10 && $number % 100 < 20 ? 2 : 3));
+ case 'lv':
+ return 0 == $number ? 0 : (1 == $number % 10 && 11 != $number % 100 ? 1 : 2);
+ case 'pl':
+ return 1 == $number ? 0 : ($number % 10 >= 2 && $number % 10 <= 4 && ($number % 100 < 12 || $number % 100 > 14) ? 1 : 2);
+ case 'cy':
+ return 1 == $number ? 0 : (2 == $number ? 1 : (8 == $number || 11 == $number ? 2 : 3));
+ case 'ro':
+ return 1 == $number ? 0 : (0 == $number || $number % 100 > 0 && $number % 100 < 20 ? 1 : 2);
+ case 'ar':
+ return 0 == $number ? 0 : (1 == $number ? 1 : (2 == $number ? 2 : ($number % 100 >= 3 && $number % 100 <= 10 ? 3 : ($number % 100 >= 11 && $number % 100 <= 99 ? 4 : 5))));
+ default:
+ return 0;
+ }
+ }
+ /**
+ * Overrides the default plural rule for a given locale.
+ *
+ * @param callable $rule A PHP callable
+ * @param string $locale The locale
+ */
+ public static function set(callable $rule, $locale)
+ {
+ @\trigger_error(\sprintf('The "%s" class is deprecated since Symfony 4.2.', __CLASS__), \E_USER_DEPRECATED);
+ if ('pt_BR' === $locale) {
+ // temporary set a locale for brazilian
+ $locale = 'xbr';
+ }
+ if (\strlen($locale) > 3) {
+ $locale = \substr($locale, 0, -\strlen(\strrchr($locale, '_')));
+ }
+ self::$rules[$locale] = $rule;
+ }
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/Reader/TranslationReader.php b/classes/Utilities/Misc/Symfony/Component/Translation/Reader/TranslationReader.php
new file mode 100755
index 00000000..7012cf16
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/Reader/TranslationReader.php
@@ -0,0 +1,57 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Reader;
+
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Finder\Finder;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Loader\LoaderInterface;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogue;
+/**
+ * TranslationReader reads translation messages from translation files.
+ *
+ * @author Michel Salib
+ */
+class TranslationReader implements \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Reader\TranslationReaderInterface
+{
+ /**
+ * Loaders used for import.
+ *
+ * @var array
+ */
+ private $loaders = [];
+ /**
+ * Adds a loader to the translation extractor.
+ *
+ * @param string $format The format of the loader
+ */
+ public function addLoader($format, \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Loader\LoaderInterface $loader)
+ {
+ $this->loaders[$format] = $loader;
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function read($directory, \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogue $catalogue)
+ {
+ if (!\is_dir($directory)) {
+ return;
+ }
+ foreach ($this->loaders as $format => $loader) {
+ // load any existing translation files
+ $finder = new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Finder\Finder();
+ $extension = $catalogue->getLocale() . '.' . $format;
+ $files = $finder->files()->name('*.' . $extension)->in($directory);
+ foreach ($files as $file) {
+ $domain = \substr($file->getFilename(), 0, -1 * \strlen($extension) - 1);
+ $catalogue->addCatalogue($loader->load($file->getPathname(), $catalogue->getLocale(), $domain));
+ }
+ }
+ }
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/Reader/TranslationReaderInterface.php b/classes/Utilities/Misc/Symfony/Component/Translation/Reader/TranslationReaderInterface.php
new file mode 100755
index 00000000..ae333fb8
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/Reader/TranslationReaderInterface.php
@@ -0,0 +1,27 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Reader;
+
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogue;
+/**
+ * TranslationReader reads translation messages from translation files.
+ *
+ * @author Tobias Nyholm
+ */
+interface TranslationReaderInterface
+{
+ /**
+ * Reads translation messages from a directory to the catalogue.
+ *
+ * @param string $directory
+ */
+ public function read($directory, \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogue $catalogue);
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/Resources/bin/translation-status.php b/classes/Utilities/Misc/Symfony/Component/Translation/Resources/bin/translation-status.php
new file mode 100755
index 00000000..47b97559
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/Resources/bin/translation-status.php
@@ -0,0 +1,161 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+$usageInstructions = << \false,
+ // NULL = analyze all locales
+ 'locale_to_analyze' => null,
+ // the reference files all the other translations are compared to
+ 'original_files' => ['src/Symfony/Component/Form/Resources/translations/validators.en.xlf', 'src/Symfony/Component/Security/Core/Resources/translations/security.en.xlf', 'src/Symfony/Component/Validator/Resources/translations/validators.en.xlf'],
+];
+$argc = $_SERVER['argc'];
+$argv = $_SERVER['argv'];
+if ($argc > 3) {
+ echo \str_replace('translation-status.php', $argv[0], $usageInstructions);
+ exit(1);
+}
+foreach (\array_slice($argv, 1) as $argumentOrOption) {
+ if (0 === \strpos($argumentOrOption, '-')) {
+ $config['verbose_output'] = \true;
+ } else {
+ $config['locale_to_analyze'] = $argumentOrOption;
+ }
+}
+foreach ($config['original_files'] as $originalFilePath) {
+ if (!\file_exists($originalFilePath)) {
+ echo \sprintf('The following file does not exist. Make sure that you execute this command at the root dir of the Symfony code repository.%s %s', \PHP_EOL, $originalFilePath);
+ exit(1);
+ }
+}
+$totalMissingTranslations = 0;
+foreach ($config['original_files'] as $originalFilePath) {
+ $translationFilePaths = \ILAB\MediaCloud\Utilities\Misc\findTranslationFiles($originalFilePath, $config['locale_to_analyze']);
+ $translationStatus = \ILAB\MediaCloud\Utilities\Misc\calculateTranslationStatus($originalFilePath, $translationFilePaths);
+ $totalMissingTranslations += \array_sum(\array_map(function ($translation) {
+ return \count($translation['missingKeys']);
+ }, \array_values($translationStatus)));
+ \ILAB\MediaCloud\Utilities\Misc\printTranslationStatus($originalFilePath, $translationStatus, $config['verbose_output']);
+}
+exit($totalMissingTranslations > 0 ? 1 : 0);
+function findTranslationFiles($originalFilePath, $localeToAnalyze)
+{
+ $translations = [];
+ $translationsDir = \dirname($originalFilePath);
+ $originalFileName = \basename($originalFilePath);
+ $translationFileNamePattern = \str_replace('.en.', '.*.', $originalFileName);
+ $translationFiles = \glob($translationsDir . '/' . $translationFileNamePattern, \GLOB_NOSORT);
+ \sort($translationFiles);
+ foreach ($translationFiles as $filePath) {
+ $locale = \ILAB\MediaCloud\Utilities\Misc\extractLocaleFromFilePath($filePath);
+ if (null !== $localeToAnalyze && $locale !== $localeToAnalyze) {
+ continue;
+ }
+ $translations[$locale] = $filePath;
+ }
+ return $translations;
+}
+function calculateTranslationStatus($originalFilePath, $translationFilePaths)
+{
+ $translationStatus = [];
+ $allTranslationKeys = \ILAB\MediaCloud\Utilities\Misc\extractTranslationKeys($originalFilePath);
+ foreach ($translationFilePaths as $locale => $translationPath) {
+ $translatedKeys = \ILAB\MediaCloud\Utilities\Misc\extractTranslationKeys($translationPath);
+ $missingKeys = \array_diff_key($allTranslationKeys, $translatedKeys);
+ $translationStatus[$locale] = ['total' => \count($allTranslationKeys), 'translated' => \count($translatedKeys), 'missingKeys' => $missingKeys];
+ }
+ return $translationStatus;
+}
+function printTranslationStatus($originalFilePath, $translationStatus, $verboseOutput)
+{
+ \ILAB\MediaCloud\Utilities\Misc\printTitle($originalFilePath);
+ \ILAB\MediaCloud\Utilities\Misc\printTable($translationStatus, $verboseOutput);
+ echo \PHP_EOL . \PHP_EOL;
+}
+function extractLocaleFromFilePath($filePath)
+{
+ $parts = \explode('.', $filePath);
+ return $parts[\count($parts) - 2];
+}
+function extractTranslationKeys($filePath)
+{
+ $translationKeys = [];
+ $contents = new \SimpleXMLElement(\file_get_contents($filePath));
+ foreach ($contents->file->body->{'trans-unit'} as $translationKey) {
+ $translationId = (string) $translationKey['id'];
+ $translationKey = (string) $translationKey->source;
+ $translationKeys[$translationId] = $translationKey;
+ }
+ return $translationKeys;
+}
+function printTitle($title)
+{
+ echo $title . \PHP_EOL;
+ echo \str_repeat('=', \strlen($title)) . \PHP_EOL . \PHP_EOL;
+}
+function printTable($translations, $verboseOutput)
+{
+ if (0 === \count($translations)) {
+ echo 'No translations found';
+ return;
+ }
+ $longestLocaleNameLength = \max(\array_map('strlen', \array_keys($translations)));
+ foreach ($translations as $locale => $translation) {
+ if ($translation['translated'] > $translation['total']) {
+ \ILAB\MediaCloud\Utilities\Misc\textColorRed();
+ } elseif ($translation['translated'] === $translation['total']) {
+ \ILAB\MediaCloud\Utilities\Misc\textColorGreen();
+ }
+ echo \sprintf('| Locale: %-' . $longestLocaleNameLength . 's | Translated: %d/%d', $locale, $translation['translated'], $translation['total']) . \PHP_EOL;
+ \ILAB\MediaCloud\Utilities\Misc\textColorNormal();
+ if (\true === $verboseOutput && \count($translation['missingKeys']) > 0) {
+ echo \str_repeat('-', 80) . \PHP_EOL;
+ echo '| Missing Translations:' . \PHP_EOL;
+ foreach ($translation['missingKeys'] as $id => $content) {
+ echo \sprintf('| (id=%s) %s', $id, $content) . \PHP_EOL;
+ }
+ echo \str_repeat('-', 80) . \PHP_EOL;
+ }
+ }
+}
+function textColorGreen()
+{
+ echo "\33[32m";
+}
+function textColorRed()
+{
+ echo "\33[31m";
+}
+function textColorNormal()
+{
+ echo "\33[0m";
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/Resources/data/parents.json b/classes/Utilities/Misc/Symfony/Component/Translation/Resources/data/parents.json
new file mode 100755
index 00000000..6e45d9f3
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/Resources/data/parents.json
@@ -0,0 +1,136 @@
+{
+ "az_Cyrl": "root",
+ "bs_Cyrl": "root",
+ "en_150": "en_001",
+ "en_AG": "en_001",
+ "en_AI": "en_001",
+ "en_AT": "en_150",
+ "en_AU": "en_001",
+ "en_BB": "en_001",
+ "en_BE": "en_150",
+ "en_BM": "en_001",
+ "en_BS": "en_001",
+ "en_BW": "en_001",
+ "en_BZ": "en_001",
+ "en_CA": "en_001",
+ "en_CC": "en_001",
+ "en_CH": "en_150",
+ "en_CK": "en_001",
+ "en_CM": "en_001",
+ "en_CX": "en_001",
+ "en_CY": "en_001",
+ "en_DE": "en_150",
+ "en_DG": "en_001",
+ "en_DK": "en_150",
+ "en_DM": "en_001",
+ "en_ER": "en_001",
+ "en_FI": "en_150",
+ "en_FJ": "en_001",
+ "en_FK": "en_001",
+ "en_FM": "en_001",
+ "en_GB": "en_001",
+ "en_GD": "en_001",
+ "en_GG": "en_001",
+ "en_GH": "en_001",
+ "en_GI": "en_001",
+ "en_GM": "en_001",
+ "en_GY": "en_001",
+ "en_HK": "en_001",
+ "en_IE": "en_001",
+ "en_IL": "en_001",
+ "en_IM": "en_001",
+ "en_IN": "en_001",
+ "en_IO": "en_001",
+ "en_JE": "en_001",
+ "en_JM": "en_001",
+ "en_KE": "en_001",
+ "en_KI": "en_001",
+ "en_KN": "en_001",
+ "en_KY": "en_001",
+ "en_LC": "en_001",
+ "en_LR": "en_001",
+ "en_LS": "en_001",
+ "en_MG": "en_001",
+ "en_MO": "en_001",
+ "en_MS": "en_001",
+ "en_MT": "en_001",
+ "en_MU": "en_001",
+ "en_MW": "en_001",
+ "en_MY": "en_001",
+ "en_NA": "en_001",
+ "en_NF": "en_001",
+ "en_NG": "en_001",
+ "en_NL": "en_150",
+ "en_NR": "en_001",
+ "en_NU": "en_001",
+ "en_NZ": "en_001",
+ "en_PG": "en_001",
+ "en_PH": "en_001",
+ "en_PK": "en_001",
+ "en_PN": "en_001",
+ "en_PW": "en_001",
+ "en_RW": "en_001",
+ "en_SB": "en_001",
+ "en_SC": "en_001",
+ "en_SD": "en_001",
+ "en_SE": "en_150",
+ "en_SG": "en_001",
+ "en_SH": "en_001",
+ "en_SI": "en_150",
+ "en_SL": "en_001",
+ "en_SS": "en_001",
+ "en_SX": "en_001",
+ "en_SZ": "en_001",
+ "en_TC": "en_001",
+ "en_TK": "en_001",
+ "en_TO": "en_001",
+ "en_TT": "en_001",
+ "en_TV": "en_001",
+ "en_TZ": "en_001",
+ "en_UG": "en_001",
+ "en_VC": "en_001",
+ "en_VG": "en_001",
+ "en_VU": "en_001",
+ "en_WS": "en_001",
+ "en_ZA": "en_001",
+ "en_ZM": "en_001",
+ "en_ZW": "en_001",
+ "es_AR": "es_419",
+ "es_BO": "es_419",
+ "es_BR": "es_419",
+ "es_BZ": "es_419",
+ "es_CL": "es_419",
+ "es_CO": "es_419",
+ "es_CR": "es_419",
+ "es_CU": "es_419",
+ "es_DO": "es_419",
+ "es_EC": "es_419",
+ "es_GT": "es_419",
+ "es_HN": "es_419",
+ "es_MX": "es_419",
+ "es_NI": "es_419",
+ "es_PA": "es_419",
+ "es_PE": "es_419",
+ "es_PR": "es_419",
+ "es_PY": "es_419",
+ "es_SV": "es_419",
+ "es_US": "es_419",
+ "es_UY": "es_419",
+ "es_VE": "es_419",
+ "pa_Arab": "root",
+ "pt_AO": "pt_PT",
+ "pt_CH": "pt_PT",
+ "pt_CV": "pt_PT",
+ "pt_GQ": "pt_PT",
+ "pt_GW": "pt_PT",
+ "pt_LU": "pt_PT",
+ "pt_MO": "pt_PT",
+ "pt_MZ": "pt_PT",
+ "pt_ST": "pt_PT",
+ "pt_TL": "pt_PT",
+ "sr_Latn": "root",
+ "uz_Arab": "root",
+ "uz_Cyrl": "root",
+ "zh_Hant": "root",
+ "zh_Hant_MO": "zh_Hant_HK"
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/Resources/schemas/xliff-core-1.2-strict.xsd b/classes/Utilities/Misc/Symfony/Component/Translation/Resources/schemas/xliff-core-1.2-strict.xsd
new file mode 100755
index 00000000..dface628
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/Resources/schemas/xliff-core-1.2-strict.xsd
@@ -0,0 +1,2223 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Values for the attribute 'context-type'.
+
+
+
+
+ Indicates a database content.
+
+
+
+
+ Indicates the content of an element within an XML document.
+
+
+
+
+ Indicates the name of an element within an XML document.
+
+
+
+
+ Indicates the line number from the sourcefile (see context-type="sourcefile") where the <source> is found.
+
+
+
+
+ Indicates a the number of parameters contained within the <source>.
+
+
+
+
+ Indicates notes pertaining to the parameters in the <source>.
+
+
+
+
+ Indicates the content of a record within a database.
+
+
+
+
+ Indicates the name of a record within a database.
+
+
+
+
+ Indicates the original source file in the case that multiple files are merged to form the original file from which the XLIFF file is created. This differs from the original <file> attribute in that this sourcefile is one of many that make up that file.
+
+
+
+
+
+
+ Values for the attribute 'count-type'.
+
+
+
+
+ Indicates the count units are items that are used X times in a certain context; example: this is a reusable text unit which is used 42 times in other texts.
+
+
+
+
+ Indicates the count units are translation units existing already in the same document.
+
+
+
+
+ Indicates a total count.
+
+
+
+
+
+
+ Values for the attribute 'ctype' when used other elements than <ph> or <x>.
+
+
+
+
+ Indicates a run of bolded text.
+
+
+
+
+ Indicates a run of text in italics.
+
+
+
+
+ Indicates a run of underlined text.
+
+
+
+
+ Indicates a run of hyper-text.
+
+
+
+
+
+
+ Values for the attribute 'ctype' when used with <ph> or <x>.
+
+
+
+
+ Indicates a inline image.
+
+
+
+
+ Indicates a page break.
+
+
+
+
+ Indicates a line break.
+
+
+
+
+
+
+
+
+
+
+
+ Values for the attribute 'datatype'.
+
+
+
+
+ Indicates Active Server Page data.
+
+
+
+
+ Indicates C source file data.
+
+
+
+
+ Indicates Channel Definition Format (CDF) data.
+
+
+
+
+ Indicates ColdFusion data.
+
+
+
+
+ Indicates C++ source file data.
+
+
+
+
+ Indicates C-Sharp data.
+
+
+
+
+ Indicates strings from C, ASM, and driver files data.
+
+
+
+
+ Indicates comma-separated values data.
+
+
+
+
+ Indicates database data.
+
+
+
+
+ Indicates portions of document that follows data and contains metadata.
+
+
+
+
+ Indicates portions of document that precedes data and contains metadata.
+
+
+
+
+ Indicates data from standard UI file operations dialogs (e.g., Open, Save, Save As, Export, Import).
+
+
+
+
+ Indicates standard user input screen data.
+
+
+
+
+ Indicates HyperText Markup Language (HTML) data - document instance.
+
+
+
+
+ Indicates content within an HTML document’s <body> element.
+
+
+
+
+ Indicates Windows INI file data.
+
+
+
+
+ Indicates Interleaf data.
+
+
+
+
+ Indicates Java source file data (extension '.java').
+
+
+
+
+ Indicates Java property resource bundle data.
+
+
+
+
+ Indicates Java list resource bundle data.
+
+
+
+
+ Indicates JavaScript source file data.
+
+
+
+
+ Indicates JScript source file data.
+
+
+
+
+ Indicates information relating to formatting.
+
+
+
+
+ Indicates LISP source file data.
+
+
+
+
+ Indicates information relating to margin formats.
+
+
+
+
+ Indicates a file containing menu.
+
+
+
+
+ Indicates numerically identified string table.
+
+
+
+
+ Indicates Maker Interchange Format (MIF) data.
+
+
+
+
+ Indicates that the datatype attribute value is a MIME Type value and is defined in the mime-type attribute.
+
+
+
+
+ Indicates GNU Machine Object data.
+
+
+
+
+ Indicates Message Librarian strings created by Novell's Message Librarian Tool.
+
+
+
+
+ Indicates information to be displayed at the bottom of each page of a document.
+
+
+
+
+ Indicates information to be displayed at the top of each page of a document.
+
+
+
+
+ Indicates a list of property values (e.g., settings within INI files or preferences dialog).
+
+
+
+
+ Indicates Pascal source file data.
+
+
+
+
+ Indicates Hypertext Preprocessor data.
+
+
+
+
+ Indicates plain text file (no formatting other than, possibly, wrapping).
+
+
+
+
+ Indicates GNU Portable Object file.
+
+
+
+
+ Indicates dynamically generated user defined document. e.g. Oracle Report, Crystal Report, etc.
+
+
+
+
+ Indicates Windows .NET binary resources.
+
+
+
+
+ Indicates Windows .NET Resources.
+
+
+
+
+ Indicates Rich Text Format (RTF) data.
+
+
+
+
+ Indicates Standard Generalized Markup Language (SGML) data - document instance.
+
+
+
+
+ Indicates Standard Generalized Markup Language (SGML) data - Document Type Definition (DTD).
+
+
+
+
+ Indicates Scalable Vector Graphic (SVG) data.
+
+
+
+
+ Indicates VisualBasic Script source file.
+
+
+
+
+ Indicates warning message.
+
+
+
+
+ Indicates Windows (Win32) resources (i.e. resources extracted from an RC script, a message file, or a compiled file).
+
+
+
+
+ Indicates Extensible HyperText Markup Language (XHTML) data - document instance.
+
+
+
+
+ Indicates Extensible Markup Language (XML) data - document instance.
+
+
+
+
+ Indicates Extensible Markup Language (XML) data - Document Type Definition (DTD).
+
+
+
+
+ Indicates Extensible Stylesheet Language (XSL) data.
+
+
+
+
+ Indicates XUL elements.
+
+
+
+
+
+
+ Values for the attribute 'mtype'.
+
+
+
+
+ Indicates the marked text is an abbreviation.
+
+
+
+
+ ISO-12620 2.1.8: A term resulting from the omission of any part of the full term while designating the same concept.
+
+
+
+
+ ISO-12620 2.1.8.1: An abbreviated form of a simple term resulting from the omission of some of its letters (e.g. 'adj.' for 'adjective').
+
+
+
+
+ ISO-12620 2.1.8.4: An abbreviated form of a term made up of letters from the full form of a multiword term strung together into a sequence pronounced only syllabically (e.g. 'radar' for 'radio detecting and ranging').
+
+
+
+
+ ISO-12620: A proper-name term, such as the name of an agency or other proper entity.
+
+
+
+
+ ISO-12620 2.1.18.1: A recurrent word combination characterized by cohesion in that the components of the collocation must co-occur within an utterance or series of utterances, even though they do not necessarily have to maintain immediate proximity to one another.
+
+
+
+
+ ISO-12620 2.1.5: A synonym for an international scientific term that is used in general discourse in a given language.
+
+
+
+
+ Indicates the marked text is a date and/or time.
+
+
+
+
+ ISO-12620 2.1.15: An expression used to represent a concept based on a statement that two mathematical expressions are, for instance, equal as identified by the equal sign (=), or assigned to one another by a similar sign.
+
+
+
+
+ ISO-12620 2.1.7: The complete representation of a term for which there is an abbreviated form.
+
+
+
+
+ ISO-12620 2.1.14: Figures, symbols or the like used to express a concept briefly, such as a mathematical or chemical formula.
+
+
+
+
+ ISO-12620 2.1.1: The concept designation that has been chosen to head a terminological record.
+
+
+
+
+ ISO-12620 2.1.8.3: An abbreviated form of a term consisting of some of the initial letters of the words making up a multiword term or the term elements making up a compound term when these letters are pronounced individually (e.g. 'BSE' for 'bovine spongiform encephalopathy').
+
+
+
+
+ ISO-12620 2.1.4: A term that is part of an international scientific nomenclature as adopted by an appropriate scientific body.
+
+
+
+
+ ISO-12620 2.1.6: A term that has the same or nearly identical orthographic or phonemic form in many languages.
+
+
+
+
+ ISO-12620 2.1.16: An expression used to represent a concept based on mathematical or logical relations, such as statements of inequality, set relationships, Boolean operations, and the like.
+
+
+
+
+ ISO-12620 2.1.17: A unit to track object.
+
+
+
+
+ Indicates the marked text is a name.
+
+
+
+
+ ISO-12620 2.1.3: A term that represents the same or a very similar concept as another term in the same language, but for which interchangeability is limited to some contexts and inapplicable in others.
+
+
+
+
+ ISO-12620 2.1.17.2: A unique alphanumeric designation assigned to an object in a manufacturing system.
+
+
+
+
+ Indicates the marked text is a phrase.
+
+
+
+
+ ISO-12620 2.1.18: Any group of two or more words that form a unit, the meaning of which frequently cannot be deduced based on the combined sense of the words making up the phrase.
+
+
+
+
+ Indicates the marked text should not be translated.
+
+
+
+
+ ISO-12620 2.1.12: A form of a term resulting from an operation whereby non-Latin writing systems are converted to the Latin alphabet.
+
+
+
+
+ Indicates that the marked text represents a segment.
+
+
+
+
+ ISO-12620 2.1.18.2: A fixed, lexicalized phrase.
+
+
+
+
+ ISO-12620 2.1.8.2: A variant of a multiword term that includes fewer words than the full form of the term (e.g. 'Group of Twenty-four' for 'Intergovernmental Group of Twenty-four on International Monetary Affairs').
+
+
+
+
+ ISO-12620 2.1.17.1: Stock keeping unit, an inventory item identified by a unique alphanumeric designation assigned to an object in an inventory control system.
+
+
+
+
+ ISO-12620 2.1.19: A fixed chunk of recurring text.
+
+
+
+
+ ISO-12620 2.1.13: A designation of a concept by letters, numerals, pictograms or any combination thereof.
+
+
+
+
+ ISO-12620 2.1.2: Any term that represents the same or a very similar concept as the main entry term in a term entry.
+
+
+
+
+ ISO-12620 2.1.18.3: Phraseological unit in a language that expresses the same semantic content as another phrase in that same language.
+
+
+
+
+ Indicates the marked text is a term.
+
+
+
+
+ ISO-12620 2.1.11: A form of a term resulting from an operation whereby the characters of one writing system are represented by characters from another writing system, taking into account the pronunciation of the characters converted.
+
+
+
+
+ ISO-12620 2.1.10: A form of a term resulting from an operation whereby the characters of an alphabetic writing system are represented by characters from another alphabetic writing system.
+
+
+
+
+ ISO-12620 2.1.8.5: An abbreviated form of a term resulting from the omission of one or more term elements or syllables (e.g. 'flu' for 'influenza').
+
+
+
+
+ ISO-12620 2.1.9: One of the alternate forms of a term.
+
+
+
+
+
+
+ Values for the attribute 'restype'.
+
+
+
+
+ Indicates a Windows RC AUTO3STATE control.
+
+
+
+
+ Indicates a Windows RC AUTOCHECKBOX control.
+
+
+
+
+ Indicates a Windows RC AUTORADIOBUTTON control.
+
+
+
+
+ Indicates a Windows RC BEDIT control.
+
+
+
+
+ Indicates a bitmap, for example a BITMAP resource in Windows.
+
+
+
+
+ Indicates a button object, for example a BUTTON control Windows.
+
+
+
+
+ Indicates a caption, such as the caption of a dialog box.
+
+
+
+
+ Indicates the cell in a table, for example the content of the <td> element in HTML.
+
+
+
+
+ Indicates check box object, for example a CHECKBOX control in Windows.
+
+
+
+
+ Indicates a menu item with an associated checkbox.
+
+
+
+
+ Indicates a list box, but with a check-box for each item.
+
+
+
+
+ Indicates a color selection dialog.
+
+
+
+
+ Indicates a combination of edit box and listbox object, for example a COMBOBOX control in Windows.
+
+
+
+
+ Indicates an initialization entry of an extended combobox DLGINIT resource block. (code 0x1234).
+
+
+
+
+ Indicates an initialization entry of a combobox DLGINIT resource block (code 0x0403).
+
+
+
+
+ Indicates a UI base class element that cannot be represented by any other element.
+
+
+
+
+ Indicates a context menu.
+
+
+
+
+ Indicates a Windows RC CTEXT control.
+
+
+
+
+ Indicates a cursor, for example a CURSOR resource in Windows.
+
+
+
+
+ Indicates a date/time picker.
+
+
+
+
+ Indicates a Windows RC DEFPUSHBUTTON control.
+
+
+
+
+ Indicates a dialog box.
+
+
+
+
+ Indicates a Windows RC DLGINIT resource block.
+
+
+
+
+ Indicates an edit box object, for example an EDIT control in Windows.
+
+
+
+
+ Indicates a filename.
+
+
+
+
+ Indicates a file dialog.
+
+
+
+
+ Indicates a footnote.
+
+
+
+
+ Indicates a font name.
+
+
+
+
+ Indicates a footer.
+
+
+
+
+ Indicates a frame object.
+
+
+
+
+ Indicates a XUL grid element.
+
+
+
+
+ Indicates a groupbox object, for example a GROUPBOX control in Windows.
+
+
+
+
+ Indicates a header item.
+
+
+
+
+ Indicates a heading, such has the content of <h1>, <h2>, etc. in HTML.
+
+
+
+
+ Indicates a Windows RC HEDIT control.
+
+
+
+
+ Indicates a horizontal scrollbar.
+
+
+
+
+ Indicates an icon, for example an ICON resource in Windows.
+
+
+
+
+ Indicates a Windows RC IEDIT control.
+
+
+
+
+ Indicates keyword list, such as the content of the Keywords meta-data in HTML, or a K footnote in WinHelp RTF.
+
+
+
+
+ Indicates a label object.
+
+
+
+
+ Indicates a label that is also a HTML link (not necessarily a URL).
+
+
+
+
+ Indicates a list (a group of list-items, for example an <ol> or <ul> element in HTML).
+
+
+
+
+ Indicates a listbox object, for example an LISTBOX control in Windows.
+
+
+
+
+ Indicates an list item (an entry in a list).
+
+
+
+
+ Indicates a Windows RC LTEXT control.
+
+
+
+
+ Indicates a menu (a group of menu-items).
+
+
+
+
+ Indicates a toolbar containing one or more tope level menus.
+
+
+
+
+ Indicates a menu item (an entry in a menu).
+
+
+
+
+ Indicates a XUL menuseparator element.
+
+
+
+
+ Indicates a message, for example an entry in a MESSAGETABLE resource in Windows.
+
+
+
+
+ Indicates a calendar control.
+
+
+
+
+ Indicates an edit box beside a spin control.
+
+
+
+
+ Indicates a catch all for rectangular areas.
+
+
+
+
+ Indicates a standalone menu not necessarily associated with a menubar.
+
+
+
+
+ Indicates a pushbox object, for example a PUSHBOX control in Windows.
+
+
+
+
+ Indicates a Windows RC PUSHBUTTON control.
+
+
+
+
+ Indicates a radio button object.
+
+
+
+
+ Indicates a menuitem with associated radio button.
+
+
+
+
+ Indicates raw data resources for an application.
+
+
+
+
+ Indicates a row in a table.
+
+
+
+
+ Indicates a Windows RC RTEXT control.
+
+
+
+
+ Indicates a user navigable container used to show a portion of a document.
+
+
+
+
+ Indicates a generic divider object (e.g. menu group separator).
+
+
+
+
+ Windows accelerators, shortcuts in resource or property files.
+
+
+
+
+ Indicates a UI control to indicate process activity but not progress.
+
+
+
+
+ Indicates a splitter bar.
+
+
+
+
+ Indicates a Windows RC STATE3 control.
+
+
+
+
+ Indicates a window for providing feedback to the users, like 'read-only', etc.
+
+
+
+
+ Indicates a string, for example an entry in a STRINGTABLE resource in Windows.
+
+
+
+
+ Indicates a layers of controls with a tab to select layers.
+
+
+
+
+ Indicates a display and edits regular two-dimensional tables of cells.
+
+
+
+
+ Indicates a XUL textbox element.
+
+
+
+
+ Indicates a UI button that can be toggled to on or off state.
+
+
+
+
+ Indicates an array of controls, usually buttons.
+
+
+
+
+ Indicates a pop up tool tip text.
+
+
+
+
+ Indicates a bar with a pointer indicating a position within a certain range.
+
+
+
+
+ Indicates a control that displays a set of hierarchical data.
+
+
+
+
+ Indicates a URI (URN or URL).
+
+
+
+
+ Indicates a Windows RC USERBUTTON control.
+
+
+
+
+ Indicates a user-defined control like CONTROL control in Windows.
+
+
+
+
+ Indicates the text of a variable.
+
+
+
+
+ Indicates version information about a resource like VERSIONINFO in Windows.
+
+
+
+
+ Indicates a vertical scrollbar.
+
+
+
+
+ Indicates a graphical window.
+
+
+
+
+
+
+ Values for the attribute 'size-unit'.
+
+
+
+
+ Indicates a size in 8-bit bytes.
+
+
+
+
+ Indicates a size in Unicode characters.
+
+
+
+
+ Indicates a size in columns. Used for HTML text area.
+
+
+
+
+ Indicates a size in centimeters.
+
+
+
+
+ Indicates a size in dialog units, as defined in Windows resources.
+
+
+
+
+ Indicates a size in 'font-size' units (as defined in CSS).
+
+
+
+
+ Indicates a size in 'x-height' units (as defined in CSS).
+
+
+
+
+ Indicates a size in glyphs. A glyph is considered to be one or more combined Unicode characters that represent a single displayable text character. Sometimes referred to as a 'grapheme cluster'
+
+
+
+
+ Indicates a size in inches.
+
+
+
+
+ Indicates a size in millimeters.
+
+
+
+
+ Indicates a size in percentage.
+
+
+
+
+ Indicates a size in pixels.
+
+
+
+
+ Indicates a size in point.
+
+
+
+
+ Indicates a size in rows. Used for HTML text area.
+
+
+
+
+
+
+ Values for the attribute 'state'.
+
+
+
+
+ Indicates the terminating state.
+
+
+
+
+ Indicates only non-textual information needs adaptation.
+
+
+
+
+ Indicates both text and non-textual information needs adaptation.
+
+
+
+
+ Indicates only non-textual information needs review.
+
+
+
+
+ Indicates both text and non-textual information needs review.
+
+
+
+
+ Indicates that only the text of the item needs to be reviewed.
+
+
+
+
+ Indicates that the item needs to be translated.
+
+
+
+
+ Indicates that the item is new. For example, translation units that were not in a previous version of the document.
+
+
+
+
+ Indicates that changes are reviewed and approved.
+
+
+
+
+ Indicates that the item has been translated.
+
+
+
+
+
+
+ Values for the attribute 'state-qualifier'.
+
+
+
+
+ Indicates an exact match. An exact match occurs when a source text of a segment is exactly the same as the source text of a segment that was translated previously.
+
+
+
+
+ Indicates a fuzzy match. A fuzzy match occurs when a source text of a segment is very similar to the source text of a segment that was translated previously (e.g. when the difference is casing, a few changed words, white-space discripancy, etc.).
+
+
+
+
+ Indicates a match based on matching IDs (in addition to matching text).
+
+
+
+
+ Indicates a translation derived from a glossary.
+
+
+
+
+ Indicates a translation derived from existing translation.
+
+
+
+
+ Indicates a translation derived from machine translation.
+
+
+
+
+ Indicates a translation derived from a translation repository.
+
+
+
+
+ Indicates a translation derived from a translation memory.
+
+
+
+
+ Indicates the translation is suggested by machine translation.
+
+
+
+
+ Indicates that the item has been rejected because of incorrect grammar.
+
+
+
+
+ Indicates that the item has been rejected because it is incorrect.
+
+
+
+
+ Indicates that the item has been rejected because it is too long or too short.
+
+
+
+
+ Indicates that the item has been rejected because of incorrect spelling.
+
+
+
+
+ Indicates the translation is suggested by translation memory.
+
+
+
+
+
+
+ Values for the attribute 'unit'.
+
+
+
+
+ Refers to words.
+
+
+
+
+ Refers to pages.
+
+
+
+
+ Refers to <trans-unit> elements.
+
+
+
+
+ Refers to <bin-unit> elements.
+
+
+
+
+ Refers to glyphs.
+
+
+
+
+ Refers to <trans-unit> and/or <bin-unit> elements.
+
+
+
+
+ Refers to the occurrences of instances defined by the count-type value.
+
+
+
+
+ Refers to characters.
+
+
+
+
+ Refers to lines.
+
+
+
+
+ Refers to sentences.
+
+
+
+
+ Refers to paragraphs.
+
+
+
+
+ Refers to segments.
+
+
+
+
+ Refers to placeables (inline elements).
+
+
+
+
+
+
+ Values for the attribute 'priority'.
+
+
+
+
+ Highest priority.
+
+
+
+
+ High priority.
+
+
+
+
+ High priority, but not as important as 2.
+
+
+
+
+ High priority, but not as important as 3.
+
+
+
+
+ Medium priority, but more important than 6.
+
+
+
+
+ Medium priority, but less important than 5.
+
+
+
+
+ Low priority, but more important than 8.
+
+
+
+
+ Low priority, but more important than 9.
+
+
+
+
+ Low priority.
+
+
+
+
+ Lowest priority.
+
+
+
+
+
+
+
+
+ This value indicates that all properties can be reformatted. This value must be used alone.
+
+
+
+
+ This value indicates that no properties should be reformatted. This value must be used alone.
+
+
+
+
+
+
+
+
+
+
+
+
+ This value indicates that all information in the coord attribute can be modified.
+
+
+
+
+ This value indicates that the x information in the coord attribute can be modified.
+
+
+
+
+ This value indicates that the y information in the coord attribute can be modified.
+
+
+
+
+ This value indicates that the cx information in the coord attribute can be modified.
+
+
+
+
+ This value indicates that the cy information in the coord attribute can be modified.
+
+
+
+
+ This value indicates that all the information in the font attribute can be modified.
+
+
+
+
+ This value indicates that the name information in the font attribute can be modified.
+
+
+
+
+ This value indicates that the size information in the font attribute can be modified.
+
+
+
+
+ This value indicates that the weight information in the font attribute can be modified.
+
+
+
+
+ This value indicates that the information in the css-style attribute can be modified.
+
+
+
+
+ This value indicates that the information in the style attribute can be modified.
+
+
+
+
+ This value indicates that the information in the exstyle attribute can be modified.
+
+
+
+
+
+
+
+
+
+
+
+
+ Indicates that the context is informational in nature, specifying for example, how a term should be translated. Thus, should be displayed to anyone editing the XLIFF document.
+
+
+
+
+ Indicates that the context-group is used to specify where the term was found in the translatable source. Thus, it is not displayed.
+
+
+
+
+ Indicates that the context information should be used during translation memory lookups. Thus, it is not displayed.
+
+
+
+
+
+
+
+
+ Represents a translation proposal from a translation memory or other resource.
+
+
+
+
+ Represents a previous version of the target element.
+
+
+
+
+ Represents a rejected version of the target element.
+
+
+
+
+ Represents a translation to be used for reference purposes only, for example from a related product or a different language.
+
+
+
+
+ Represents a proposed translation that was used for the translation of the trans-unit, possibly modified.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Values for the attribute 'coord'.
+
+
+
+
+
+
+
+ Version values: 1.0 and 1.1 are allowed for backward compatibility.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/Resources/schemas/xliff-core-2.0.xsd b/classes/Utilities/Misc/Symfony/Component/Translation/Resources/schemas/xliff-core-2.0.xsd
new file mode 100755
index 00000000..963232f9
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/Resources/schemas/xliff-core-2.0.xsd
@@ -0,0 +1,411 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/Resources/schemas/xml.xsd b/classes/Utilities/Misc/Symfony/Component/Translation/Resources/schemas/xml.xsd
new file mode 100755
index 00000000..a46162a7
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/Resources/schemas/xml.xsd
@@ -0,0 +1,309 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
lang (as an attribute name)
+
+
+ denotes an attribute whose value
+ is a language code for the natural language of the content of
+ any element; its value is inherited. This name is reserved
+ by virtue of its definition in the XML specification.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
space (as an attribute name)
+
+ denotes an attribute whose
+ value is a keyword indicating what whitespace processing
+ discipline is intended for the content of the element; its
+ value is inherited. This name is reserved by virtue of its
+ definition in the XML specification.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
base (as an attribute name)
+
+ denotes an attribute whose value
+ provides a URI to be used as the base for interpreting any
+ relative URIs in the scope of the element on which it
+ appears; its value is inherited. This name is reserved
+ by virtue of its definition in the XML Base specification.
+
+
+ See http://www.w3.org/TR/xmlbase/
+ for information about this attribute.
+
+
+
+
+
+
+
+
+
+
+
+
+
id (as an attribute name)
+
+
+ denotes an attribute whose value
+ should be interpreted as if declared to be of type ID.
+ This name is reserved by virtue of its definition in the
+ xml:id specification.
+
+
+ See http://www.w3.org/TR/xml-id/
+ for information about this attribute.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Father (in any context at all)
+
+
+
+ denotes Jon Bosak, the chair of
+ the original XML Working Group. This name is reserved by
+ the following decision of the W3C XML Plenary and
+ XML Coordination groups:
+
+
+
+
+ In appreciation for his vision, leadership and
+ dedication the W3C XML Plenary on this 10th day of
+ February, 2000, reserves for Jon Bosak in perpetuity
+ the XML name "xml:Father".
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This schema defines attributes and an attribute group suitable
+ for use by schemas wishing to allow xml:base
,
+ xml:lang
, xml:space
or
+ xml:id
attributes on elements they define.
+
+
+
+ To enable this, such a schema must import this schema for
+ the XML namespace, e.g. as follows:
+
+
+ <schema.. .>
+ .. .
+ <import namespace="http://www.w3.org/XML/1998/namespace"
+ schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+
+
+ or
+
+
+
+ <import namespace="http://www.w3.org/XML/1998/namespace"
+ schemaLocation="http://www.w3.org/2009/01/xml.xsd"/>
+
+
+ Subsequently, qualified reference to any of the attributes or the
+ group defined below will have the desired effect, e.g.
+
+
+ <type.. .>
+ .. .
+ <attributeGroup ref="xml:specialAttrs"/>
+
+
+ will define a type which will schema-validate an instance element
+ with any of those attributes.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ In keeping with the XML Schema WG's standard versioning
+ policy, this schema document will persist at
+
+ http://www.w3.org/2009/01/xml.xsd .
+
+
+ At the date of issue it can also be found at
+
+ http://www.w3.org/2001/xml.xsd .
+
+
+
+ The schema document at that URI may however change in the future,
+ in order to remain compatible with the latest version of XML
+ Schema itself, or with the XML namespace itself. In other words,
+ if the XML Schema or XML namespaces change, the version of this
+ document at
+ http://www.w3.org/2001/xml.xsd
+
+ will change accordingly; the version at
+
+ http://www.w3.org/2009/01/xml.xsd
+
+ will not change.
+
+
+
+ Previous dated (and unchanging) versions of this schema
+ document are at:
+
+
+
+
+
+
+
+
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/Translator.php b/classes/Utilities/Misc/Symfony/Component/Translation/Translator.php
new file mode 100755
index 00000000..081c271c
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/Translator.php
@@ -0,0 +1,442 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation;
+
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Config\ConfigCacheFactory;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Config\ConfigCacheFactoryInterface;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Config\ConfigCacheInterface;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidArgumentException;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\LogicException;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\NotFoundResourceException;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\RuntimeException;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Formatter\ChoiceMessageFormatterInterface;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Formatter\IntlFormatterInterface;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Formatter\MessageFormatter;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Formatter\MessageFormatterInterface;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Loader\LoaderInterface;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\TranslatorInterface as LegacyTranslatorInterface;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Contracts\Translation\TranslatorInterface;
+/**
+ * @author Fabien Potencier
+ */
+class Translator implements \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\TranslatorInterface, \ILAB\MediaCloud\Utilities\Misc\Symfony\Contracts\Translation\TranslatorInterface, \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\TranslatorBagInterface
+{
+ /**
+ * @var MessageCatalogueInterface[]
+ */
+ protected $catalogues = [];
+ /**
+ * @var string
+ */
+ private $locale;
+ /**
+ * @var array
+ */
+ private $fallbackLocales = [];
+ /**
+ * @var LoaderInterface[]
+ */
+ private $loaders = [];
+ /**
+ * @var array
+ */
+ private $resources = [];
+ /**
+ * @var MessageFormatterInterface
+ */
+ private $formatter;
+ /**
+ * @var string
+ */
+ private $cacheDir;
+ /**
+ * @var bool
+ */
+ private $debug;
+ private $cacheVary;
+ /**
+ * @var ConfigCacheFactoryInterface|null
+ */
+ private $configCacheFactory;
+ /**
+ * @var array|null
+ */
+ private $parentLocales;
+ private $hasIntlFormatter;
+ /**
+ * @throws InvalidArgumentException If a locale contains invalid characters
+ */
+ public function __construct(?string $locale, \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Formatter\MessageFormatterInterface $formatter = null, string $cacheDir = null, bool $debug = \false, array $cacheVary = [])
+ {
+ if (null === $locale) {
+ @\trigger_error(\sprintf('Passing "null" as the $locale argument to %s() is deprecated since Symfony 4.4.', __METHOD__), \E_USER_DEPRECATED);
+ }
+ $this->setLocale($locale, \false);
+ if (null === $formatter) {
+ $formatter = new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Formatter\MessageFormatter();
+ }
+ $this->formatter = $formatter;
+ $this->cacheDir = $cacheDir;
+ $this->debug = $debug;
+ $this->cacheVary = $cacheVary;
+ $this->hasIntlFormatter = $formatter instanceof \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Formatter\IntlFormatterInterface;
+ }
+ public function setConfigCacheFactory(\ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Config\ConfigCacheFactoryInterface $configCacheFactory)
+ {
+ $this->configCacheFactory = $configCacheFactory;
+ }
+ /**
+ * Adds a Loader.
+ *
+ * @param string $format The name of the loader (@see addResource())
+ */
+ public function addLoader($format, \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Loader\LoaderInterface $loader)
+ {
+ $this->loaders[$format] = $loader;
+ }
+ /**
+ * Adds a Resource.
+ *
+ * @param string $format The name of the loader (@see addLoader())
+ * @param mixed $resource The resource name
+ * @param string $locale The locale
+ * @param string $domain The domain
+ *
+ * @throws InvalidArgumentException If the locale contains invalid characters
+ */
+ public function addResource($format, $resource, $locale, $domain = null)
+ {
+ if (null === $domain) {
+ $domain = 'messages';
+ }
+ if (null === $locale) {
+ @\trigger_error(\sprintf('Passing "null" to the third argument of the "%s" method has been deprecated since Symfony 4.4 and will throw an error in 5.0.', __METHOD__), \E_USER_DEPRECATED);
+ }
+ $this->assertValidLocale($locale);
+ $this->resources[$locale][] = [$format, $resource, $domain];
+ if (\in_array($locale, $this->fallbackLocales)) {
+ $this->catalogues = [];
+ } else {
+ unset($this->catalogues[$locale]);
+ }
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function setLocale($locale)
+ {
+ if (null === $locale && (2 > \func_num_args() || \func_get_arg(1))) {
+ @\trigger_error(\sprintf('Passing "null" as the $locale argument to %s() is deprecated since Symfony 4.4.', __METHOD__), \E_USER_DEPRECATED);
+ }
+ $this->assertValidLocale($locale);
+ $this->locale = $locale;
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function getLocale()
+ {
+ return $this->locale;
+ }
+ /**
+ * Sets the fallback locales.
+ *
+ * @param array $locales The fallback locales
+ *
+ * @throws InvalidArgumentException If a locale contains invalid characters
+ */
+ public function setFallbackLocales(array $locales)
+ {
+ // needed as the fallback locales are linked to the already loaded catalogues
+ $this->catalogues = [];
+ foreach ($locales as $locale) {
+ if (null === $locale) {
+ @\trigger_error(\sprintf('Passing "null" as the $locale argument to %s() is deprecated since Symfony 4.4.', __METHOD__), \E_USER_DEPRECATED);
+ }
+ $this->assertValidLocale($locale);
+ }
+ $this->fallbackLocales = $this->cacheVary['fallback_locales'] = $locales;
+ }
+ /**
+ * Gets the fallback locales.
+ *
+ * @internal since Symfony 4.2
+ *
+ * @return array The fallback locales
+ */
+ public function getFallbackLocales()
+ {
+ return $this->fallbackLocales;
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function trans($id, array $parameters = [], $domain = null, $locale = null)
+ {
+ if ('' === ($id = (string) $id)) {
+ return '';
+ }
+ if (null === $domain) {
+ $domain = 'messages';
+ }
+ $catalogue = $this->getCatalogue($locale);
+ $locale = $catalogue->getLocale();
+ while (!$catalogue->defines($id, $domain)) {
+ if ($cat = $catalogue->getFallbackCatalogue()) {
+ $catalogue = $cat;
+ $locale = $catalogue->getLocale();
+ } else {
+ break;
+ }
+ }
+ if ($this->hasIntlFormatter && $catalogue->defines($id, $domain . \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogue::INTL_DOMAIN_SUFFIX)) {
+ return $this->formatter->formatIntl($catalogue->get($id, $domain), $locale, $parameters);
+ }
+ return $this->formatter->format($catalogue->get($id, $domain), $locale, $parameters);
+ }
+ /**
+ * {@inheritdoc}
+ *
+ * @deprecated since Symfony 4.2, use the trans() method instead with a %count% parameter
+ */
+ public function transChoice($id, $number, array $parameters = [], $domain = null, $locale = null)
+ {
+ @\trigger_error(\sprintf('The "%s()" method is deprecated since Symfony 4.2, use the trans() one instead with a "%%count%%" parameter.', __METHOD__), \E_USER_DEPRECATED);
+ if ('' === ($id = (string) $id)) {
+ return '';
+ }
+ if (!$this->formatter instanceof \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Formatter\ChoiceMessageFormatterInterface) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\LogicException(\sprintf('The formatter "%s" does not support plural translations.', \get_class($this->formatter)));
+ }
+ if (null === $domain) {
+ $domain = 'messages';
+ }
+ $catalogue = $this->getCatalogue($locale);
+ $locale = $catalogue->getLocale();
+ while (!$catalogue->defines($id, $domain)) {
+ if ($cat = $catalogue->getFallbackCatalogue()) {
+ $catalogue = $cat;
+ $locale = $catalogue->getLocale();
+ } else {
+ break;
+ }
+ }
+ if ($this->hasIntlFormatter && $catalogue->defines($id, $domain . \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogue::INTL_DOMAIN_SUFFIX)) {
+ return $this->formatter->formatIntl($catalogue->get($id, $domain), $locale, ['%count%' => $number] + $parameters);
+ }
+ return $this->formatter->choiceFormat($catalogue->get($id, $domain), $number, $locale, $parameters);
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function getCatalogue($locale = null)
+ {
+ if (null === $locale) {
+ $locale = $this->getLocale();
+ } else {
+ $this->assertValidLocale($locale);
+ }
+ if (!isset($this->catalogues[$locale])) {
+ $this->loadCatalogue($locale);
+ }
+ return $this->catalogues[$locale];
+ }
+ /**
+ * Gets the loaders.
+ *
+ * @return array LoaderInterface[]
+ */
+ protected function getLoaders()
+ {
+ return $this->loaders;
+ }
+ /**
+ * @param string $locale
+ */
+ protected function loadCatalogue($locale)
+ {
+ if (null === $this->cacheDir) {
+ $this->initializeCatalogue($locale);
+ } else {
+ $this->initializeCacheCatalogue($locale);
+ }
+ }
+ /**
+ * @param string $locale
+ */
+ protected function initializeCatalogue($locale)
+ {
+ $this->assertValidLocale($locale);
+ try {
+ $this->doLoadCatalogue($locale);
+ } catch (\ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\NotFoundResourceException $e) {
+ if (!$this->computeFallbackLocales($locale)) {
+ throw $e;
+ }
+ }
+ $this->loadFallbackCatalogues($locale);
+ }
+ private function initializeCacheCatalogue(string $locale) : void
+ {
+ if (isset($this->catalogues[$locale])) {
+ /* Catalogue already initialized. */
+ return;
+ }
+ $this->assertValidLocale($locale);
+ $cache = $this->getConfigCacheFactory()->cache($this->getCatalogueCachePath($locale), function (\ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Config\ConfigCacheInterface $cache) use($locale) {
+ $this->dumpCatalogue($locale, $cache);
+ });
+ if (isset($this->catalogues[$locale])) {
+ /* Catalogue has been initialized as it was written out to cache. */
+ return;
+ }
+ /* Read catalogue from cache. */
+ $this->catalogues[$locale] = (include $cache->getPath());
+ }
+ private function dumpCatalogue(string $locale, \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Config\ConfigCacheInterface $cache) : void
+ {
+ $this->initializeCatalogue($locale);
+ $fallbackContent = $this->getFallbackContent($this->catalogues[$locale]);
+ $content = \sprintf(<<getAllMessages($this->catalogues[$locale]), \true), $fallbackContent);
+ $cache->write($content, $this->catalogues[$locale]->getResources());
+ }
+ private function getFallbackContent(\ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogue $catalogue) : string
+ {
+ $fallbackContent = '';
+ $current = '';
+ $replacementPattern = '/[^a-z0-9_]/i';
+ $fallbackCatalogue = $catalogue->getFallbackCatalogue();
+ while ($fallbackCatalogue) {
+ $fallback = $fallbackCatalogue->getLocale();
+ $fallbackSuffix = \ucfirst(\preg_replace($replacementPattern, '_', $fallback));
+ $currentSuffix = \ucfirst(\preg_replace($replacementPattern, '_', $current));
+ $fallbackContent .= \sprintf(<<<'EOF'
+$catalogue%s = new MessageCatalogue('%s', %s);
+$catalogue%s->addFallbackCatalogue($catalogue%s);
+
+EOF
+, $fallbackSuffix, $fallback, \var_export($this->getAllMessages($fallbackCatalogue), \true), $currentSuffix, $fallbackSuffix);
+ $current = $fallbackCatalogue->getLocale();
+ $fallbackCatalogue = $fallbackCatalogue->getFallbackCatalogue();
+ }
+ return $fallbackContent;
+ }
+ private function getCatalogueCachePath(string $locale) : string
+ {
+ return $this->cacheDir . '/catalogue.' . $locale . '.' . \strtr(\substr(\base64_encode(\hash('sha256', \serialize($this->cacheVary), \true)), 0, 7), '/', '_') . '.php';
+ }
+ /**
+ * @internal
+ */
+ protected function doLoadCatalogue(string $locale) : void
+ {
+ $this->catalogues[$locale] = new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogue($locale);
+ if (isset($this->resources[$locale])) {
+ foreach ($this->resources[$locale] as $resource) {
+ if (!isset($this->loaders[$resource[0]])) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\RuntimeException(\sprintf('The "%s" translation loader is not registered.', $resource[0]));
+ }
+ $this->catalogues[$locale]->addCatalogue($this->loaders[$resource[0]]->load($resource[1], $locale, $resource[2]));
+ }
+ }
+ }
+ private function loadFallbackCatalogues(string $locale) : void
+ {
+ $current = $this->catalogues[$locale];
+ foreach ($this->computeFallbackLocales($locale) as $fallback) {
+ if (!isset($this->catalogues[$fallback])) {
+ $this->initializeCatalogue($fallback);
+ }
+ $fallbackCatalogue = new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogue($fallback, $this->getAllMessages($this->catalogues[$fallback]));
+ foreach ($this->catalogues[$fallback]->getResources() as $resource) {
+ $fallbackCatalogue->addResource($resource);
+ }
+ $current->addFallbackCatalogue($fallbackCatalogue);
+ $current = $fallbackCatalogue;
+ }
+ }
+ protected function computeFallbackLocales($locale)
+ {
+ if (null === $this->parentLocales) {
+ $parentLocales = \json_decode(\file_get_contents(__DIR__ . '/Resources/data/parents.json'), \true);
+ }
+ $locales = [];
+ foreach ($this->fallbackLocales as $fallback) {
+ if ($fallback === $locale) {
+ continue;
+ }
+ $locales[] = $fallback;
+ }
+ while ($locale) {
+ $parent = $parentLocales[$locale] ?? null;
+ if (!$parent && \false !== \strrchr($locale, '_')) {
+ $locale = \substr($locale, 0, -\strlen(\strrchr($locale, '_')));
+ } elseif ('root' !== $parent) {
+ $locale = $parent;
+ } else {
+ $locale = null;
+ }
+ if (null !== $locale) {
+ \array_unshift($locales, $locale);
+ }
+ }
+ return \array_unique($locales);
+ }
+ /**
+ * Asserts that the locale is valid, throws an Exception if not.
+ *
+ * @param string $locale Locale to tests
+ *
+ * @throws InvalidArgumentException If the locale contains invalid characters
+ */
+ protected function assertValidLocale($locale)
+ {
+ if (1 !== \preg_match('/^[a-z0-9@_\\.\\-]*$/i', $locale)) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidArgumentException(\sprintf('Invalid "%s" locale.', $locale));
+ }
+ }
+ /**
+ * Provides the ConfigCache factory implementation, falling back to a
+ * default implementation if necessary.
+ */
+ private function getConfigCacheFactory() : \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Config\ConfigCacheFactoryInterface
+ {
+ if (!$this->configCacheFactory) {
+ $this->configCacheFactory = new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Config\ConfigCacheFactory($this->debug);
+ }
+ return $this->configCacheFactory;
+ }
+ private function getAllMessages(\ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogueInterface $catalogue) : array
+ {
+ $allMessages = [];
+ foreach ($catalogue->all() as $domain => $messages) {
+ if ($intlMessages = $catalogue->all($domain . \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogue::INTL_DOMAIN_SUFFIX)) {
+ $allMessages[$domain . \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogue::INTL_DOMAIN_SUFFIX] = $intlMessages;
+ $messages = \array_diff_key($messages, $intlMessages);
+ }
+ if ($messages) {
+ $allMessages[$domain] = $messages;
+ }
+ }
+ return $allMessages;
+ }
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/TranslatorBagInterface.php b/classes/Utilities/Misc/Symfony/Component/Translation/TranslatorBagInterface.php
new file mode 100755
index 00000000..3ae67d82
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/TranslatorBagInterface.php
@@ -0,0 +1,31 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation;
+
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidArgumentException;
+/**
+ * TranslatorBagInterface.
+ *
+ * @author Abdellatif Ait boudad
+ */
+interface TranslatorBagInterface
+{
+ /**
+ * Gets the catalogue by locale.
+ *
+ * @param string|null $locale The locale or null to use the default
+ *
+ * @return MessageCatalogueInterface
+ *
+ * @throws InvalidArgumentException If the locale contains invalid characters
+ */
+ public function getCatalogue($locale = null);
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/TranslatorInterface.php b/classes/Utilities/Misc/Symfony/Component/Translation/TranslatorInterface.php
new file mode 100755
index 00000000..7ed16616
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/TranslatorInterface.php
@@ -0,0 +1,65 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation;
+
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidArgumentException;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Contracts\Translation\LocaleAwareInterface;
+/**
+ * TranslatorInterface.
+ *
+ * @author Fabien Potencier
+ *
+ * @deprecated since Symfony 4.2, use Symfony\Contracts\Translation\TranslatorInterface instead
+ */
+interface TranslatorInterface extends \ILAB\MediaCloud\Utilities\Misc\Symfony\Contracts\Translation\LocaleAwareInterface
+{
+ /**
+ * Translates the given message.
+ *
+ * @param string $id The message id (may also be an object that can be cast to string)
+ * @param array $parameters An array of parameters for the message
+ * @param string|null $domain The domain for the message or null to use the default
+ * @param string|null $locale The locale or null to use the default
+ *
+ * @return string The translated string
+ *
+ * @throws InvalidArgumentException If the locale contains invalid characters
+ */
+ public function trans($id, array $parameters = [], $domain = null, $locale = null);
+ /**
+ * Translates the given choice message by choosing a translation according to a number.
+ *
+ * @param string $id The message id (may also be an object that can be cast to string)
+ * @param int $number The number to use to find the index of the message
+ * @param array $parameters An array of parameters for the message
+ * @param string|null $domain The domain for the message or null to use the default
+ * @param string|null $locale The locale or null to use the default
+ *
+ * @return string The translated string
+ *
+ * @throws InvalidArgumentException If the locale contains invalid characters
+ */
+ public function transChoice($id, $number, array $parameters = [], $domain = null, $locale = null);
+ /**
+ * Sets the current locale.
+ *
+ * @param string $locale The locale
+ *
+ * @throws InvalidArgumentException If the locale contains invalid characters
+ */
+ public function setLocale(string $locale);
+ /**
+ * Returns the current locale.
+ *
+ * @return string The locale
+ */
+ public function getLocale();
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/TranslatorTrait.php b/classes/Utilities/Misc/Symfony/Component/Translation/TranslatorTrait.php
new file mode 100755
index 00000000..79c0e9f0
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/TranslatorTrait.php
@@ -0,0 +1,222 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Contracts\Translation;
+
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidArgumentException;
+/**
+ * A trait to help implement TranslatorInterface and LocaleAwareInterface.
+ *
+ * @author Fabien Potencier
+ */
+trait TranslatorTrait
+{
+ private $locale;
+ /**
+ * {@inheritdoc}
+ */
+ public function setLocale(string $locale)
+ {
+ $this->locale = $locale;
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function getLocale()
+ {
+ return $this->locale ?: \Locale::getDefault();
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function trans(?string $id, array $parameters = [], string $domain = null, string $locale = null) : string
+ {
+ if (null === $id || '' === $id) {
+ return '';
+ }
+ if (!isset($parameters['%count%']) || !\is_numeric($parameters['%count%'])) {
+ return \strtr($id, $parameters);
+ }
+ $number = (float) $parameters['%count%'];
+ $locale = $locale ?: $this->getLocale();
+ $parts = [];
+ if (\preg_match('/^\\|++$/', $id)) {
+ $parts = \explode('|', $id);
+ } elseif (\preg_match_all('/(?:\\|\\||[^\\|])++/', $id, $matches)) {
+ $parts = $matches[0];
+ }
+ $intervalRegexp = <<<'EOF'
+/^(?P
+ ({\s*
+ (\-?\d+(\.\d+)?[\s*,\s*\-?\d+(\.\d+)?]*)
+ \s*})
+
+ |
+
+ (?P[\[\]])
+ \s*
+ (?P-Inf|\-?\d+(\.\d+)?)
+ \s*,\s*
+ (?P\+?Inf|\-?\d+(\.\d+)?)
+ \s*
+ (?P[\[\]])
+)\s*(?P.*?)$/xs
+EOF;
+ $standardRules = [];
+ foreach ($parts as $part) {
+ $part = \trim(\str_replace('||', '|', $part));
+ // try to match an explicit rule, then fallback to the standard ones
+ if (\preg_match($intervalRegexp, $part, $matches)) {
+ if ($matches[2]) {
+ foreach (\explode(',', $matches[3]) as $n) {
+ if ($number == $n) {
+ return \strtr($matches['message'], $parameters);
+ }
+ }
+ } else {
+ $leftNumber = '-Inf' === $matches['left'] ? -\INF : (float) $matches['left'];
+ $rightNumber = \is_numeric($matches['right']) ? (float) $matches['right'] : \INF;
+ if (('[' === $matches['left_delimiter'] ? $number >= $leftNumber : $number > $leftNumber) && (']' === $matches['right_delimiter'] ? $number <= $rightNumber : $number < $rightNumber)) {
+ return \strtr($matches['message'], $parameters);
+ }
+ }
+ } elseif (\preg_match('/^\\w+\\:\\s*(.*?)$/', $part, $matches)) {
+ $standardRules[] = $matches[1];
+ } else {
+ $standardRules[] = $part;
+ }
+ }
+ $position = $this->getPluralizationRule($number, $locale);
+ if (!isset($standardRules[$position])) {
+ // when there's exactly one rule given, and that rule is a standard
+ // rule, use this rule
+ if (1 === \count($parts) && isset($standardRules[0])) {
+ return \strtr($standardRules[0], $parameters);
+ }
+ $message = \sprintf('Unable to choose a translation for "%s" with locale "%s" for value "%d". Double check that this translation has the correct plural options (e.g. "There is one apple|There are %%count%% apples").', $id, $locale, $number);
+ if (\class_exists(\ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidArgumentException::class)) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidArgumentException($message);
+ }
+ throw new \InvalidArgumentException($message);
+ }
+ return \strtr($standardRules[$position], $parameters);
+ }
+ /**
+ * Returns the plural position to use for the given locale and number.
+ *
+ * The plural rules are derived from code of the Zend Framework (2010-09-25),
+ * which is subject to the new BSD license (http://framework.zend.com/license/new-bsd).
+ * Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
+ */
+ private function getPluralizationRule(int $number, string $locale) : int
+ {
+ switch ('pt_BR' !== $locale && \strlen($locale) > 3 ? \substr($locale, 0, \strrpos($locale, '_')) : $locale) {
+ case 'af':
+ case 'bn':
+ case 'bg':
+ case 'ca':
+ case 'da':
+ case 'de':
+ case 'el':
+ case 'en':
+ case 'eo':
+ case 'es':
+ case 'et':
+ case 'eu':
+ case 'fa':
+ case 'fi':
+ case 'fo':
+ case 'fur':
+ case 'fy':
+ case 'gl':
+ case 'gu':
+ case 'ha':
+ case 'he':
+ case 'hu':
+ case 'is':
+ case 'it':
+ case 'ku':
+ case 'lb':
+ case 'ml':
+ case 'mn':
+ case 'mr':
+ case 'nah':
+ case 'nb':
+ case 'ne':
+ case 'nl':
+ case 'nn':
+ case 'no':
+ case 'oc':
+ case 'om':
+ case 'or':
+ case 'pa':
+ case 'pap':
+ case 'ps':
+ case 'pt':
+ case 'so':
+ case 'sq':
+ case 'sv':
+ case 'sw':
+ case 'ta':
+ case 'te':
+ case 'tk':
+ case 'ur':
+ case 'zu':
+ return 1 == $number ? 0 : 1;
+ case 'am':
+ case 'bh':
+ case 'fil':
+ case 'fr':
+ case 'gun':
+ case 'hi':
+ case 'hy':
+ case 'ln':
+ case 'mg':
+ case 'nso':
+ case 'pt_BR':
+ case 'ti':
+ case 'wa':
+ return 0 == $number || 1 == $number ? 0 : 1;
+ case 'be':
+ case 'bs':
+ case 'hr':
+ case 'ru':
+ case 'sh':
+ case 'sr':
+ case 'uk':
+ return 1 == $number % 10 && 11 != $number % 100 ? 0 : ($number % 10 >= 2 && $number % 10 <= 4 && ($number % 100 < 10 || $number % 100 >= 20) ? 1 : 2);
+ case 'cs':
+ case 'sk':
+ return 1 == $number ? 0 : ($number >= 2 && $number <= 4 ? 1 : 2);
+ case 'ga':
+ return 1 == $number ? 0 : (2 == $number ? 1 : 2);
+ case 'lt':
+ return 1 == $number % 10 && 11 != $number % 100 ? 0 : ($number % 10 >= 2 && ($number % 100 < 10 || $number % 100 >= 20) ? 1 : 2);
+ case 'sl':
+ return 1 == $number % 100 ? 0 : (2 == $number % 100 ? 1 : (3 == $number % 100 || 4 == $number % 100 ? 2 : 3));
+ case 'mk':
+ return 1 == $number % 10 ? 0 : 1;
+ case 'mt':
+ return 1 == $number ? 0 : (0 == $number || $number % 100 > 1 && $number % 100 < 11 ? 1 : ($number % 100 > 10 && $number % 100 < 20 ? 2 : 3));
+ case 'lv':
+ return 0 == $number ? 0 : (1 == $number % 10 && 11 != $number % 100 ? 1 : 2);
+ case 'pl':
+ return 1 == $number ? 0 : ($number % 10 >= 2 && $number % 10 <= 4 && ($number % 100 < 12 || $number % 100 > 14) ? 1 : 2);
+ case 'cy':
+ return 1 == $number ? 0 : (2 == $number ? 1 : (8 == $number || 11 == $number ? 2 : 3));
+ case 'ro':
+ return 1 == $number ? 0 : (0 == $number || $number % 100 > 0 && $number % 100 < 20 ? 1 : 2);
+ case 'ar':
+ return 0 == $number ? 0 : (1 == $number ? 1 : (2 == $number ? 2 : ($number % 100 >= 3 && $number % 100 <= 10 ? 3 : ($number % 100 >= 11 && $number % 100 <= 99 ? 4 : 5))));
+ default:
+ return 0;
+ }
+ }
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/Util/ArrayConverter.php b/classes/Utilities/Misc/Symfony/Component/Translation/Util/ArrayConverter.php
new file mode 100755
index 00000000..1a8638ec
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/Util/ArrayConverter.php
@@ -0,0 +1,88 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Util;
+
+/**
+ * ArrayConverter generates tree like structure from a message catalogue.
+ * e.g. this
+ * 'foo.bar1' => 'test1',
+ * 'foo.bar2' => 'test2'
+ * converts to follows:
+ * foo:
+ * bar1: test1
+ * bar2: test2.
+ *
+ * @author Gennady Telegin
+ */
+class ArrayConverter
+{
+ /**
+ * Converts linear messages array to tree-like array.
+ * For example this array('foo.bar' => 'value') will be converted to ['foo' => ['bar' => 'value']].
+ *
+ * @param array $messages Linear messages array
+ *
+ * @return array Tree-like messages array
+ */
+ public static function expandToTree(array $messages)
+ {
+ $tree = [];
+ foreach ($messages as $id => $value) {
+ $referenceToElement =& self::getElementByPath($tree, \explode('.', $id));
+ $referenceToElement = $value;
+ unset($referenceToElement);
+ }
+ return $tree;
+ }
+ private static function &getElementByPath(array &$tree, array $parts)
+ {
+ $elem =& $tree;
+ $parentOfElem = null;
+ foreach ($parts as $i => $part) {
+ if (isset($elem[$part]) && \is_string($elem[$part])) {
+ /* Process next case:
+ * 'foo': 'test1',
+ * 'foo.bar': 'test2'
+ *
+ * $tree['foo'] was string before we found array {bar: test2}.
+ * Treat new element as string too, e.g. add $tree['foo.bar'] = 'test2';
+ */
+ $elem =& $elem[\implode('.', \array_slice($parts, $i))];
+ break;
+ }
+ $parentOfElem =& $elem;
+ $elem =& $elem[$part];
+ }
+ if ($elem && \is_array($elem) && $parentOfElem) {
+ /* Process next case:
+ * 'foo.bar': 'test1'
+ * 'foo': 'test2'
+ *
+ * $tree['foo'] was array = {bar: 'test1'} before we found string constant `foo`.
+ * Cancel treating $tree['foo'] as array and cancel back it expansion,
+ * e.g. make it $tree['foo.bar'] = 'test1' again.
+ */
+ self::cancelExpand($parentOfElem, $part, $elem);
+ }
+ return $elem;
+ }
+ private static function cancelExpand(array &$tree, $prefix, array $node)
+ {
+ $prefix .= '.';
+ foreach ($node as $id => $value) {
+ if (\is_string($value)) {
+ $tree[$prefix . $id] = $value;
+ } else {
+ self::cancelExpand($tree, $prefix . $id, $value);
+ }
+ }
+ }
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/Util/XliffUtils.php b/classes/Utilities/Misc/Symfony/Component/Translation/Util/XliffUtils.php
new file mode 100755
index 00000000..ac3ae4d6
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/Util/XliffUtils.php
@@ -0,0 +1,126 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Util;
+
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidArgumentException;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidResourceException;
+/**
+ * Provides some utility methods for XLIFF translation files, such as validating
+ * their contents according to the XSD schema.
+ *
+ * @author Fabien Potencier
+ */
+class XliffUtils
+{
+ /**
+ * Gets xliff file version based on the root "version" attribute.
+ *
+ * Defaults to 1.2 for backwards compatibility.
+ *
+ * @throws InvalidArgumentException
+ */
+ public static function getVersionNumber(\DOMDocument $dom) : string
+ {
+ /** @var \DOMNode $xliff */
+ foreach ($dom->getElementsByTagName('xliff') as $xliff) {
+ $version = $xliff->attributes->getNamedItem('version');
+ if ($version) {
+ return $version->nodeValue;
+ }
+ $namespace = $xliff->attributes->getNamedItem('xmlns');
+ if ($namespace) {
+ if (0 !== \substr_compare('urn:oasis:names:tc:xliff:document:', $namespace->nodeValue, 0, 34)) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidArgumentException(\sprintf('Not a valid XLIFF namespace "%s"', $namespace));
+ }
+ return \substr($namespace, 34);
+ }
+ }
+ // Falls back to v1.2
+ return '1.2';
+ }
+ /**
+ * Validates and parses the given file into a DOMDocument.
+ *
+ * @throws InvalidResourceException
+ */
+ public static function validateSchema(\DOMDocument $dom) : array
+ {
+ $xliffVersion = static::getVersionNumber($dom);
+ $internalErrors = \libxml_use_internal_errors(\true);
+ $disableEntities = \libxml_disable_entity_loader(\false);
+ $isValid = @$dom->schemaValidateSource(self::getSchema($xliffVersion));
+ if (!$isValid) {
+ \libxml_disable_entity_loader($disableEntities);
+ return self::getXmlErrors($internalErrors);
+ }
+ \libxml_disable_entity_loader($disableEntities);
+ $dom->normalizeDocument();
+ \libxml_clear_errors();
+ \libxml_use_internal_errors($internalErrors);
+ return [];
+ }
+ public static function getErrorsAsString(array $xmlErrors) : string
+ {
+ $errorsAsString = '';
+ foreach ($xmlErrors as $error) {
+ $errorsAsString .= \sprintf("[%s %s] %s (in %s - line %d, column %d)\n", \LIBXML_ERR_WARNING === $error['level'] ? 'WARNING' : 'ERROR', $error['code'], $error['message'], $error['file'], $error['line'], $error['column']);
+ }
+ return $errorsAsString;
+ }
+ private static function getSchema(string $xliffVersion) : string
+ {
+ if ('1.2' === $xliffVersion) {
+ $schemaSource = \file_get_contents(__DIR__ . '/../Resources/schemas/xliff-core-1.2-strict.xsd');
+ $xmlUri = 'http://www.w3.org/2001/xml.xsd';
+ } elseif ('2.0' === $xliffVersion) {
+ $schemaSource = \file_get_contents(__DIR__ . '/../Resources/schemas/xliff-core-2.0.xsd');
+ $xmlUri = 'informativeCopiesOf3rdPartySchemas/w3c/xml.xsd';
+ } else {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidArgumentException(\sprintf('No support implemented for loading XLIFF version "%s".', $xliffVersion));
+ }
+ return self::fixXmlLocation($schemaSource, $xmlUri);
+ }
+ /**
+ * Internally changes the URI of a dependent xsd to be loaded locally.
+ */
+ private static function fixXmlLocation(string $schemaSource, string $xmlUri) : string
+ {
+ $newPath = \str_replace('\\', '/', __DIR__) . '/../Resources/schemas/xml.xsd';
+ $parts = \explode('/', $newPath);
+ $locationstart = 'file:///';
+ if (0 === \stripos($newPath, 'phar://')) {
+ $tmpfile = \tempnam(\sys_get_temp_dir(), 'symfony');
+ if ($tmpfile) {
+ \copy($newPath, $tmpfile);
+ $parts = \explode('/', \str_replace('\\', '/', $tmpfile));
+ } else {
+ \array_shift($parts);
+ $locationstart = 'phar:///';
+ }
+ }
+ $drive = '\\' === \DIRECTORY_SEPARATOR ? \array_shift($parts) . '/' : '';
+ $newPath = $locationstart . $drive . \implode('/', \array_map('rawurlencode', $parts));
+ return \str_replace($xmlUri, $newPath, $schemaSource);
+ }
+ /**
+ * Returns the XML errors of the internal XML parser.
+ */
+ private static function getXmlErrors(bool $internalErrors) : array
+ {
+ $errors = [];
+ foreach (\libxml_get_errors() as $error) {
+ $errors[] = ['level' => \LIBXML_ERR_WARNING == $error->level ? 'WARNING' : 'ERROR', 'code' => $error->code, 'message' => \trim($error->message), 'file' => $error->file ?: 'n/a', 'line' => $error->line, 'column' => $error->column];
+ }
+ \libxml_clear_errors();
+ \libxml_use_internal_errors($internalErrors);
+ return $errors;
+ }
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/Writer/TranslationWriter.php b/classes/Utilities/Misc/Symfony/Component/Translation/Writer/TranslationWriter.php
new file mode 100755
index 00000000..8fbccafe
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/Writer/TranslationWriter.php
@@ -0,0 +1,78 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Writer;
+
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Dumper\DumperInterface;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidArgumentException;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\RuntimeException;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogue;
+/**
+ * TranslationWriter writes translation messages.
+ *
+ * @author Michel Salib
+ */
+class TranslationWriter implements \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Writer\TranslationWriterInterface
+{
+ private $dumpers = [];
+ /**
+ * Adds a dumper to the writer.
+ *
+ * @param string $format The format of the dumper
+ */
+ public function addDumper($format, \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Dumper\DumperInterface $dumper)
+ {
+ $this->dumpers[$format] = $dumper;
+ }
+ /**
+ * Disables dumper backup.
+ *
+ * @deprecated since Symfony 4.1
+ */
+ public function disableBackup()
+ {
+ @\trigger_error(\sprintf('The "%s()" method is deprecated since Symfony 4.1.', __METHOD__), \E_USER_DEPRECATED);
+ foreach ($this->dumpers as $dumper) {
+ if (\method_exists($dumper, 'setBackup')) {
+ $dumper->setBackup(\false);
+ }
+ }
+ }
+ /**
+ * Obtains the list of supported formats.
+ *
+ * @return array
+ */
+ public function getFormats()
+ {
+ return \array_keys($this->dumpers);
+ }
+ /**
+ * Writes translation from the catalogue according to the selected format.
+ *
+ * @param string $format The format to use to dump the messages
+ * @param array $options Options that are passed to the dumper
+ *
+ * @throws InvalidArgumentException
+ */
+ public function write(\ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogue $catalogue, $format, $options = [])
+ {
+ if (!isset($this->dumpers[$format])) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidArgumentException(\sprintf('There is no dumper associated with format "%s".', $format));
+ }
+ // get the right dumper
+ $dumper = $this->dumpers[$format];
+ if (isset($options['path']) && !\is_dir($options['path']) && !@\mkdir($options['path'], 0777, \true) && !\is_dir($options['path'])) {
+ throw new \ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\RuntimeException(\sprintf('Translation Writer was not able to create directory "%s"', $options['path']));
+ }
+ // save
+ $dumper->dump($catalogue, $options);
+ }
+}
diff --git a/classes/Utilities/Misc/Symfony/Component/Translation/Writer/TranslationWriterInterface.php b/classes/Utilities/Misc/Symfony/Component/Translation/Writer/TranslationWriterInterface.php
new file mode 100755
index 00000000..ed31b032
--- /dev/null
+++ b/classes/Utilities/Misc/Symfony/Component/Translation/Writer/TranslationWriterInterface.php
@@ -0,0 +1,31 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Writer;
+
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\Exception\InvalidArgumentException;
+use ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogue;
+/**
+ * TranslationWriter writes translation messages.
+ *
+ * @author Michel Salib
+ */
+interface TranslationWriterInterface
+{
+ /**
+ * Writes translation from the catalogue according to the selected format.
+ *
+ * @param string $format The format to use to dump the messages
+ * @param array $options Options that are passed to the dumper
+ *
+ * @throws InvalidArgumentException
+ */
+ public function write(\ILAB\MediaCloud\Utilities\Misc\Symfony\Component\Translation\MessageCatalogue $catalogue, $format, $options = []);
+}
diff --git a/composer.json b/composer.json
index 23f8e1a5..3c105adf 100755
--- a/composer.json
+++ b/composer.json
@@ -27,12 +27,11 @@
"duncan3dc/blade": ">3.3",
"superbalist/flysystem-google-storage": "^7.1",
"google/cloud-vision": "^0.19.0",
- "nesbot/carbon": "^1.21",
"ilab/b2-sdk-php": "^1.4",
"psr/http-message-implementation": "*",
"mikey179/vfsstream": "*",
- "ivopetkov/html5-dom-document-php": "^2.0",
"ralouphie/mimey": "^2.1",
+ "ivopetkov/html5-dom-document-php": "^2.0",
"zumba/amplitude-php": "^1.0"
},
"autoload": {
diff --git a/ilab-media-tools.php b/ilab-media-tools.php
index f18ac888..09d83a54 100755
--- a/ilab-media-tools.php
+++ b/ilab-media-tools.php
@@ -5,7 +5,7 @@
Plugin URI: https://github.com/interfacelab/ilab-media-tools
Description: Automatically upload media to Amazon S3 and integrate with Imgix, a real-time image processing CDN. Boosts site performance and simplifies workflows.
Author: interfacelab
-Version: 3.3.7
+Version: 3.3.8
Author URI: http://interfacelab.io
*/
// Copyright (c) 2016 Interfacelab LLC. All rights reserved.
@@ -93,7 +93,7 @@
}
// Version Defines
-define( 'MEDIA_CLOUD_VERSION', '3.3.6' );
+define( 'MEDIA_CLOUD_VERSION', '3.3.8' );
define( 'MEDIA_CLOUD_INFO_VERSION', '1.0.0' );
// Directory defines
define( 'ILAB_TOOLS_DIR', dirname( __FILE__ ) );
diff --git a/public/css/ilab-media-cloud.css b/public/css/ilab-media-cloud.css
index dd319650..2e938308 100755
--- a/public/css/ilab-media-cloud.css
+++ b/public/css/ilab-media-cloud.css
@@ -8,4 +8,4 @@
* Date: 2018-04-01T06:26:32.417Z
*/.cropper-container{direction:ltr;font-size:0;line-height:0;position:relative;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.cropper-container img{display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}.cropper-canvas,.cropper-crop-box,.cropper-drag-box,.cropper-modal,.cropper-wrap-box{bottom:0;left:0;position:absolute;right:0;top:0}.cropper-canvas,.cropper-wrap-box{overflow:hidden}.cropper-drag-box{background-color:#fff;opacity:0}.cropper-modal{background-color:#000;opacity:.5}.cropper-view-box{display:block;height:100%;outline-color:rgba(51,153,255,.75);outline:1px solid #39f;overflow:hidden;width:100%}.cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}.cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:33.33333%;left:0;top:33.33333%;width:100%}.cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:33.33333%;top:0;width:33.33333%}.cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}.cropper-center:after,.cropper-center:before{background-color:#eee;content:" ";display:block;position:absolute}.cropper-center:before{height:1px;left:-3px;top:0;width:7px}.cropper-center:after{height:7px;left:0;top:-3px;width:1px}.cropper-face,.cropper-line,.cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}.cropper-face{background-color:#fff;left:0;top:0}.cropper-line{background-color:#39f}.cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}.cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}.cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}.cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}.cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}.cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}.cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}.cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}.cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}.cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}.cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}.cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}.cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}@media (min-width:768px){.cropper-point.point-se{height:15px;width:15px}}@media (min-width:992px){.cropper-point.point-se{height:10px;width:10px}}@media (min-width:1200px){.cropper-point.point-se{height:5px;opacity:.75;width:5px}}.cropper-point.point-se:before{background-color:#39f;bottom:-50%;content:" ";display:block;height:200%;opacity:0;position:absolute;right:-50%;width:200%}.cropper-invisible{opacity:0}.cropper-bg{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC")}.cropper-hide{display:block;height:0;position:absolute;width:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed}.ilab-admin-separator-container{display:flex;height:12px;align-items:center;margin:0 -10px 0 0}.ilab-admin-separator-container .ilab-admin-separator-title{font-size:.68em;text-transform:uppercase;font-weight:700;margin-right:10px;color:hsla(0,0%,100%,.25)}.ilab-admin-separator-container .ilab-admin-separator{display:block;flex:1;padding:0;height:1px;line-height:1px;background:hsla(0,0%,100%,.125)}#wpadminbar #wp-admin-bar-media-cloud-admin-bar>.ab-item>.ab-icon:before{content:"\F176";top:3px}.ilabm-backdrop{position:fixed;display:block;background-color:rgba(0,0,0,.66)}.ilabm-backdrop,.ilabm-container{left:0;top:0;right:0;bottom:0;z-index:160000!important}.ilabm-container{background-color:#fcfcfc;position:absolute;border-radius:0;display:flex;flex-direction:column}.ilabm-titlebar{border-bottom:1px solid #ddd;min-height:50px;max-height:50px;box-shadow:0 0 4px rgba(0,0,0,.15);display:flex;align-items:center}.ilabm-titlebar h1{flex:1;padding:0 16px;font-size:22px;line-height:50px;margin:0 50px 0 0;display:flex;align-items:center;justify-content:space-between}.ilabm-titlebar .modal-actions{display:flex}.ilabm-titlebar .modal-actions a{margin-left:8px;display:flex;align-items:center}.ilabm-titlebar .modal-actions a svg{height:12px;width:auto;margin-right:4px}.ilabm-titlebar .modal-actions a svg>path,.ilabm-titlebar .modal-actions a svg>rect{fill:#000}.ilabm-titlebar .modal-actions div.spacer{width:8px;min-width:8px}.ilabm-titlebar>a{display:block;max-width:50px;min-width:50px;border-left:1px solid #ddd}.ilabm-window-area{flex:2 100%;display:flex;flex-direction:row}.ilabm-window-area-content{background-color:#fff;flex:2 100%;display:flex;flex-direction:column}.ilabm-editor-container{flex:2 100%;position:relative}.ilabm-editor-area{position:absolute;left:0;top:0;right:0;bottom:0;background-image:url(../img/ilab-imgix-edit-bg.png);display:block;margin:10px}.ilabm-sidebar{min-width:380px;max-width:380px;background-color:#f3f3f3;display:flex;flex-direction:column;border-left:3px solid #ddd}.ilabm-sidebar-content{position:relative;display:flex;flex:2 100%}.ilabm-sidebar-tabs{background:#ddd;display:flex;min-height:36px;max-height:36px}.ilabm-sidebar-tabs .ilabm-sidebar-tab{min-width:40px;white-space:nowrap;text-align:center;margin-top:3px;background-color:#ccc;line-height:30px;padding:0 15px;margin-right:3px;font-size:11px;text-transform:uppercase;color:#888;font-weight:700;cursor:pointer!important}.ilabm-sidebar-tabs .active-tab{background-color:#f3f3f3;color:#777}.ilabm-sidebar-actions{display:flex;justify-content:flex-end;background-color:#fff;border-top:1px solid #eee;padding:11px}.ilabm-sidebar-actions a{display:block;margin-left:10px!important}a.button-reset{background:#a00!important;border-color:#700!important;color:#fff!important;box-shadow:inset 0 1px 0 #d00,0 1px 0 rgba(0,0,0,.15)!important;text-shadow:none!important}.ilabm-editor-tabs{background:#ddd;overflow:hidden;min-height:36px}.ilabm-editor-tabs,.ilabm-editor-tabs .ilabm-tabs-select-ui{display:flex;flex-direction:row}.ilabm-editor-tabs .ilabm-tabs-select-ui .ilabm-tabs-select-label{margin-top:3px;line-height:32px;padding:0 5px 0 15px;margin-right:3px;font-size:11px;text-transform:uppercase;color:#888;font-weight:700;cursor:pointer!important}.ilabm-editor-tabs .ilabm-tabs-select-ui .ilabm-tabs-select{margin-top:4px;line-height:32px;font-size:11px}.ilabm-editor-tabs .ilabm-tabs-ui{display:flex;flex-direction:row}.ilabm-editor-tabs .ilabm-tabs-ui .ilabm-editor-tab{white-space:nowrap;min-width:50px;text-align:center;min-height:32px;max-height:33px;margin-top:3px;background-color:#ccc;line-height:31px;padding:0 15px;margin-right:3px;font-size:11px;text-transform:uppercase;color:#888;font-weight:700;cursor:pointer!important}.ilabm-editor-tabs .ilabm-tabs-ui .active-tab{background:#fff;margin-top:2px;border-right:1px solid #ddd;border-left:1px solid #ddd;border-top:1px solid #ddd}.ilabm-status-container{display:flex;flex:1;justify-content:flex-start}.ilabm-status-container .is-hidden{display:none}.ilabm-status-container .spinner{margin:0 8px 0 0}.ilabm-status-label{font-size:13px}.ilabm-preview-wait-modal{position:absolute;box-shadow:0 0 10px 1px rgba(0,0,0,.75);text-align:center;padding:20px 40px;border-radius:10px;background-color:hsla(0,0%,100%,.66);left:50%;top:50%;margin-left:-60px;margin-top:-32px}.ilabm-preview-wait-modal h3{text-transform:uppercase;font-size:13px}.ilabm-preview-wait-modal span.spinner{float:none!important}.ilabm-bottom-bar{font-size:12px!important;padding:0 10px 10px;display:flex!important;justify-content:flex-end;align-items:center;min-height:20px}.ilabm-bottom-bar .ilabm-bottom-bar-seperator{position:relative;width:1px;height:20px;background-color:#ccc;margin:0 10px 0 20px!important}.ilabm-bottom-bar a,.ilabm-bottom-bar select{margin-left:10px!important}.ilabm-bottom-bar select{font-size:13px!important;min-width:140px}.ilabm-bottom-bar label{font-size:13px!important}.is-hidden{display:none}.ilabm-modal-close{top:0;right:0;cursor:pointer;color:#777;background-color:transparent;height:50px;width:50px;position:absolute;text-align:center;border:0;border-left:1px solid #ddd;transition:color .1s ease-in-out,background .1s ease-in-out;text-decoration:none;z-index:1000;box-sizing:content-box;transition-property:border,background,color;transition-duration:.05s;transition-timing-function:ease-in-out}.ilabm-modal-icon{background-repeat:no-repeat;display:block;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.ilabm-modal-icon:before{content:"\F335";font:normal 22px/1 dashicons;vertical-align:middle;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#666}.setup-body{display:flex;flex-direction:column;align-items:center;justify-content:center;padding-top:40px}.setup-body .service-selection-grid{display:grid;grid-template-columns:repeat(3,1fr);grid-gap:15px;grid-auto-rows:158px}.setup-body .service-selection-grid a{border-radius:5px;background-color:#fff;display:flex;flex-direction:column;justify-content:flex-end;align-items:center;border:1px solid #eaeaea;width:128px;height:128px;text-align:center;text-decoration:none;padding:15px;background-position:50% calc(50% - 15px);background-repeat:no-repeat;transition:transform .5s ease-out}.setup-body .service-selection-grid a:hover{transform:scale(1.1)}.setup-body .service-selection-grid a[data-service=s3]{grid-column:1;grid-row:1;background-image:url(../img/icon-service-s3.svg)}.setup-body .service-selection-grid a[data-service=google]{grid-column:2;grid-row:1;background-image:url(../img/icon-service-google.svg)}.setup-body .service-selection-grid a[data-service=minio]{grid-column:3;grid-row:1;background-image:url(../img/icon-service-minio.svg)}.setup-body .service-selection-grid a[data-service=backblaze]{grid-column:1;grid-row:2;background-image:url(../img/icon-service-backblaze.svg)}.setup-body .service-selection-grid a[data-service=do]{grid-column:2;grid-row:2;background-image:url(../img/icon-service-do.svg)}.setup-body .service-selection-grid a[data-service=other-s3]{grid-column:3;grid-row:2;background-image:url(../img/icon-service-other-s3.svg)}#ilab-video-upload-target{position:relative;padding:30px;border:4px dashed #e0e0e0;background-color:#fafafa;margin:20px 0;display:flex;flex-wrap:wrap;min-height:128px;cursor:pointer;transition:border .5s ease-out}#ilab-video-upload-target.drag-inside{border:4px solid #70a9dd;background-color:#bcd3e2}.ilab-upload-item{position:relative;min-width:128px;min-height:128px;max-width:128px;max-height:128px;width:128px;height:128px;background-color:#eaeaea;margin:10px;border-radius:0;border:1px solid #ddd;overflow:hidden;transition:opacity .5s ease-out,left .3s ease-out,top .3s ease-out,width .3s ease-out,height .3s ease-out,transform .3s ease-out;background-repeat:no-repeat;background-position:50%}.ilab-upload-item.upload-error{background-color:#eabab3;border:1px solid #bb6a6b}.ilab-upload-item.ilab-upload-selected{box-shadow:0 0 0 2px #fff,0 0 0 5px #0073aa}.ilab-upload-cell-image{background-image:url(../img/ilab-icon-image.svg);background-size:60px}.ilab-upload-cell-video{background-image:url(../img/ilab-icon-video.svg);background-size:60px}.ilab-upload-cell-doc{background-image:url(../img/ilab-icon-document.svg);background-size:45px}.no-mouse{cursor:default!important}.ilab-upload-item-background{position:absolute;left:-5px;top:-5px;right:-5px;bottom:-5px;background-repeat:no-repeat;background-size:cover;background-position:50%;transition:opacity .5s}.ilab-upload-status-container{position:absolute;left:0;top:0;right:0;bottom:0;display:flex;flex-direction:column;justify-content:center;align-items:center}.ilab-upload-status{color:#fff;font-weight:700;font-size:1em;text-shadow:0 0 3px #000}.ilab-upload-progress{width:80%;max-width:80%;height:9px;overflow:hidden;position:relative;margin-top:10px;border-radius:9px;background-color:hsla(0,0%,100%,.66)}.ilab-upload-progress-track{background-color:#0085ba;position:absolute;left:0;top:0;bottom:0;transition:width .125s ease-out}.ilab-upload-directions{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);font-size:2em;opacity:.5}.ilab-loader-container{display:flex;justify-content:center;align-items:center;position:absolute;left:0;top:0;right:0;bottom:0;transition:opacity .5s}.ilab-loader,.ilab-loader:after{border-radius:50%;width:24px;height:24px}.ilab-loader{font-size:5px;text-indent:-9999em;border:1.1em solid hsla(0,0%,100%,.2);border-left-color:#fff;-webkit-animation:load8 1.1s linear infinite;animation:load8 1.1s linear infinite}.ilab-loader.ilab-loader-dark{border:1.1em solid rgba(0,0,0,.2);border-left-color:#000}.ilab-upload-footer{padding-right:10px;position:absolute;left:0;right:0;border-top:1px solid #ddd;bottom:0;height:52px;background-color:#fff;display:flex;justify-content:flex-end;align-items:center;background-color:#fcfcfc;visibility:hidden}#ilab-attachment-info{position:absolute;right:-300px;top:0;bottom:54px;width:267px;transition:right .33s ease-out}.ilab-upload-insert-mode{position:relative;background-color:#fff}.ilab-upload-insert-mode div.wrap{position:absolute;left:0;top:0;right:0;bottom:52px;margin:0;padding:0 20px;overflow:auto;transition:right .33s ease-out}.ilab-upload-insert-mode div.wrap h2:first-of-type{display:none}.ilab-upload-insert-mode .ilab-upload-footer{visibility:visible}.ilab-item-selected div.wrap{right:300px}.ilab-item-selected #ilab-attachment-info{right:0}.media-cloud-upload-logo{width:240px;height:auto;margin-bottom:40px;opacity:.66;margin-top:-40px}.has-upload-message .upload-ui .media-cloud-upload-logo{display:none}.attachments-browser .upload-ui .media-cloud-upload-logo{margin-top:0}.minicolors{position:relative}.minicolors-sprite{background-image:url(../img/jquery.minicolors.png)}.minicolors-swatch{position:absolute;vertical-align:middle;background-position:-80px 0;border:1px solid #ccc;cursor:text;padding:0;margin:0;display:inline-block}.minicolors-swatch-color{position:absolute;top:0;left:0;right:0;bottom:0}.minicolors input[type=hidden]+.minicolors-swatch{width:28px;position:static;cursor:pointer}.minicolors input[type=hidden][disabled]+.minicolors-swatch{cursor:default}.minicolors-panel{position:absolute;width:173px;background:#fff;border:1px solid #ccc;box-shadow:0 0 20px rgba(0,0,0,.2);z-index:99999;box-sizing:content-box;display:none}.minicolors-panel.minicolors-visible{display:block}.minicolors-position-top .minicolors-panel{top:-154px}.minicolors-position-right .minicolors-panel{right:0}.minicolors-position-bottom .minicolors-panel{top:auto}.minicolors-position-left .minicolors-panel{left:0}.minicolors-with-opacity .minicolors-panel{width:194px}.minicolors .minicolors-grid{position:relative;top:1px;left:1px;width:150px;height:150px;margin-bottom:2px;background-position:-120px 0;cursor:crosshair}[dir=rtl] .minicolors .minicolors-grid{right:1px}.minicolors .minicolors-grid-inner{position:absolute;top:0;left:0;width:150px;height:150px}.minicolors-slider-saturation .minicolors-grid{background-position:-420px 0}.minicolors-slider-saturation .minicolors-grid-inner{background-position:-270px 0;background-image:inherit}.minicolors-slider-brightness .minicolors-grid{background-position:-570px 0}.minicolors-slider-brightness .minicolors-grid-inner{background-color:#000}.minicolors-slider-wheel .minicolors-grid{background-position:-720px 0}.minicolors-opacity-slider,.minicolors-slider{position:absolute;top:1px;left:152px;width:20px;height:150px;background-color:#fff;background-position:0 0;cursor:row-resize}[dir=rtl] .minicolors-opacity-slider,[dir=rtl] .minicolors-slider{right:152px}.minicolors-slider-saturation .minicolors-slider{background-position:-60px 0}.minicolors-slider-brightness .minicolors-slider,.minicolors-slider-wheel .minicolors-slider{background-position:-20px 0}.minicolors-opacity-slider{left:173px;background-position:-40px 0;display:none}[dir=rtl] .minicolors-opacity-slider{right:173px}.minicolors-with-opacity .minicolors-opacity-slider{display:block}.minicolors-grid .minicolors-picker{position:absolute;top:70px;left:70px;width:12px;height:12px;border:1px solid #000;border-radius:10px;margin-top:-6px;margin-left:-6px;background:none}.minicolors-grid .minicolors-picker>div{position:absolute;top:0;left:0;width:8px;height:8px;border-radius:8px;border:2px solid #fff;box-sizing:content-box}.minicolors-picker{position:absolute;top:0;left:0;width:18px;height:2px;background:#fff;border:1px solid #000;margin-top:-2px;box-sizing:content-box}.minicolors-swatches,.minicolors-swatches li{margin:5px 0 3px 5px;padding:0;list-style:none;overflow:hidden}[dir=rtl] .minicolors-swatches,[dir=rtl] .minicolors-swatches li{margin:5px 5px 3px 0}.minicolors-swatches .minicolors-swatch{position:relative;float:left;cursor:pointer;margin:0 4px 0 0}[dir=rtl] .minicolors-swatches .minicolors-swatch{float:right;margin:0 0 0 4px}.minicolors-with-opacity .minicolors-swatches .minicolors-swatch{margin-right:7px}[dir=rtl] .minicolors-with-opacity .minicolors-swatches .minicolors-swatch{margin-right:0;margin-left:7px}.minicolors-swatch.selected{border-color:#000}.minicolors-inline{display:inline-block}.minicolors-inline .minicolors-input{display:none!important}.minicolors-inline .minicolors-panel{position:relative;top:auto;left:auto;box-shadow:none;z-index:auto;display:inline-block}[dir=rtl] .minicolors-inline .minicolors-panel{right:auto}.minicolors-theme-default .minicolors-swatch{top:5px;left:5px;width:18px;height:18px}[dir=rtl] .minicolors-theme-default .minicolors-swatch{right:5px}.minicolors-theme-default .minicolors-swatches .minicolors-swatch{margin-bottom:2px;top:0;left:0;width:18px;height:18px}[dir=rtl] .minicolors-theme-default .minicolors-swatches .minicolors-swatch{right:0}.minicolors-theme-default.minicolors-position-right .minicolors-swatch{left:auto;right:5px}[dir=rtl] .minicolors-theme-default.minicolors-position-left .minicolors-swatch{right:auto;left:5px}.minicolors-theme-default.minicolors{display:inline-block}.minicolors-theme-default .minicolors-input{height:20px;width:auto;display:inline-block;padding-left:26px}[dir=rtl] .minicolors-theme-default .minicolors-input{text-align:right;unicode-bidi:-moz-plaintext;unicode-bidi:plaintext;padding-left:1px;padding-right:26px}.minicolors-theme-default.minicolors-position-right .minicolors-input{padding-right:26px;padding-left:inherit}[dir=rtl] .minicolors-theme-default.minicolors-position-left .minicolors-input{padding-right:inherit;padding-left:26px}.minicolors-theme-bootstrap .minicolors-swatch{z-index:2;top:3px;left:3px;width:28px;height:28px;border-radius:3px}[dir=rtl] .minicolors-theme-bootstrap .minicolors-swatch{right:3px}.minicolors-theme-bootstrap .minicolors-swatches .minicolors-swatch{margin-bottom:2px;top:0;left:0;width:20px;height:20px}[dir=rtl] .minicolors-theme-bootstrap .minicolors-swatches .minicolors-swatch{right:0}.minicolors-theme-bootstrap .minicolors-swatch-color{border-radius:inherit}.minicolors-theme-bootstrap.minicolors-position-right>.minicolors-swatch{left:auto;right:3px}[dir=rtl] .minicolors-theme-bootstrap.minicolors-position-left>.minicolors-swatch{right:auto;left:3px}.minicolors-theme-bootstrap .minicolors-input{float:none;padding-left:44px}[dir=rtl] .minicolors-theme-bootstrap .minicolors-input{text-align:right;unicode-bidi:-moz-plaintext;unicode-bidi:plaintext;padding-left:12px;padding-right:44px}.minicolors-theme-bootstrap.minicolors-position-right .minicolors-input{padding-right:44px;padding-left:12px}[dir=rtl] .minicolors-theme-bootstrap.minicolors-position-left .minicolors-input{padding-right:12px;padding-left:44px}.minicolors-theme-bootstrap .minicolors-input.input-lg+.minicolors-swatch{top:4px;left:4px;width:37px;height:37px;border-radius:5px}[dir=rtl] .minicolors-theme-bootstrap .minicolors-input.input-lg+.minicolors-swatch{right:4px}.minicolors-theme-bootstrap .minicolors-input.input-sm+.minicolors-swatch{width:24px;height:24px}.minicolors-theme-bootstrap .minicolors-input.input-xs+.minicolors-swatch{width:18px;height:18px}.input-group .minicolors-theme-bootstrap:not(:first-child) .minicolors-input{border-top-left-radius:0;border-bottom-left-radius:0}[dir=rtl] .input-group .minicolors-theme-bootstrap .minicolors-input{border-radius:4px}[dir=rtl] .input-group .minicolors-theme-bootstrap:not(:first-child) .minicolors-input{border-top-right-radius:0;border-bottom-right-radius:0}[dir=rtl] .input-group .minicolors-theme-bootstrap:not(:last-child) .minicolors-input{border-top-left-radius:0;border-bottom-left-radius:0}[dir=rtl] .input-group-addon,[dir=rtl] .input-group-btn>.btn,[dir=rtl] .input-group-btn>.btn-group>.btn,[dir=rtl] .input-group-btn>.dropdown-toggle,[dir=rtl] .input-group .form-control{border:1px solid #ccc;border-radius:4px}[dir=rtl] .input-group-addon:first-child,[dir=rtl] .input-group-btn:first-child>.btn,[dir=rtl] .input-group-btn:first-child>.btn-group>.btn,[dir=rtl] .input-group-btn:first-child>.dropdown-toggle,[dir=rtl] .input-group-btn:last-child>.btn-group:not(:last-child)>.btn,[dir=rtl] .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),[dir=rtl] .input-group .form-control:first-child{border-top-left-radius:0;border-bottom-left-radius:0;border-left:0}[dir=rtl] .input-group-addon:last-child,[dir=rtl] .input-group-btn:first-child>.btn-group:not(:first-child)>.btn,[dir=rtl] .input-group-btn:first-child>.btn:not(:first-child),[dir=rtl] .input-group-btn:last-child>.btn,[dir=rtl] .input-group-btn:last-child>.btn-group>.btn,[dir=rtl] .input-group-btn:last-child>.dropdown-toggle,[dir=rtl] .input-group .form-control:last-child{border-top-right-radius:0;border-bottom-right-radius:0}.minicolors-theme-semanticui .minicolors-swatch{top:0;left:0;padding:18px}[dir=rtl] .minicolors-theme-semanticui .minicolors-swatch{right:0}.minicolors-theme-semanticui input{text-indent:30px}.imgix-preview-image{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);max-width:100%;max-height:100%;display:block;pointer-events:none}.imgix-parameters-container{position:absolute;left:0;top:0;bottom:0;right:0;overflow-x:hidden;overflow-y:auto;display:flex;flex-direction:column;padding:15px 10px}.imgix-parameters-container.is-hidden{display:none}.imgix-parameters-container .imgix-parameter-group select{font-size:12px}.imgix-parameters-container .imgix-parameter-group h4{margin:0;font-size:10px;text-transform:uppercase;color:#999;background-color:#ddd;padding:5px 15px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.imgix-parameters-container .imgix-parameter-group>div{padding:15px}.imgix-parameter{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding-bottom:15px;margin-bottom:15px}.imgix-parameter .imgix-param-imagick-warning{position:absolute;left:-10px;top:-5px;right:-10px;bottom:0;padding:0 5px;display:flex;align-items:center;justify-content:center;background:hsla(0,0%,100%,.8)}.imgix-parameter .imgix-param-imagick-warning>div{text-align:center}.imgix-parameter:last-of-type{margin-bottom:0;padding-bottom:0}.imgix-param-title{display:flex;align-items:baseline;margin-bottom:0}.imgix-param-title-colortype{align-items:center!important;margin-bottom:8px}.imgix-param-title-colortype h3{margin:0!important}.imgix-param-title-left{flex:1 50%}.imgix-param-title-right{flex:1 50%;padding-left:40px;text-align:right;position:relative}.imgix-param-title-right h3{text-align:right}.imgix-param-blend-mode h3,.imgix-param-title h3{margin-top:0;font-size:11px;text-transform:uppercase;color:#666}.imgix-media-param-title .imgix-param-title-left{flex:2 80%}.imgix-media-param-title .imgix-param-title-right{flex:1 20%}.imgix-media-param-title .imgix-param-title-right a{text-align:center!important}.minicolors-theme-default.minicolors{width:auto;display:block;padding:0!important;margin:0;min-height:29px}.ilab-color-input{position:relative;top:0;right:0;height:30px!important;margin:0!important;padding-left:8px!important;padding-right:30px!important}.imgix-param-blend-mode{margin-top:15px;display:flex;align-items:baseline}.imgix-param-blend-mode h3{flex:1 50%}.imgix-param-blend-mode select{flex:2 100%}.imgix-parameter input[type=range]{display:block;width:100%;-webkit-appearance:none;margin:0 0 10px;background:none;padding:0!important}.imgix-parameter input[type=range]:focus{outline:none}.imgix-parameter input[type=range]:focus::-webkit-slider-runnable-track{background:#fff}.imgix-parameter input[type=range]::-webkit-slider-runnable-track{width:100%;height:5px;cursor:pointer;animate:.2s;box-shadow:inset 1px 1px 2px 0 rgba(0,0,0,.25);background:#d4cfd4;border-radius:4px;border:0 solid #000101}.imgix-parameter input[type=range]::-webkit-slider-thumb{border:1px solid rgba(0,0,0,.25);box-shadow:inset 0 2px 2px 0 hsla(0,0%,100%,.5);height:17px;width:17px;border-radius:9px;background:#dcdcdc;cursor:pointer;-webkit-appearance:none;margin-top:-6px}.imgix-parameter input[type=range]::-moz-range-track{width:100%;height:5px;cursor:pointer;animate:.2s;box-shadow:inset 1px 1px 2px 0 rgba(0,0,0,.25);background:#d4cfd4;border-radius:4px;border:0 solid #000101}.imgix-parameter input[type=range]::-moz-range-thumb{border:1px solid rgba(0,0,0,.25);box-shadow:inset 0 2px 2px 0 hsla(0,0%,100%,.5);height:17px;width:17px;border-radius:9px;background:#dcdcdc;cursor:pointer;-webkit-appearance:none;margin-top:-6px}.imgix-parameter .imgix-param-reset{display:flex;width:100%;justify-content:flex-end}.imgix-parameter .imgix-param-reset a{font-size:11px;font-style:italic;text-decoration:none}.imgix-parameter .imgix-param-reset a,.imgix-parameter a:focus{outline:none!important;border:0!important}.imgix-media-preview{position:relative;margin:0!important;padding:0 0 100%!important;background-image:url(../img/ilab-imgix-edit-bg.png);width:100%}.imgix-media-preview img{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);max-width:100%;max-height:100%;display:block}.imgix-media-preview-inner{position:absolute;left:0;right:0;bottom:0;top:0;display:flex;align-items:center;justify-content:center}.imgix-alignment-container{display:flex;flex:row;flex-wrap:wrap;justify-content:space-around;align-items:baseline;padding:0 35px}.imgix-alignment-button{background-color:#ddd;display:block;width:60px;height:60px;margin:5px;text-decoration:none;border-radius:4px;border:1px solid #888;box-shadow:inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,.15)!important}.selected-alignment{background-color:#bbb;box-shadow:inset 1px 1px 1px rgba(0,0,0,.25),0 1px 0 rgba(0,0,0,.15)!important}.ilabm-pillbox{flex-wrap:wrap;border-bottom:0!important}.ilabm-pillbox,.ilabm-pillbox .ilabm-pill{align-items:center;display:flex;justify-content:center}.ilabm-pillbox .ilabm-pill{white-space:nowrap;line-height:1;height:14px;min-height:32px;width:140px;min-width:140px;max-width:140px;font-size:10px;background-color:#eaeaea;text-transform:uppercase;font-weight:700;color:#444;text-decoration:none;border-radius:8px;margin:3px}.ilabm-pillbox .ilabm-pill span{display:block;margin-right:8px}.ilabm-pillbox .ilabm-pill span.icon{width:18px;height:18px;min-width:18px;min-height:18px;max-width:18px;max-height:18px;background-repeat:no-repeat;background-position:50%;background-size:contain;margin-left:8px}.ilabm-pillbox .pill-selected{background-color:#ccc;box-shadow:inset 1px 1px 1px rgba(0,0,0,.25);color:#fff}.ilabm-pillbox-no-icon .ilabm-pill{width:100px;min-width:100px;max-width:100px}.ilabm-pillbox-no-icon .ilabm-pill span{margin-right:0}.ilabm-pillbox-no-icon .ilabm-pill span.icon{display:none}.imgix-pill-enhance>span.icon{background-image:url(../img/ilab-imgix-magic-wand-black.svg)}.imgix-pill-enhance.pill-selected>span.icon{background-image:url(../img/ilab-imgix-magic-wand-white.svg)}.imgix-pill-redeye>span.icon{background-image:url(../img/ilab-imgix-red-eye-black.svg)}.imgix-pill-redeye.pill-selected>span.icon{background-image:url(../img/ilab-imgix-red-eye-white.svg)}.imgix-pill-usefaces>span.icon{background-image:url(../img/ilab-imgix-faces-black.svg)}.imgix-pill-usefaces.pill-selected>span.icon{background-image:url(../img/ilab-imgix-faces-white.svg)}.imgix-pill-focalpoint>span.icon{background-image:url(../img/ilab-imgix-focalpoint-black.svg)}.imgix-pill-focalpoint.pill-selected>span.icon{background-image:url(../img/ilab-imgix-focalpoint-white.svg)}.imgix-pill-entropy>span.icon{background-image:url(../img/ilab-imgix-chaos-black.svg)}.imgix-pill-entropy.pill-selected>span.icon{background-image:url(../img/ilab-imgix-chaos-white.svg)}.imgix-pill-edges>span.icon{background-image:url(../img/ilab-imgix-edges-black.svg)}.imgix-pill-edges.pill-selected>span.icon{background-image:url(../img/ilab-imgix-edges-white.svg)}.imgix-pill-h>span.icon{background-image:url(../img/ilab-flip-horizontal-black.svg)}.imgix-pill-h.pill-selected>span.icon{background-image:url(../img/ilab-flip-horizontal-white.svg)}.imgix-pill-v>span.icon{background-image:url(../img/ilab-flip-vertical-black.svg)}.imgix-pill-v.pill-selected>span.icon{background-image:url(../img/ilab-flip-vertical-white.svg)}.imgix-pill-clip>span.icon{background-image:url(../img/ilab-imgix-clip-black.svg)}.imgix-pill-clip.pill-selected>span.icon{background-image:url(../img/ilab-imgix-clip-white.svg)}.imgix-pill-crop>span.icon{background-image:url(../img/ilab-imgix-crop-black.svg)}.imgix-pill-crop.pill-selected>span.icon{background-image:url(../img/ilab-imgix-crop-white.svg)}.imgix-pill-max>span.icon{background-image:url(../img/ilab-imgix-max-black.svg)}.imgix-pill-max.pill-selected>span.icon{background-image:url(../img/ilab-imgix-max-white.svg)}.imgix-pill-scale>span.icon{background-image:url(../img/ilab-imgix-scale-black.svg)}.imgix-pill-scale.pill-selected>span.icon{background-image:url(../img/ilab-imgix-scale-white.svg)}.imgix-preset-make-default-container{align-items:center;display:flex;min-height:30px;margin-left:10px}.imgix-preset-container{align-items:center;display:flex}.imgix-preset-container.is-hidden,.imgix-preset-make-default-container.is-hidden{display:none}.imgix-param-label{font-style:italic;text-transform:none!important}.imgix-label-editor{position:absolute;right:-4px;top:0;width:40px;font-size:11px;padding:1px;text-align:right}.ilabm-focal-point-icon{position:absolute;background-image:url(../img/ilab-imgix-focalpoint-icon.svg);width:24px;height:24px;background-size:contain;pointer-events:none}.ilab-face-outline{position:absolute;border:3px solid #fff;-webkit-filter:drop-shadow(0 2px 3px #000);filter:drop-shadow(0 2px 3px black);opacity:.33;z-index:999;cursor:pointer}.ilab-face-outline span{display:block;position:absolute;background-color:#fff;color:#000;font-size:9px;width:12px;height:12px;text-align:center;font-weight:700;line-height:1}.ilab-face-outline.active{opacity:1;z-index:1000}.ilab-all-faces-outline{position:absolute;border:3px solid #fff;-webkit-filter:drop-shadow(0 2px 3px #000);filter:drop-shadow(0 2px 3px black)}input[type=range].imgix-param{-webkit-appearance:none;-moz-appearance:none;appearance:none}input[type=range].imgix-param:focus{outline:none}input[type=range].imgix-param:focus::-webkit-slider-runnable-track{background:#bababa}input[type=range].imgix-param::-webkit-slider-runnable-track{width:100%;height:17px;cursor:pointer;animate:.2s;background:#cfcfcf;border-radius:17px;box-shadow:none}input[type=range].imgix-param::-moz-range-track{width:100%;height:17px;cursor:pointer;animate:.2s;background:#cfcfcf;border-radius:17px;box-shadow:none}input[type=range].imgix-param::-webkit-slider-thumb{-webkit-appearance:none;cursor:pointer;width:18px;height:17px;border-radius:17px;margin-top:0}input[type=range].imgix-param::-moz-range-thumb{-webkit-appearance:none;cursor:pointer;width:18px;height:17px;border-radius:17px;margin-top:0}.ilab-crop-preview{overflow:hidden;max-width:100%;max-height:100%}.ilab-crop-now-wrapper{margin-top:12px}.ilabc-cropper{max-width:100%;max-height:100%}.ilabm-sidebar-content-cropper{flex-direction:column!important;padding:10px;overflow:scroll}.ilabm-sidebar-content-cropper h3{margin-top:0;font-size:11px;text-transform:uppercase;color:#888;font-weight:700}.cropper-dashed.dashed-h{top:38.4615385%;height:23.076923%}.cropper-dashed.dashed-v{left:38.4615385%;width:23.076923%}.ilabc-current-crop-container{position:relative;margin-bottom:15px}.ilabc-crop-preview-container,.ilabc-current-crop-container{background-image:url(../img/ilab-imgix-edit-bg.png);display:flex;align-items:center;justify-content:center;flex:1}.ilab-current-crop-img{position:absolute;-o-object-fit:contain;object-fit:contain;padding:0!important;margin:0!important;height:100%;width:100%}#ilab-crop-aspect-checkbox-container{display:flex;align-items:center}#ilab-crop-aspect-checkbox-container input{margin:0 8px 0 0;padding:0}#ilab-s3-info-meta .inside{padding:0 5px 10px}.info-panel-tabs{margin:-7px -5px 0;padding:6px 10px 0;background-color:rgba(0,0,0,.125)}.info-panel-tabs ul{display:flex;margin:0;padding:0;height:100%}.info-panel-tabs ul li{padding:5px 10px;font-size:11px;text-transform:uppercase;margin:0 10px 0 0;display:block;background-color:rgba(0,0,0,.0625);cursor:pointer;font-weight:700}.info-panel-tabs ul li.info-panel-missing-sizes{color:#9e0000}.info-panel-tabs ul li.active{background-color:#fff}.info-panel-contents{padding:15px 10px 0}.info-panel-contents .info-line{display:flex;flex-direction:column;margin-bottom:15px}.info-panel-contents .info-line h3,.info-panel-contents .info-line label{font-size:11px;text-transform:uppercase;margin:0;font-weight:700}.info-panel-contents .info-line label{margin-bottom:4px}.info-panel-contents .info-line select{font-size:12px!important}.info-panel-contents .info-line a{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.info-panel-contents .info-notice{padding:10px 5px 20px}.info-panel-contents .info-size-selector{margin-bottom:15px}.info-panel-contents .button-row{margin-bottom:15px;border-top:1px solid #eaeaea;padding-top:15px;display:flex;justify-content:flex-end;align-items:center}.info-panel-contents .button-row #ilab-info-regenerate-status{display:flex;padding:0;justify-content:center;align-items:center;width:100%;font-size:12px}.info-panel-contents .button-row #ilab-info-regenerate-status .spinner{float:none;display:block;margin:0 8px 0 0;width:16px;height:16px;background-size:16px 16px}.info-panel-contents .links-row{display:flex;align-items:center;justify-content:center;background-color:rgba(0,0,0,.05);border:1px solid rgba(0,0,0,.1);border-radius:8px;padding:10px 0;margin-bottom:15px}.info-panel-contents .links-row a{color:#000;display:flex;align-items:center;margin-right:20px;text-decoration:none;text-transform:uppercase;font-weight:700;font-size:11px}.info-panel-contents .links-row a:last-of-type{margin-right:0}.info-panel-contents .links-row a .dashicons{margin-right:3px;width:16px;height:16px;font-size:16px}#ilab-media-grid-info-popup{position:absolute;z-index:170000;opacity:1;transition:opacity .33s;-webkit-filter:drop-shadow(0 0 5px rgba(50,50,50,.5));filter:drop-shadow(0 0 5px rgba(50,50,50,.5));display:flex;align-items:center}#ilab-media-grid-info-popup.hidden{opacity:0;pointer-events:none}#ilab-media-grid-info-popup h2{text-transform:uppercase;font-size:9px;padding:4px 10px;margin:0;color:rgba(0,0,0,.33)}#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content{min-height:554px;background-color:#fff;width:275px;max-width:275px;padding-bottom:1px;display:flex;flex-direction:column;position:relative}#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content .info-panel-tabs{margin:0}#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content .info-panel-contents>div{display:flex;flex-direction:column}#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content .info-panel-contents>div>div{flex:1}#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content .info-panel-contents .info-file-info-size{flex-grow:1;display:flex;flex-direction:column}#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content .button-row{position:absolute;bottom:0;right:0;left:0}#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content .ilab-loader-container{display:flex;justify-content:center;align-items:center;position:absolute;left:0;top:0;right:0;bottom:0;transition:opacity .5s}#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content .ilab-loader,#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content .ilab-loader:after{border-radius:50%;width:24px;height:24px}#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content .ilab-loader{font-size:5px;text-indent:-9999em;border:1.1em solid hsla(0,0%,100%,.2);border-left-color:#fff;-webkit-animation:load8 1.1s linear infinite;animation:load8 1.1s linear infinite}#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content .ilab-loader.ilab-loader-dark{border:1.1em solid rgba(0,0,0,.2);border-left-color:#000}@-webkit-keyframes load8{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes load8{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}#ilab-media-grid-info-popup .ilab-media-popup-arrow-left{width:45px;display:flex;justify-content:flex-end}#ilab-media-grid-info-popup .ilab-media-popup-arrow-left>div{width:0;height:0;border-color:transparent #fff transparent transparent;border-style:solid;border-width:9px 15.6px 9px 0}#ilab-media-grid-info-popup .ilab-media-popup-arrow-right{width:45px;display:flex;justify-content:flex-start}#ilab-media-grid-info-popup .ilab-media-popup-arrow-right>div{width:0;height:0;border-color:transparent transparent transparent #fff;border-style:solid;border-width:9px 0 9px 15.6px;margin-right:30px}#ilab-media-grid-info-popup.popup-left .ilab-media-popup-arrow-right,#ilab-media-grid-info-popup.popup-right .ilab-media-popup-arrow-left{display:none}li.attachment{transition:opacity .3s ease-out,transform .3s ease-out,box-shadow .3s ease-out}li.attachment .ilab-loader-container{z-index:100}li.attachment.info-focused{transform:scale(1.1)}li.attachment.info-focused>div:first-of-type{box-shadow:0 0 5px 0 rgba(50,50,50,.5)}li.attachment.info-unfocused{opacity:.33}#ilab-media-grid-info-popup.ilab-popup-document h2{background-color:rgba(0,0,0,.125);color:#000}#ilab-media-grid-info-popup.ilab-popup-document .info-panel-contents{padding:10px 10px 0}#ilab-media-grid-info-popup.ilab-popup-document .ilab-media-grid-info-popup-content{min-height:484px}table.ilab-image-sizes{border-collapse:collapse;width:100%}table.ilab-image-sizes td,table.ilab-image-sizes th{padding:10px}table.ilab-image-sizes td.center{text-align:center}table.ilab-image-sizes thead th{border:2px solid #f1f1f1;background-color:#dadada}table.ilab-image-sizes tr{border-bottom:1px solid #dadada}.ilab-add-image-size-backdrop{display:flex;align-items:center;justify-content:center}.ilab-add-image-size-container{left:auto;right:auto;bottom:auto;top:auto}.ilab-new-image-size-form{padding:20px;display:flex;flex-direction:column}.ilab-new-image-size-form div.row{display:flex;align-items:center;margin-bottom:15px}.ilab-new-image-size-form div.row>label{width:90px;text-align:right;margin-right:15px;font-weight:700}.ilab-new-image-size-form div.button-row{padding:10px;text-align:right}.ilab-delete-size-button{font-size:0;display:inline-block;width:18px;height:18px;background-image:url(../img/ilab-ui-icon-trash.svg);background-size:contain;background-position:50%;background-repeat:no-repeat;background-size:12px;margin-right:10px}.ilab-delete-size-button.disabled{opacity:.33;pointer-events:none}.ilab-delete-size-button:hover{background-image:url(../img/ilab-ui-icon-trash-hover.svg)}.ilab-size-settings-button{font-size:0;display:inline-block;width:18px;height:18px;background-image:url(../img/ilab-ui-icon-settings.svg);background-size:contain;background-position:50%;background-repeat:no-repeat;background-size:14px}.ilab-size-settings-button.disabled{opacity:.33;pointer-events:none}.ilab-size-settings-button:hover{background-image:url(../img/ilab-ui-icon-settings-hover.svg)}.ilab-browser-select-table-container table,.ilab-storage-browser table{border-collapse:collapse;width:100%;font-size:1.1em}.ilab-browser-select-table-container table td,.ilab-browser-select-table-container table th,.ilab-storage-browser table td,.ilab-storage-browser table th{padding:12px}.ilab-browser-select-table-container table thead tr th,.ilab-storage-browser table thead tr th{text-align:left;border:2px solid #f1f1f1;background-color:#dadada}.ilab-browser-select-table-container table thead tr th.checkbox,.ilab-storage-browser table thead tr th.checkbox{max-width:30px;width:30px;text-align:center}.ilab-browser-select-table-container table tbody tr,.ilab-storage-browser table tbody tr{transition:background-color .125s linear;cursor:pointer}.ilab-browser-select-table-container table tbody tr:hover,.ilab-storage-browser table tbody tr:hover{background-color:#fff}.ilab-browser-select-table-container table tbody tr input[type=checkbox],.ilab-storage-browser table tbody tr input[type=checkbox]{z-index:1000}.ilab-browser-select-table-container table tbody tr td,.ilab-storage-browser table tbody tr td{text-decoration:none}.ilab-browser-select-table-container table tbody tr td.checkbox,.ilab-storage-browser table tbody tr td.checkbox{max-width:30px;width:30px;text-align:center}.ilab-browser-select-table-container table tbody tr td.entry,.ilab-storage-browser table tbody tr td.entry{display:flex;align-items:center}.ilab-browser-select-table-container table tbody tr td.actions,.ilab-storage-browser table tbody tr td.actions{text-align:center;width:130px;max-width:130px}.ilab-browser-select-table-container table tbody tr td.actions .button-delete,.ilab-storage-browser table tbody tr td.actions .button-delete{margin-right:0;margin-left:10px;color:#fff;border-color:#920002;background:#ca0002;box-shadow:0 1px 0 #cc0005}.ilab-browser-select-table-container table tbody tr td.actions .button-delete svg,.ilab-storage-browser table tbody tr td.actions .button-delete svg{height:14px}.ilab-browser-select-table-container table tbody tr td.actions .button-delete.disabled,.ilab-storage-browser table tbody tr td.actions .button-delete.disabled{color:#ff6468!important;border-color:#920002!important;background:#c6282a!important;box-shadow:0 1px 0 #cc0005!important;text-shadow:0 1px 0 #cc0005!important}.ilab-browser-select-table-container table tbody tr td.actions .button-delete.disabled svg>path,.ilab-browser-select-table-container table tbody tr td.actions .button-delete.disabled svg>rect,.ilab-storage-browser table tbody tr td.actions .button-delete.disabled svg>path,.ilab-storage-browser table tbody tr td.actions .button-delete.disabled svg>rect{fill:#ff6468}.ilab-browser-select-table-container table tbody tr td img.loader,.ilab-storage-browser table tbody tr td img.loader{display:none;margin-right:10px;width:16px;height:16px}.ilab-browser-select-table-container table tbody tr td span,.ilab-storage-browser table tbody tr td span{display:block;width:16px;height:16px;background-size:contain;background-repeat:no-repeat;margin-right:10px}.ilab-browser-select-table-container table tbody tr td span.icon-dir,.ilab-storage-browser table tbody tr td span.icon-dir{background-image:url(../img/ilab-ui-icon-folder.svg)}.ilab-browser-select-table-container table tbody tr td span.icon-file,.ilab-storage-browser table tbody tr td span.icon-file{background-image:url(../img/ilab-ui-icon-file.svg)}.ilab-browser-select-table-container table tbody tr td span.icon-up,.ilab-storage-browser table tbody tr td span.icon-up{background-image:url(../img/ilab-ui-icon-up-dir.svg)}.ilab-browser-select-table-container table tr,.ilab-storage-browser table tr{border-bottom:1px solid #dadada}.mcsb-buttons .button{margin-right:5px;display:flex;align-items:center}.mcsb-buttons .button svg{height:16px;width:auto;margin-right:8px}.mcsb-buttons .button svg>path,.mcsb-buttons .button svg>rect{fill:#fff}.mcsb-buttons .button-primary.disabled svg>path,.mcsb-buttons .button-primary.disabled svg>rect{fill:#66c6e4}.mcsb-buttons .button-create-folder svg{height:12px}.mcsb-buttons .button-import{margin-left:10px}.mcsb-buttons .button-import svg{height:14px}.mcsb-buttons .button-delete{margin-right:0;margin-left:10px;color:#fff;border-color:#920002;background:#ca0002;box-shadow:0 1px 0 #cc0005}.mcsb-buttons .button-delete svg{height:14px}.mcsb-buttons .button-delete.disabled{color:#ff6468!important;border-color:#920002!important;background:#c6282a!important;box-shadow:0 1px 0 #cc0005!important;text-shadow:0 1px 0 #cc0005!important}.mcsb-buttons .button-delete.disabled svg>path,.mcsb-buttons .button-delete.disabled svg>rect{fill:#ff6468}.mcsb-buttons .button-cancel{color:#fff;border-color:#920002;background:#ca0002;text-shadow:0 1px 0 #cc0005!important;box-shadow:0 1px 0 #cc0005}.mcsb-buttons .button-cancel:hover{border-color:#9f0002;background:#d80002;text-shadow:0 1px 0 #d60005!important;box-shadow:0 1px 0 #d60005}.mcsb-actions{margin-bottom:18px;font-size:1.1em}.mcsb-actions,.mcsb-actions div.mcsb-action-buttons{display:flex;align-items:center}.ilab-storage-browser-header{flex:1;padding:14px 9px;box-shadow:inset 0 0 3px 0 rgba(0,0,0,.125);border:1px solid #ddd;border-radius:8px;margin-right:18px}.ilab-storage-browser-header ul{margin:0;padding:0;display:flex}.ilab-storage-browser-header ul li{padding:0;position:relative;display:block;margin:0 30px 0 0}.ilab-storage-browser-header ul li a{text-decoration:none}.ilab-storage-browser-header ul li:first-of-type{padding-left:35px}.ilab-storage-browser-header ul li:first-of-type:before{background-image:url(../img/ilab-ui-icon-folder.svg);width:16px;height:16px;left:0}.ilab-storage-browser-header ul li:after,.ilab-storage-browser-header ul li:first-of-type:before{content:" ";position:absolute;background-size:contain;background-position:50%;background-repeat:no-repeat;top:50%;margin-left:10px;transform:translateY(-50%)}.ilab-storage-browser-header ul li:after{background-image:url(../img/ilab-ui-path-divider.svg);width:9px;height:9px}.ilab-storage-browser-header ul li:last-of-type:after{display:none}#mcsb-progress-modal{z-index:10000;position:fixed;left:0;top:0;right:0;bottom:0;background:rgba(0,0,0,.66);display:flex;align-items:center;justify-content:center;transition:opacity .15s linear;opacity:1;pointer-events:none}#mcsb-progress-modal.hidden{opacity:0}#mcsb-progress-modal .mcsb-progress-container{min-width:40vw;background-color:#fff;padding:30px}#mcsb-progress-modal .mcsb-progress-container .mcsb-progress-label{font-weight:700;font-size:1.1em;margin-bottom:20px}#mcsb-progress-modal .mcsb-progress-container .mcsb-progress-bar{position:relative;background-color:#eaeaea;height:24px;border-radius:12px;overflow:hidden}#mcsb-progress-modal .mcsb-progress-container .mcsb-progress-bar #mcsb-progress{position:absolute;left:0;top:0;bottom:0;background-color:#4f90c4}#mcsb-import-options-modal{z-index:10000;position:fixed;left:0;top:0;right:0;bottom:0;background:rgba(0,0,0,.66);display:flex;align-items:center;justify-content:center;transition:opacity .15s linear;opacity:1;pointer-events:none}#mcsb-import-options-modal.hidden{opacity:0}#mcsb-import-options-modal.hidden .mcsb-import-options-container{pointer-events:none}#mcsb-import-options-modal .mcsb-import-options-container{min-width:40vw;max-width:800px;background-color:#fff;padding:30px;pointer-events:all;display:flex;flex-direction:column}#mcsb-import-options-modal .mcsb-import-options-container h3{display:block;padding:0;margin:0 0 25px;position:relative;font-weight:700;font-size:1.125em}#mcsb-import-options-modal .mcsb-import-options-container div.mcsb-import-options{margin-bottom:50px}#mcsb-import-options-modal .mcsb-import-options-container div.mcsb-import-options ul{display:grid;grid-template-columns:repeat(1,1fr);grid-row-gap:20px;grid-column-gap:10px}#mcsb-import-options-modal .mcsb-import-options-container div.mcsb-import-options ul li{display:flex;align-items:flex-start}#mcsb-import-options-modal .mcsb-import-options-container div.mcsb-import-options ul li h4{margin:0;padding:0;font-size:1em}#mcsb-import-options-modal .mcsb-import-options-container div.mcsb-import-options ul li .mcsb-option{padding-top:2px}#mcsb-import-options-modal .mcsb-import-options-container div.mcsb-import-options ul li .mcsb-option-description{margin-left:15px}#mcsb-import-options-modal .mcsb-import-options-container div.mcsb-import-buttons{display:flex;justify-content:flex-end}#mcsb-import-options-modal .mcsb-import-options-container div.mcsb-import-buttons .button{margin:0 0 0 20px}#ilab-upload-target{position:fixed;left:0;right:0;bottom:0;top:0;display:flex;justify-content:center;align-items:center;font-size:2em;font-weight:700;color:#fff;background-color:rgba(28,90,129,.75);z-index:100000;transition:opacity .125s linear;opacity:0;pointer-events:none}#wpbody.drag-inside #ilab-upload-target{opacity:1}#mcsb-upload-modal{position:fixed;left:0;right:0;bottom:0;top:0;display:flex;justify-content:center;align-items:center;background:rgba(0,0,0,.66);z-index:100000;transition:opacity .125s linear;opacity:1}#mcsb-upload-modal.hidden{opacity:0;pointer-events:none}#mcsb-upload-modal #mcsb-upload-container{min-width:630px;min-height:385px;background-color:#fff;display:flex;flex-direction:column}#mcsb-upload-modal #mcsb-upload-container div.mcsb-upload-header{padding:20px;position:relative;font-weight:700}#mcsb-upload-modal #mcsb-upload-container div.mcsb-upload-items{position:relative;flex:1;background-color:#eaeaea}#mcsb-upload-modal #mcsb-upload-container div.mcsb-upload-items #mcsb-upload-items-container{padding:15px;position:absolute;left:0;top:0;right:0;bottom:0;overflow:auto;display:flex;flex-wrap:wrap}.ilab-browser-select{position:absolute;left:0;top:0;width:100%;height:100%;display:flex;flex-direction:column}.ilab-browser-select .ilab-browser-select-header{height:48px;min-height:48px;padding-left:12px;padding-right:64px;display:flex;align-items:center}.ilab-browser-select .ilab-browser-select-header input{flex:1;padding:7px 11px;border-radius:4px}.ilab-browser-select .ilab-browser-select-header input:disabled{color:#000}.ilab-browser-select .ilab-browser-select-table-container{flex:1;overflow-y:auto;background-color:#efefef}.ilab-browser-select .ilab-browser-select-footer{height:48px;min-height:48px;display:flex;align-items:center;justify-content:flex-end;padding-right:12px}.ilab-browser-select .ilab-browser-select-footer .button{margin-left:12px}.mcsb-modal-contents{border-radius:8px}.mcsb-modal-contents h3{background-image:url(../img/icon-cloud.svg);background-position:0;background-repeat:no-repeat;background-size:44px 44px;padding:12px 0 12px 60px!important}#task-manager div.available-tasks{padding:15px 20px 10px;display:flex;flex-direction:column;border-radius:8px;margin-bottom:25px;margin-top:30px;background-color:#e4e4e4}#task-manager div.available-tasks h2{margin:0 0 15px;padding:0;text-transform:uppercase;font-size:11px;color:#777}#task-manager div.available-tasks div.buttons{display:flex;flex-wrap:wrap}#task-manager div.available-tasks div.buttons .button{margin:0 10px 10px 0}#task-manager div.task-list{padding:18px 20px;border-radius:8px;background-color:#e4e4e4;margin-bottom:25px}#task-manager div.task-list h2{margin:0 0 15px;padding:0;text-transform:uppercase;font-size:11px;color:#777;display:flex;align-items:center;justify-content:space-between}#task-manager div.task-list table.task-table{width:100%;font-size:.9em}#task-manager div.task-list table.task-table td,#task-manager div.task-list table.task-table th{text-align:left;white-space:nowrap;padding:10px 20px;background-color:#efefef}#task-manager div.task-list table.task-table td.progress,#task-manager div.task-list table.task-table td.schedule,#task-manager div.task-list table.task-table th.progress,#task-manager div.task-list table.task-table th.schedule{width:100%}#task-manager div.task-list table.task-table th{background-color:#3a5674;color:#fff}#task-manager div.task-list table.task-table th:first-of-type{border-top-left-radius:4px}#task-manager div.task-list table.task-table th:last-of-type{border-top-right-radius:4px}#task-manager div.task-list table.task-table td.status{text-transform:capitalize}#task-manager div.task-list table.task-table td.status.status-complete{font-weight:700;color:green}#task-manager div.task-list table.task-table td.status.status-error{font-weight:700;color:#a70000}#task-manager div.task-list table.task-table td.progress{position:relative}#task-manager div.task-list table.task-table td.progress div.progress-bar{position:absolute;left:10px;top:10px;bottom:10px;right:10px;background-color:#ccc;display:flex;align-items:center;justify-content:center;overflow:hidden;border-radius:4px}#task-manager div.task-list table.task-table td.progress div.progress-bar .bar{position:absolute;left:0;top:0;bottom:0;width:75%;background-color:#50ade2}#task-manager div.task-list table.task-table td.progress div.progress-bar .amount{z-index:2;color:#fff;font-weight:700}#task-manager div.task-list table.task-table tbody tr:last-of-type td:first-of-type{border-bottom-left-radius:4px}#task-manager div.task-list table.task-table tbody tr:last-of-type td:last-of-type{border-bottom-right-radius:4px}.task-options-modal{position:fixed;left:0;top:0;right:0;bottom:0;background:rgba(0,0,0,.75);z-index:100000;display:flex;align-items:center;justify-content:center;transition:opacity .25s linear}.task-options-modal.invisible{opacity:0}.task-options-modal.invisible .task-modal{transform:scale(.95)}.task-options-modal .task-modal{background-color:#fff;padding:30px;border-radius:8px;transition:transform .25s ease-in-out}.task-options-modal .task-modal h2{padding:0;font-size:1.2em;margin:0 0 40px}.task-options-modal .task-modal form ul{padding:0;display:flex;flex-direction:column;margin:20px 0 0}.task-options-modal .task-modal form ul li{display:flex;margin-bottom:30px}.task-options-modal .task-modal form ul li:last-of-type{margin-bottom:0}.task-options-modal .task-modal form ul li>div:first-of-type{padding:10px 10px 20px 0;width:160px;min-width:160px;line-height:1.3;font-weight:600}.task-options-modal .task-modal form ul li>div:last-of-type{flex:1}.task-options-modal .task-modal form ul li div.description{margin-top:8px}.task-options-modal .task-modal form ul li div.option-ui{display:flex;align-items:center;width:100%}.task-options-modal .task-modal form ul li div.option-ui.option-ui-browser input[type=text]{flex:1;margin-right:10px;padding:7px 11px;border-radius:4px}.task-options-modal .task-modal form ul li div.option-ui.option-ui-browser input[type=text]:disabled{color:#000}.task-options-modal .task-modal form ul li div.option-ui.option-ui-media-select{display:flex;flex:1}.task-options-modal .task-modal form ul li div.option-ui.option-ui-media-select .media-select-label{flex:1;box-sizing:border-box;margin-right:10px;padding:7px 11px;border-radius:4px;background-color:hsla(0,0%,100%,.498039);border:1px solid hsla(0,0%,87.1%,.74902)}.task-options-modal .task-modal form ul li div.option-ui.option-ui-media-select .button{margin-right:5px}.task-options-modal .task-modal div.buttons{margin-top:40px;display:flex;justify-content:flex-end}.task-options-modal .task-modal div.buttons .button{margin-left:15px}#task-batch div.buttons{display:flex;justify-content:flex-end;margin-top:40px}#task-batch div.buttons .button-whoa{background:#a42929!important;border-color:#e62a2a #a42929 #a42929!important;box-shadow:0 1px 0 #a42929!important;color:#fff!important;text-decoration:none!important;text-shadow:0 -1px 1px #a42929,1px 0 1px #a42929,0 1px 1px #a42929,-1px 0 1px #a42929!important}#task-batch div.task-info .info-warning{border:1px solid orange;padding:24px;background:rgba(255,165,0,.125);margin-top:20px;border-radius:8px}#task-batch div.task-info .info-warning h4{padding:0;font-size:14px;margin:0 0 8px}#task-batch div.task-info .wp-cli-callout{padding:24px;background:#ddd;margin-top:20px;border-radius:8px}#task-batch div.task-info .wp-cli-callout h3{margin:0;padding:0;font-size:14px}#task-batch div.task-info .wp-cli-callout code{background-color:#bbb;padding:10px 15px;margin-top:5px;display:inline-block}#task-batch div.task-info .task-options{padding:24px;background:#e7e7e7;margin-top:20px;border-radius:8px}#task-batch div.task-info .task-options h3{margin:0;padding:0;font-size:14px}#task-batch div.task-info .task-options ul{padding:0;display:flex;flex-direction:column;margin:20px 0 0}#task-batch div.task-info .task-options ul li{display:flex;margin-bottom:30px}#task-batch div.task-info .task-options ul li:last-of-type{margin-bottom:0}#task-batch div.task-info .task-options ul li>div:first-of-type{padding:10px 10px 20px 0;width:160px;min-width:160px;line-height:1.3;font-weight:600}#task-batch div.task-info .task-options ul li div.description{margin-top:8px}#task-batch div.task-info .task-options ul li div.option-ui{display:flex;align-items:center}#task-batch div.task-info .task-options ul li div.option-ui.option-ui-browser{display:flex;width:50vw}#task-batch div.task-info .task-options ul li div.option-ui.option-ui-browser input[type=text]{flex:1;margin-right:10px;padding:7px 11px;border-radius:4px}#task-batch div.task-info .task-options ul li div.option-ui.option-ui-browser input[type=text]:disabled{color:#000}#task-batch div.task-info .task-options ul li div.option-ui.option-ui-media-select{display:flex;width:50vw}#task-batch div.task-info .task-options ul li div.option-ui.option-ui-media-select .media-select-label{flex:1;box-sizing:border-box;margin-right:10px;padding:7px 11px;border-radius:4px;background-color:hsla(0,0%,100%,.498039)}#task-batch div.task-info .task-options ul li div.option-ui.option-ui-media-select .button{margin-right:5px}#task-batch div.task-progress{padding:24px;background:#ddd;border-radius:8px}#task-batch div.task-progress .progress-container{position:relative;width:100%;height:14px;background:#aaa;border-radius:16px;overflow:hidden;background-image:url(../img/candy-stripe.svg)}#task-batch div.task-progress .progress-container .progress-bar{background-color:#4f90c4;height:100%;width:10px}#task-batch div.task-progress .progress-thumbnails{position:relative;width:100%;height:150px;margin-bottom:15px}#task-batch div.task-progress .progress-thumbnails .progress-thumbnails-container{position:absolute;left:0;top:0;right:0;bottom:0;overflow:hidden;-webkit-mask-image:linear-gradient(90deg,#ddd 0,hsla(0,0%,86.7%,0) 90%);mask-image:linear-gradient(90deg,#ddd 0,hsla(0,0%,86.7%,0) 90%)}#task-batch div.task-progress .progress-thumbnails .progress-thumbnails-container img{width:150px;height:150px;max-width:150px;max-height:150px;border-radius:4px;margin-right:10px}#task-batch div.task-progress .progress-thumbnails .progress-thumbnails-container .item-title{color:#fff;position:absolute;right:10px;bottom:7px;text-align:right;left:10px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;text-shadow:1px 1px 2px rgba(0,0,0,.75);font-weight:700}#task-batch div.task-progress .progress-thumbnails .progress-thumbnails-container .progress-thumb{position:absolute;left:0;top:0;width:150px;min-width:150px;max-width:150px;height:150px;min-height:150px;max-height:150px;background-size:cover;background-position:50%;background-repeat:no-repeat;margin-right:10px;border-radius:4px;background-color:#888;transition:opacity .25s linear,transform .25s linear}#task-batch div.task-progress .progress-thumbnails .progress-thumbnails-container .progress-thumb.invisible{opacity:0;transform:scale(.7)}#task-batch div.task-progress .progress-thumbnails .progress-thumbnails-container .progress-icon{position:absolute;left:0;top:0;position:relative;width:150px;min-width:150px;max-width:150px;height:150px;min-height:150px;max-height:150px;display:flex;align-items:center;justify-content:center;transition:opacity .25s linear,transform .25s linear}#task-batch div.task-progress .progress-thumbnails .progress-thumbnails-container .progress-icon.invisible{opacity:0;transform:scale(.8)}#task-batch div.task-progress .progress-thumbnails .progress-thumbnails-fade{background:linear-gradient(90deg,#ddd 0,hsla(0,0%,86.7%,0) 90%);position:absolute;left:150px;top:0;right:0;bottom:0}@supports ((-webkit-mask-image:linear-gradient(to left,rgba(221,221,221,0) 0%,#dddddd 95%,#dddddd 100%)) or (mask-image:linear-gradient(to left,rgba(221,221,221,0) 0%,#dddddd 95%,#dddddd 100%))){#task-batch div.task-progress .progress-thumbnails .progress-thumbnails-fade{display:none}}#task-batch div.task-progress .progress-thumbnails .progress-thumbnails-cloud{position:absolute;right:20px;top:50%;transform:translateY(-50%)}#task-batch div.task-progress .progress-stats{margin-top:20px;display:flex;align-items:center;justify-content:center}@media (max-width:960px){#task-batch div.task-progress .progress-stats{flex-direction:column;align-items:flex-start;justify-content:flex-start}}#task-batch div.task-progress .progress-stats div.group-break{display:flex;margin-right:1.2195121951vw}#task-batch div.task-progress .progress-stats div.group-break:last-of-type{margin-right:0}#task-batch div.task-progress .progress-stats div.group-break:first-of-type{flex:1}@media (max-width:960px){#task-batch div.task-progress .progress-stats div.group-break{width:100%;margin-bottom:1.2195121951vw}}#task-batch div.task-progress .progress-stats div.group{display:flex;align-items:center;padding:1.0975609756vw 0;background-color:#e6e6e6;border-radius:8px;margin-right:1.2195121951vw}#task-batch div.task-progress .progress-stats div.group *{white-space:nowrap}@media (max-width:960px){#task-batch div.task-progress .progress-stats div.group.mobile-flexed{flex:1}}#task-batch div.task-progress .progress-stats div.group.flexed{flex:1}#task-batch div.task-progress .progress-stats div.group:last-of-type{margin-right:0}#task-batch div.task-progress .progress-stats div.group div.callout{position:relative;margin-right:.6097560976vw;padding:0 1.4634146341vw}#task-batch div.task-progress .progress-stats div.group div.callout:after{display:block;position:absolute;content:"";height:50%;width:1px;right:0;top:25%;background-color:rgba(0,0,0,.25)}#task-batch div.task-progress .progress-stats div.group div.callout:last-of-type:after{display:none}#task-batch div.task-progress .progress-stats div.group div.callout p.value{line-height:1;padding:0;font-size:1.5853658537vw;font-weight:300;margin:0 0 .487804878vw}#task-batch div.task-progress .progress-stats div.group div.callout p.value.status{text-transform:capitalize}@media (max-width:960px){#task-batch div.task-progress .progress-stats div.group div.callout p.value{font-size:2.9268292683vw}}#task-batch div.task-progress .progress-stats div.group div.callout h4{line-height:1;margin:0;padding:0;font-size:.6097560976vw;text-transform:uppercase}@media (max-width:960px){#task-batch div.task-progress .progress-stats div.group div.callout h4{font-size:.8536585366vw}}
-/*! mediabox v1.1.3 | (c) 2018 Pedro Rogerio | https://github.com/pinceladasdaweb/mediabox */.stop-scroll{height:100%;overflow:hidden}.mediabox-wrap{position:fixed;width:100%;height:100%;background-color:rgba(0,0,0,.8);top:0;left:0;opacity:0;z-index:999;-webkit-animation-duration:.5s;animation-duration:.5s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:mediabox;animation-name:mediabox}@-webkit-keyframes mediabox{0%{opacity:0}to{opacity:1}}@keyframes mediabox{0%{opacity:0}to{opacity:1}}.mediabox-content{max-width:853px;display:block;margin:0 auto;height:100%;position:relative}.mediabox-content iframe{max-width:100%!important;width:100%!important;display:block!important;height:480px!important;border:none!important;position:absolute;top:0;bottom:0;margin:auto 0}.mediabox-hide{-webkit-animation-duration:.5s;animation-duration:.5s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:mediaboxhide;animation-name:mediaboxhide}@-webkit-keyframes mediaboxhide{0%{opacity:1}to{opacity:0}}@keyframes mediaboxhide{0%{opacity:1}to{opacity:0}}.mediabox-close{position:absolute;top:0;cursor:pointer;bottom:528px;right:0;margin:auto 0;width:24px;height:24px;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAMvSURBVHja7Js9aBRBFMd/d1lPY6FiJVjY+Fkoxl7wA1Q0prQRS6tgoZV2MWIRRVHUUq3U+JnESrS2sBXBzipREWMlATXwt8gFznC5nd15M7Nn8uC45nZnfr/dY96+N1uTxFKOOks8lgUU/H2t4tJqIQUcAiaBGeBymcECRgO4B/wBPgJ9zkdKcvkclfRL/8ZtSTXH40N+GpLGF8zth6Q9Lse7DHCsDXxVJLSDLyQhb4B+Sb/VOVJJ6ATfKqGvrIDjDvCpJLjAz8d0JwmLDTBQAD62hIakiYJzm5a021VAfwn4WBLKwLdK2JUnIJP0XX4RSoIP/Hy8W3jeepv1dL3nmjwI3DLOExrAU2DA8zwb8xKhGeCuwYQtJTSAZwbwAHdcEqFM0mPZhO/foSHppdFcrraby2IDV0FCcPi8PCClhCjwLplgCgkrDeGv5I3pcjViSogK7yogloTo8EUEhJaQBL6oAGsJ9yVtkrRD0qsU8JKolagKZ8AD4ETFymFXgPOAQpXE5mMWOAk86XZ4n6pwlSSUhvcti1dBghe8RV8gpYQRX3irxkgKCSPABV94y85QTAlm8NatsRgSTOGBUnmAS57w3KiA0Ro3gHOW8KEEAOwE3hvfXWubFauu6A6vCND07OmW9viq5vpsGT3AtRAN2XoA+BfAwQBiTweoNpMZw48BRwKuAoPN7zNVWwZjwAfpO9S7DN5cQmYAPw4cTvAsYPJ3qHcpvNmdUO9ieBMJZQT0AhMVgfeWUC8BP87cjjHfuA6sATY0c4c0EgpUUHslvTaq3l5aUL1N1oarAnxSCVWBTyYhJvyw41XJJI3GkpAH/yYyfHQJi01gdUL4qBKqCh9NQrtBx4wGvGi0XS6T9MhoTkN5AtZVDN5awlTePsGfwDfPjGwYGDKu3s4Cp4BRz/N8cskED0iaqciVt7wTvkra5roKlJEQGt5HwhdJ24vmAUUkDEV+VyCT9NBxbp/bXXnXTNBFQmz4IhI6wrs+C+zvICEVvIuEKUlbrZ4G97WRkBq+k4RJSVusd4ntlfSheVudrQh8q4SbmntH6K2kzSF3if1Xsfzq7LKAJR5/BwCdAQBJn4egPgAAAABJRU5ErkJggg==") no-repeat;background-size:24px 24px}.mediabox-close:hover{opacity:.5}@media (max-width:768px){.mediabox-content{max-width:90%}}@media (max-width:600px){.mediabox-content iframe{height:320px!important}.mediabox-close{bottom:362px}}@media (max-width:480px){.mediabox-content iframe{height:220px!important}.mediabox-close{bottom:262px}}.mediabox-wrap{z-index:1000000}.mediabox-content{max-width:75vw}.mediabox-content iframe{height:42.1875vw!important}.mediabox-close{bottom:46vw}.ic-Super-toggle__label{box-sizing:border-box;margin:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ic-Form-group.ic-Form-group--horizontal .ic-Super-toggle__label{display:inline-flex;align-items:center}.ic-Super-toggle__input{opacity:0;position:absolute}.ic-Super-toggle__input:checked~label .ic-Super-toggle-switch:after{transform:translate3d(100%,0,0)}.ic-Super-toggle__input:checked~label .ic-Super-toggle__disabled-msg:before{content:attr(data-checked)}.ic-Super-toggle__input[disabled]{opacity:0!important}.ic-Super-toggle__input[disabled]~label .ic-Super-toggle-switch{opacity:.33}.ic-Super-toggle-switch{transition:background .1s,border-color .1s;position:relative;line-height:1;display:flex;align-items:center;background-clip:padding-box}.ic-Super-toggle-switch:after{transition:all .1s ease-in-out;content:"";position:absolute;top:0;left:0;transform:translateZ(0);border-radius:100%;box-shadow:0 3px 6px rgba(0,0,0,.3);background-image:url(https://cl.ly/320m31452k2X/handle.svg);background-position:50% 50%;background-repeat:no-repeat;background-size:20px}.ic-Super-toggle__disabled-msg{display:none}.ic-Super-toggle__disabled-msg:before{content:attr(data-unchecked);font-style:italic;opacity:.8}[class^=ic-Super-toggle-option-]{transition:all .2s ease-out;flex:0 0 50%;text-align:center;position:relative;z-index:1;text-transform:uppercase;font-weight:700;line-height:1;speak:none;box-sizing:border-box}.ic-Super-toggle__screenreader{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute}.ic-Super-toggle--on-off{display:inline-block;vertical-align:middle}.ic-Super-toggle--on-off .ic-Super-toggle__input:focus~label .ic-Super-toggle-switch:after{box-shadow:inset 0 0 0 1px #fff,inset 0 0 0 3px #5b6c79,0 3px 6px rgba(0,0,0,.3)}.ic-Super-toggle--on-off .ic-Super-toggle__input:checked~label .ic-Super-toggle-switch{background:#4cace3;border-color:#4cace3}.ic-Super-toggle--on-off .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT{color:#fff}.ic-Super-toggle--on-off .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT .ic-Super-toggle__svg>*{fill:#fff}.ic-Super-toggle--on-off .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT{color:#fff}.ic-Super-toggle--on-off .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT .ic-Super-toggle__svg>*{fill:#fff}.ic-Super-toggle--on-off .ic-Super-toggle__input:checked:focus~label .ic-Super-toggle-switch:after{box-shadow:inset 0 0 0 1px #fff,inset 0 0 0 3px #4cace3,0 3px 6px rgba(0,0,0,.3)}.ic-Super-toggle--on-off .ic-Super-toggle-switch{width:50px;height:25px;background:#5b6c79;border:2px solid #5b6c79;border-radius:14.5px}.ic-Form-group.ic-Form-group--horizontal .ic-Super-toggle--on-off .ic-Super-toggle-switch{flex:0 0 50px}.ic-Super-toggle--on-off .ic-Super-toggle-switch:after{background-color:#fff;width:25px;height:25px}.ic-Super-toggle--on-off .ic-Super-toggle-option-LEFT{color:#fff}.ic-Super-toggle--on-off .ic-Super-toggle-option-LEFT .ic-Super-toggle__svg>*{fill:#fff}.ic-Super-toggle--on-off .ic-Super-toggle-option-RIGHT{color:#fff}.ic-Super-toggle--on-off .ic-Super-toggle-option-RIGHT .ic-Super-toggle__svg>*{fill:#fff}.ic-Super-toggle--on-off .ic-Super-toggle__svg{max-width:12.5px;max-height:12.5px}.ic-Super-toggle--on-off [class^=ic-Super-toggle-option-]{transition-delay:.1s}.ic-Super-toggle--on-off .ic-Super-toggle-option-LEFT{transform:scale(.1);opacity:0}.ic-Super-toggle--on-off .ic-Super-toggle-option-RIGHT,.ic-Super-toggle--on-off .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT{transform:scale(1);opacity:1}.ic-Super-toggle--on-off .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT{transform:scale(.1);opacity:0}.toggle-warning{display:inline-block;vertical-align:middle}.toggle-warning .ic-Super-toggle__input:focus~label .ic-Super-toggle-switch:after{box-shadow:inset 0 0 0 1px #fff,inset 0 0 0 3px #5b6c79,0 3px 6px rgba(0,0,0,.3)}.toggle-warning .ic-Super-toggle__input:checked~label .ic-Super-toggle-switch{background:#ffaa10;border-color:#ffaa10}.toggle-warning .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT{color:#fff}.toggle-warning .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT .ic-Super-toggle__svg>*{fill:#fff}.toggle-warning .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT{color:#fff}.toggle-warning .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT .ic-Super-toggle__svg>*{fill:#fff}.toggle-warning .ic-Super-toggle__input:checked:focus~label .ic-Super-toggle-switch:after{box-shadow:inset 0 0 0 1px #fff,inset 0 0 0 3px #ffaa10,0 3px 6px rgba(0,0,0,.3)}.toggle-warning .ic-Super-toggle-switch{width:50px;height:25px;background:#5b6c79;border:2px solid #5b6c79;border-radius:14.5px}.ic-Form-group.ic-Form-group--horizontal .toggle-warning .ic-Super-toggle-switch{flex:0 0 50px}.toggle-warning .ic-Super-toggle-switch:after{background-color:#fff;width:25px;height:25px}.toggle-warning .ic-Super-toggle-option-LEFT{color:#fff}.toggle-warning .ic-Super-toggle-option-LEFT .ic-Super-toggle__svg>*{fill:#fff}.toggle-warning .ic-Super-toggle-option-RIGHT{color:#fff}.toggle-warning .ic-Super-toggle-option-RIGHT .ic-Super-toggle__svg>*{fill:#fff}.toggle-warning .ic-Super-toggle__svg{max-width:12.5px;max-height:12.5px}.ic-Super-toggle--ui-switch{display:inline-block;vertical-align:middle}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:focus~label .ic-Super-toggle-switch:after{box-shadow:inset 0 0 0 1px #fff,inset 0 0 0 3px #5b6c79,0 3px 6px rgba(0,0,0,.3)}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked~label .ic-Super-toggle-switch{background:#5b6c79;border-color:#5b6c79}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT{color:#888}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT .ic-Super-toggle__svg>*{fill:#888}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT{color:#08c}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT .ic-Super-toggle__svg>*{fill:#08c}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked:focus~label .ic-Super-toggle-switch:after{box-shadow:inset 0 0 0 1px #fff,inset 0 0 0 3px #5b6c79,0 3px 6px rgba(0,0,0,.3)}.ic-Super-toggle--ui-switch .ic-Super-toggle-switch{width:50px;height:25px;background:#5b6c79;border:2px solid #5b6c79;border-radius:14.5px}.ic-Form-group.ic-Form-group--horizontal .ic-Super-toggle--ui-switch .ic-Super-toggle-switch{flex:0 0 50px}.ic-Super-toggle--ui-switch .ic-Super-toggle-switch:after{background-color:#fff;width:25px;height:25px}.ic-Super-toggle--ui-switch .ic-Super-toggle-option-LEFT{color:#08c}.ic-Super-toggle--ui-switch .ic-Super-toggle-option-LEFT .ic-Super-toggle__svg>*{fill:#08c}.ic-Super-toggle--ui-switch .ic-Super-toggle-option-RIGHT{color:#888}.ic-Super-toggle--ui-switch .ic-Super-toggle-option-RIGHT .ic-Super-toggle__svg>*{fill:#888}.ic-Super-toggle--ui-switch .ic-Super-toggle__svg{max-width:12.5px;max-height:12.5px}.ic-Super-toggle--ui-switch .ic-Super-toggle__label{display:inline-flex;align-items:center}.ic-Super-toggle--ui-switch .ic-Super-toggle-switch{display:block}.ic-Super-toggle--ui-switch [class^=ic-Super-toggle-option-]{flex:none;min-width:24px}.ic-Super-toggle--ui-switch .ic-Super-toggle-option-LEFT{text-align:left;transform:scale(1.1)}.ic-Super-toggle--ui-switch .ic-Super-toggle-option-RIGHT{text-align:right;transform:scale(.9)}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT{transform:scale(.9)}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT{transform:scale(1.1)}.settings-container{font-family:system-ui,-apple-system,BlinkMacSystemFont,Avenir Next,Avenir,Segoe UI,Lucida Grande,Helvetica Neue,Helvetica,Fira Sans,Roboto,Noto,Droid Sans,Cantarell,Oxygen,Ubuntu,Franklin Gothic Medium,Century Gothic,Liberation Sans,sans-serif;margin:0 0 64px -20px}.settings-container header{position:relative;background-image:url(../img/settings-bg-large.svg);background-position:0;background-repeat:no-repeat;background-size:cover;min-height:80px;width:100%;display:flex;align-items:center}.settings-container header>img{margin:0 20px;width:88px;max-width:88px}.settings-container header h1{margin-left:5px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Avenir Next,Avenir,Segoe UI,Lucida Grande,Helvetica Neue,Helvetica,Fira Sans,Roboto,Noto,Droid Sans,Cantarell,Oxygen,Ubuntu,Franklin Gothic Medium,Century Gothic,Liberation Sans,sans-serif;text-transform:uppercase;font-weight:400;font-size:1.5em;color:#777}.settings-container header .header-actions{position:absolute!important;right:40px;top:50%;transform:translateY(-50%)!important;display:flex}.settings-container header .header-actions a{margin-left:8px;display:flex;align-items:center}.settings-container header .header-actions a svg{height:16px;width:auto;margin-right:8px}.settings-container header .header-actions a svg>path,.settings-container header .header-actions a svg>rect{fill:#fff}.settings-container header .header-actions div.spacer{width:8px;min-width:8px}.settings-container header.all-settings{display:flex;flex-direction:column;align-items:flex-start}.settings-container header.all-settings div.contents{height:104px;display:flex;justify-content:space-between;align-items:center;width:100%}.settings-container header.all-settings div.contents img.logo{margin:0 0 0 23px;width:108px;max-width:108px}.settings-container header.all-settings div.contents div.settings-select-container{background-color:hsla(0,0%,100%,.6);padding:10px 14px;border-radius:8px;z-index:1000;margin-right:23px;display:none}@media (max-width:992px){.settings-container header.all-settings div.contents div.settings-select-container{display:unset}}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown{display:flex;align-items:center;z-index:1000}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown>div:first-of-type{font-family:system-ui,-apple-system,BlinkMacSystemFont,Avenir Next,Avenir,Segoe UI,Lucida Grande,Helvetica Neue,Helvetica,Fira Sans,Roboto,Noto,Droid Sans,Cantarell,Oxygen,Ubuntu,Franklin Gothic Medium,Century Gothic,Liberation Sans,sans-serif;margin-right:10px;color:#777;text-decoration:none;text-transform:uppercase;font-weight:700;font-size:1em}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown div.dropdown{position:relative;width:200px;height:36px;z-index:1000;cursor:pointer}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown div.dropdown div.current{font-family:system-ui,-apple-system,BlinkMacSystemFont,Avenir Next,Avenir,Segoe UI,Lucida Grande,Helvetica Neue,Helvetica,Fira Sans,Roboto,Noto,Droid Sans,Cantarell,Oxygen,Ubuntu,Franklin Gothic Medium,Century Gothic,Liberation Sans,sans-serif;display:flex;align-items:center;position:absolute;left:0;top:0;right:0;bottom:0;background-color:#eee;border:1px solid #ddd;padding-left:10px;color:#777;text-decoration:none;text-transform:uppercase;font-weight:700;font-size:13px;cursor:pointer;background-image:url(../img/icon-dropdown-arrow.svg);background-repeat:no-repeat;background-position:right 12px center;transition:background-color .15s linear}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown div.dropdown div.current:hover{background-color:#fff}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown div.dropdown div.items{z-index:1001;position:absolute;top:0;left:0;right:0;transition:opacity .15s linear,transform .15s linear;opacity:0;pointer-events:none}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown div.dropdown div.items.visible{pointer-events:auto;opacity:1}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown div.dropdown div.items ul{margin:0;padding:0;box-shadow:0 0 8px 1px rgba(0,0,0,.125)}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown div.dropdown div.items ul li{position:relative;margin:0;padding:0;border:1px solid #ddd;border-top:0;align-items:center}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown div.dropdown div.items ul li:first-of-type{border:1px solid #ddd}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown div.dropdown div.items ul li a.tool{position:relative;display:flex;align-items:center;height:36px;background-color:#eee;padding-left:10px;color:#777;text-decoration:none;text-transform:uppercase;font-weight:700;font-size:13px;transition:background-color .15s linear}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown div.dropdown div.items ul li a.tool:hover{background:#fff}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown div.dropdown div.items ul li a.tool-pin{display:block;position:absolute;top:0;width:36px;height:36px;right:0;background-image:url(../img/icon-pin-deselected.svg);background-repeat:no-repeat;background-position:50%}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown div.dropdown div.items ul li a.tool-pin.pinned{background-image:url(../img/icon-pin-selected.svg)}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown div.dropdown div.items ul li.active a.tool{background:#fff}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown.active div.dropdown div.current{background-color:#ddd}.settings-container header.all-settings div.mcloud-settings-tabs{position:relative;width:100%;padding-left:23px;border-bottom:1px solid #d1d1d1;width:calc(100% - 24px);margin-top:8px}@media (max-width:992px){.settings-container header.all-settings div.mcloud-settings-tabs{display:none}}.settings-container header.all-settings div.mcloud-settings-tabs .navwrap{position:relative;overflow:hidden;transform:translateY(1px);width:100%;height:36px}.settings-container header.all-settings div.mcloud-settings-tabs .navwrap ul{position:absolute;left:0;top:0;bottom:0;width:30000px;display:flex;align-items:center;padding:0;margin:0}.settings-container header.all-settings div.mcloud-settings-tabs .navwrap ul li{height:100%;display:flex;margin:0 3px 0 0;padding:0 11px 0 14px;background-color:#ddd;align-items:center;border:1px solid #d1d1d1;border-bottom:none;border-top-left-radius:4px;border-top-right-radius:4px}.settings-container header.all-settings div.mcloud-settings-tabs .navwrap ul li a.tool{display:flex;align-items:center;color:#777;text-decoration:none;text-transform:uppercase;font-weight:700;font-size:11px;white-space:nowrap}.settings-container header.all-settings div.mcloud-settings-tabs .navwrap ul li a.tool-pin{display:block;width:20px;height:36px;margin-left:8px;background-image:url(../img/icon-pin-deselected.svg);background-repeat:no-repeat;background-position:50%;background-size:14px}.settings-container header.all-settings div.mcloud-settings-tabs .navwrap ul li a.tool-pin.pinned{background-image:url(../img/icon-pin-selected.svg)}.settings-container header.all-settings div.mcloud-settings-tabs .navwrap ul li.active{background-color:#f1f1f1}.settings-container header.all-settings div.mcloud-settings-tabs .navwrap ul li.active a{color:#000}.settings-container header.all-settings div.mcloud-settings-tabs a.tabs-nav{position:absolute;display:flex;align-items:center;justify-content:center;width:96px;top:-1px;bottom:0}.settings-container header.all-settings div.mcloud-settings-tabs a.tabs-nav span{font-size:0;line-height:0;display:block;width:20px;height:20px;background-repeat:no-repeat;background-position:50%;background-size:contain}.settings-container header.all-settings div.mcloud-settings-tabs a.tabs-nav.hidden{opacity:0;pointer-events:none}.settings-container header.all-settings div.mcloud-settings-tabs a.tabs-prev{left:0;justify-content:flex-start;background:linear-gradient(90deg,#f1f1f1 50%,hsla(0,0%,94.5%,0))}.settings-container header.all-settings div.mcloud-settings-tabs a.tabs-prev span{margin-left:10px;background-image:url(../img/ilab-icons-prev.svg)}.settings-container header.all-settings div.mcloud-settings-tabs a.tabs-next{right:0;justify-content:flex-end;background:linear-gradient(270deg,#f1f1f1 50%,hsla(0,0%,94.5%,0))}.settings-container header.all-settings div.mcloud-settings-tabs a.tabs-next span{margin-right:10px;background-image:url(../img/ilab-icons-next.svg)}.settings-container header.all-settings div.mcloud-settings-tabs.animated .navwrap ul{transition:transform .25s linear}.settings-container header.all-settings div.mcloud-settings-tabs.animated a.tabs-nav{transition:opacity .25s linear}.settings-container .settings-body{margin:20px}.settings-container .settings-body .settings-description{font-size:1.1em;text-align:center;background-color:#fafafa;padding:25px;border-radius:8px;margin-bottom:20px}.settings-container .settings-body.show-upgrade{display:flex}.settings-container .settings-body.show-upgrade>.settings-interior{flex:1;margin-right:20px}@media (max-width:64em){.settings-container .settings-body.show-upgrade>.settings-interior{order:1;margin-right:0}}@media (max-width:64em){.settings-container .settings-body.show-upgrade{flex-direction:column}}.settings-container .settings-body .upgrade-feature{background-color:#fafafa;border-radius:8px;padding:15px 20px}.settings-container .settings-body .upgrade-feature h2{padding:0;margin:0 0 30px;color:#46a4dd}.settings-container .settings-body .upgrade-feature ul{margin-left:20px;list-style:unset}.settings-container .settings-body .upgrade-feature ul li{list-style-type:square}.settings-container .settings-body .upgrade-feature div.button-container{text-align:right;padding:20px 0}.settings-container .settings-body .upgrade-feature div.button-container a{padding:10px;background-color:#46a4dd;border-radius:6px;color:#fff;text-decoration:none;font-weight:700;font-size:1.1em}.settings-container .settings-body .upgrade-promo{min-width:200px;max-width:320px;position:relative}.settings-container .settings-body .upgrade-promo .upgrade-interior{position:relative;background-color:#fafafa;border-radius:8px;padding:15px 20px}.settings-container .settings-body .upgrade-promo .upgrade-interior h2{padding:0;margin:0 0 30px;color:#46a4dd}.settings-container .settings-body .upgrade-promo .upgrade-interior ul{margin-left:20px}.settings-container .settings-body .upgrade-promo .upgrade-interior ul li{list-style-type:square}@media (max-width:64em){.settings-container .settings-body .upgrade-promo .upgrade-interior ul{display:flex;flex-wrap:wrap;width:100%}@supports (display:grid){.settings-container .settings-body .upgrade-promo .upgrade-interior ul{display:grid;grid-template-columns:1fr 1fr 1fr}}.settings-container .settings-body .upgrade-promo .upgrade-interior ul li{margin-right:30px}}@media (max-width:48.9275em){@supports (display:grid){.settings-container .settings-body .upgrade-promo .upgrade-interior ul{grid-template-columns:1fr 1fr}}}.settings-container .settings-body .upgrade-promo .upgrade-interior div.button-container{text-align:right;padding:20px 0}.settings-container .settings-body .upgrade-promo .upgrade-interior div.button-container a{padding:10px;background-color:#46a4dd;border-radius:6px;color:#fff;text-decoration:none;font-weight:700;font-size:1.1em}.settings-container .settings-body .upgrade-promo .upgrade-interior a.upgrade-close{display:none;position:absolute;top:15px;right:20px}@media (max-width:64em){.settings-container .settings-body .upgrade-promo .upgrade-interior a.upgrade-close{display:block}}@media (max-width:64em){.settings-container .settings-body .upgrade-promo{order:0;margin-bottom:20px;max-width:100%}}@media (max-width:64em){.settings-container .settings-body .upgrade-promo.hide-on-mobile{display:none}}.button-warning{background:#dd9000!important;border-color:#dd9000 #b97800 #b97800!important;box-shadow:0 1px 0 #b97800!important;color:#fff!important;text-decoration:none!important;text-shadow:0 -1px 1px #b97800,1px 0 1px #b97800,0 1px 1px #b97800,-1px 0 1px #b97800!important}.media-cloud-tool-description{padding:24px;background:#ddd;border-radius:8px;margin-bottom:20px}.media-cloud-tool-description h2{font-family:system-ui,-apple-system,BlinkMacSystemFont,Avenir Next,Avenir,Segoe UI,Lucida Grande,Helvetica Neue,Helvetica,Fira Sans,Roboto,Noto,Droid Sans,Cantarell,Oxygen,Ubuntu,Franklin Gothic Medium,Century Gothic,Liberation Sans,sans-serif;text-transform:uppercase;margin:0 0 5px;padding:0}.media-cloud-tool-description p{margin-top:0;font-size:1.2em}.ilab-notification-container .notice{margin-left:0;margin-right:0;margin-bottom:10px}.ilab-notification-container .notice:last-of-type{margin-bottom:20px}.ilab-settings-section{background-color:#fafafa;padding:25px;border-radius:8px;margin-bottom:20px;overflow:hidden;border:1px solid #eaeaea}.ilab-settings-section h2{padding:10px 25px;background-color:#fff;margin:-25px -25px 0;border-bottom:1px solid #eaeaea;font-family:system-ui,-apple-system,BlinkMacSystemFont,Avenir Next,Avenir,Segoe UI,Lucida Grande,Helvetica Neue,Helvetica,Fira Sans,Roboto,Noto,Droid Sans,Cantarell,Oxygen,Ubuntu,Franklin Gothic Medium,Century Gothic,Liberation Sans,sans-serif;font-weight:700;font-size:13px;color:#50ade2!important;text-transform:uppercase;display:flex;align-items:center}.ilab-settings-section h2 a.help-beacon{margin:0 0 0 10px;padding:0;display:block;width:16px;height:16px;color:transparent;overflow:hidden;background-image:url(../img/mcloud-icon-help.svg);background-position:50%;background-size:contain;background-repeat:no-repeat}.ilab-settings-section .section-description{margin-top:20px;margin-bottom:15px;font-style:italic}.ilab-settings-section .checkbox-w-description{display:flex;align-items:center}.ilab-settings-section .checkbox-w-description label{margin-right:20px}.ilab-settings-section .checkbox-w-description>div>p{margin:0}.ilab-settings-toggle{padding:0 25px 5px}.ilab-settings-toggle table.form-table tr{display:flex;flex-direction:row;align-items:center}@media (max-width:48.9275em){.ilab-settings-toggle table.form-table tr{flex-direction:column;align-items:flex-start}}.ilab-settings-toggle table.form-table tr th{min-width:200px;max-width:200px}@media (max-width:48.9275em){.ilab-settings-toggle table.form-table tr{margin-bottom:20px}.ilab-settings-toggle table.form-table tr th{margin-bottom:10px}}.ilab-settings-features{padding:10px 25px 15px}.ilab-settings-features table.form-table tr{display:flex;flex-direction:row;align-items:center}.ilab-settings-features table.form-table tr td.toggle{display:flex;align-items:center;max-width:220px;min-width:220px}.ilab-settings-features table.form-table tr td.toggle div.title{display:flex;flex-direction:column;margin-left:30px;white-space:nowrap;font-weight:700;font-size:1.05em}.ilab-settings-features table.form-table tr td.toggle div.title div.tool-links{display:flex}.ilab-settings-features table.form-table tr td.toggle div.title div.tool-links a{margin-right:10px;margin-top:5px;font-size:.85em;font-weight:400}.ilab-settings-features table.form-table tr td.toggle div.title div.tool-links a:last-of-type{margin-right:0}.ilab-settings-features table.form-table tr td.description p{font-size:1.05em}@media (max-width:48.9275em){.ilab-settings-features table.form-table tr{flex-direction:column;align-items:flex-start;margin-bottom:30px}.ilab-settings-features table.form-table td.toggle div.title{font-size:1.2em!important}}.ilab-settings-button{margin-top:40px;display:flex;justify-content:center}.ilab-settings-button p{padding:0;margin:0}.ilab-settings-batch-tools{display:flex}.ilab-settings-batch-tools a.button{margin-right:10px}.ilab-settings-batch-tools.has-submit{padding-right:10px;margin-right:20px;border-right:1px solid #ccc}span.tool-indicator{background:#ccc;border:1px solid #979797;display:block;width:9px;height:9px;border-radius:9px;margin-right:6px}span.tool-indicator.tool-active{background:#6dd51b}span.tool-indicator.tool-env-active{background:#fdac00}div.ilab-section-doc-links{margin-top:10px}div.ilab-section-doc-links div.doc-links-setting{background-color:rgba(0,0,0,.04);width:100%;border-radius:6px;display:flex;align-items:center;justify-content:center;padding:12px 0}div.ilab-section-doc-links div.doc-links-setting a{margin:0 5px!important}.troubleshooter-info li{margin:0;padding:8px 0 8px 28px;list-style:none;background-repeat:no-repeat;background-position:left top 6px;background-size:20px}.troubleshooter-info li.info-warning{background-image:url(../img/icon-warning.svg)}.troubleshooter-info li.info-success{background-image:url(../img/icon-success.svg)}.troubleshooter-info li.info-error{background-image:url(../img/icon-error.svg)}.troubleshooter-wait{display:flex;align-items:center}.troubleshooter-wait.hidden{display:none}.troubleshooter-wait>img{margin-right:7px;height:18px}.upload-path-preview{margin:10px 0;padding:10px;font-style:italic;background-color:#fff;border:1px dashed #ddd;display:flex;line-height:1;align-items:center}.upload-path-preview span:first-of-type{text-transform:uppercase;color:#ccc;font-size:11px;font-style:normal;margin-right:10px}.subsite-setting-group{margin-bottom:20px}.subsite-setting-group:last-of-type{margin-bottom:0}.subsite-upload-path{display:flex;align-items:center}.subsite-upload-path label{min-width:100px}.presigned-url-container>div{display:flex;align-items:flex-start;margin-bottom:20px}.presigned-url-container>div:nth-of-type(2n){margin-bottom:40px}.presigned-url-container>div:last-of-type{margin-bottom:0}.presigned-url-container>div div.presigned-label{line-height:1.3;font-weight:600;margin-right:10px;margin-top:6px;min-width:175px}.privacy-container>div{display:flex;align-items:flex-start;margin-bottom:20px}.privacy-container>div:last-of-type{margin-bottom:0}.privacy-container>div div.privacy-label{line-height:1.3;font-weight:600;margin-right:10px;margin-top:6px;min-width:135px}#beacon-container iframe{z-index:200000!important}.ilab-popup{position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,.85);pointer-events:all;z-index:100002;display:flex;align-items:center;justify-content:center;transition:opacity .25s linear;opacity:1}.ilab-popup .ilab-popup-body{position:relative}.ilab-popup .ilab-popup-body .ilab-popup-contents{width:80vw;height:80vh;min-width:80vw;min-height:80vh;max-width:80vw;max-height:80vh;background-color:#fff}.ilab-popup .ilab-popup-body .ilab-popup-close{position:absolute;right:38px;top:12px;font-size:0}.ilab-popup .ilab-popup-body .ilab-popup-close:after,.ilab-popup .ilab-popup-body .ilab-popup-close:before{position:absolute;left:13px;content:" ";height:25px;width:2px;background-color:#000}.ilab-popup .ilab-popup-body .ilab-popup-close:before{transform:rotate(45deg)}.ilab-popup .ilab-popup-body .ilab-popup-close:after{transform:rotate(-45deg)}.ilab-popup.hidden{pointer-events:none;opacity:0}.mcloud-inline-help-container{position:fixed;left:0;top:0;right:0;bottom:0;z-index:100002;transition:opacity .25s linear}.mcloud-inline-help-container .mcloud-inline-help{background-color:#fff;position:absolute;width:375px;height:425px;box-shadow:0 0 10px 1px rgba(0,0,0,.25);border-radius:8px;transform-origin:left center;transition:transform .25s ease-out}.mcloud-inline-help-container .mcloud-inline-help .mcloud-inline-help-arrow{right:100%;top:50%;content:" ";height:0;width:0;position:absolute;pointer-events:none;border:10px solid hsla(0,0%,100%,0);border-right-color:#fff;margin-top:-10px}.mcloud-inline-help-container .mcloud-inline-help .mcloud-inline-help-body{box-sizing:border-box;position:absolute;left:15px;top:15px;right:7.5px;bottom:15px;padding-right:15px;overflow:auto}.mcloud-inline-help-container.mcloud-invisible{opacity:0;pointer-events:none}.mcloud-inline-help-container.mcloud-invisible .mcloud-inline-help{transform:scale(.8)}.mcloud-sidebar-help-container{position:fixed;left:0;top:0;right:0;bottom:0;z-index:1000001}.mcloud-sidebar-help-container .mcloud-sidebar-help{position:absolute;right:0;top:0;bottom:0;width:450px;transition:transform .25s linear;background-color:#fff;box-shadow:0 0 10px 1px rgba(0,0,0,.25)}.mcloud-sidebar-help-container .mcloud-sidebar-help .mcloud-sidebar-help-body{box-sizing:border-box;position:absolute;left:15px;top:0;right:7.5px;bottom:0;padding-top:15px;padding-right:22.5px;overflow:auto}.mcloud-sidebar-help-container .mcloud-sidebar-help .mcloud-sidebar-help-body figure{margin-left:0;margin-right:0;padding-left:0;padding-right:0}.mcloud-sidebar-help-container .mcloud-sidebar-help .mcloud-sidebar-help-body figure img{width:100%;height:auto}.mcloud-sidebar-help-container .mcloud-sidebar-help .mcloud-sidebar-help-body div.code-block{overflow-x:auto}.mcloud-sidebar-help-container .mcloud-sidebar-help .mcloud-sidebar-close{display:block;position:absolute;right:10px;top:10px;font-size:0;line-height:0;width:14px;height:14px}.mcloud-sidebar-help-container .mcloud-sidebar-help .mcloud-sidebar-close:before{position:absolute;content:"";width:14px;height:2px;background-color:#aaa;transform:translateX(-50%) rotate(-45deg);left:50%;top:50%}.mcloud-sidebar-help-container .mcloud-sidebar-help .mcloud-sidebar-close:after{position:absolute;content:"";width:14px;height:2px;background-color:#aaa;transform:translateX(-50%) rotate(45deg);left:50%;top:50%}.mcloud-sidebar-help-container.mcloud-invisible{pointer-events:none}.mcloud-sidebar-help-container.mcloud-invisible .mcloud-sidebar-help{transform:translateX(100%)}body.modal-open #beacon-container{display:none!important}.BeaconContainer{right:10px!important;bottom:88px!important}.BeaconFabButtonFrame{right:10px!important;bottom:10px!important}.section-jumps{display:flex;align-items:center;justify-content:center;margin-top:30px;margin-bottom:35px}.section-jumps span.label{color:#777;text-decoration:none;text-transform:uppercase;font-weight:700;font-size:10px;margin-right:20px;margin-top:2px}.section-jumps a,.section-jumps span.label{display:block;line-height:1}.section-jumps span.sep{margin-left:10px;margin-right:10px;color:#777;font-weight:700;font-size:11px}.section-submit{display:flex;justify-content:center;border:1px solid #eaeaea;background-color:rgba(0,0,0,.04);width:100%;border-radius:6px;align-items:center;padding:12px 0;margin-top:20px}.section-submit p{margin:0;padding:0}.wizard-container{position:fixed;left:0;top:0;width:100%;height:100%;background-color:#000;z-index:100000;display:flex;align-items:center;justify-content:center;overflow:hidden;transition:opacity .333s linear}.wizard-container *{font-family:SF Pro Text,SFProText,system-ui,-apple-system,BlinkMacSystemFont,Avenir Next,Avenir,Segoe UI,Lucida Grande,Helvetica Neue,Helvetica,Fira Sans,Roboto,Noto,Droid Sans,Cantarell,Oxygen,Ubuntu,Franklin Gothic Medium,Century Gothic,Liberation Sans,sans-serif}.wizard-container a{text-decoration:none}.wizard-container a:focus{outline:none;box-shadow:none}.wizard-container .wizard-modal{position:relative;width:87.8048780488vw;height:51.2195121951vw;transition:transform .333s linear,opacity .333s linear}@media (min-width:102.5em){.wizard-container .wizard-modal{width:1440px}}@media (max-width:48.9275em){.wizard-container .wizard-modal{width:94.5083014049vw}}@media (min-width:102.5em){.wizard-container .wizard-modal{height:840px}}@media (max-width:48.9275em){.wizard-container .wizard-modal{height:81.7369093231vw}}.wizard-container .wizard-modal div.steps-background{position:absolute;left:calc(100% - 320px);top:-100vh;width:100vw;height:300vh;background-color:rgba(58,86,116,.5);transition:transform .25s linear,opacity .25s linear}@media (max-width:48.9275em){.wizard-container .wizard-modal div.steps-background{left:calc(100% - 26.81992vw)}}@media (min-width:48.9375em) and (max-width:102.49em){.wizard-container .wizard-modal div.steps-background{left:calc(100% - 19.5122vw)}}.wizard-container .wizard-modal a.close-modal{position:absolute;left:.6097560976vw;top:.6097560976vw;width:1.7073170732vw;height:1.7073170732vw;background-image:url(../img/wizard-close-modal.svg);background-position:50%;background-repeat:no-repeat;background-size:contain;font-size:0;line-height:0}@media (min-width:102.5em){.wizard-container .wizard-modal a.close-modal{left:10px}}@media (max-width:48.9275em){.wizard-container .wizard-modal a.close-modal{left:1.2771392082vw}}@media (min-width:102.5em){.wizard-container .wizard-modal a.close-modal{top:10px}}@media (max-width:48.9275em){.wizard-container .wizard-modal a.close-modal{top:1.2771392082vw}}@media (min-width:102.5em){.wizard-container .wizard-modal a.close-modal{width:28px}}@media (max-width:48.9275em){.wizard-container .wizard-modal a.close-modal{width:3.5759897829vw}}@media (min-width:102.5em){.wizard-container .wizard-modal a.close-modal{height:28px}}@media (max-width:48.9275em){.wizard-container .wizard-modal a.close-modal{height:3.5759897829vw}}.wizard-content{position:absolute;left:0;top:0;right:0;bottom:0;font-size:.9756097561vw;border-radius:.7317073171vw;overflow:hidden;background-color:#fff;display:flex;flex-direction:column}@media (min-width:102.5em){.wizard-content{font-size:16px}}@media (max-width:48.9275em){.wizard-content{font-size:1.7879948914vw}}@media (min-width:102.5em){.wizard-content{border-radius:12px}}@media (max-width:48.9275em){.wizard-content{border-radius:1.5325670498vw}}.wizard-content div.sections{flex:1;position:relative;overflow:hidden}.wizard-content div.sections div.wizard-section{position:absolute;left:0;right:0;top:0;bottom:0;transform:translateX(87.8048780488vw);transition:transform .25s linear,opacity .25s linear,filter .25s linear,-webkit-filter .25s linear;overflow-x:hidden;opacity:0}.wizard-content div.sections div.wizard-section.current{opacity:1;transform:translateX(0)}.wizard-content div.sections div.wizard-section.past{transform:translateX(-87.8048780488vw)}@media (min-width:102.5em){.wizard-content div.sections div.wizard-section{transform:translateX(1440px)}.wizard-content div.sections div.wizard-section.past{transform:translateX(-1440px)}}.wizard-content div.sections div.wizard-section div.wizard-step{position:absolute;left:0;right:0;top:0;bottom:0;transform:translateX(100%);transition:transform .25s linear,opacity .25s linear;opacity:0}.wizard-content div.sections div.wizard-section div.wizard-step.current{opacity:1;transform:translateX(0)}.wizard-content div.sections div.wizard-section div.wizard-step.past{transform:translateX(-100%)}.wizard-content div.sections div.wizard-section[data-display-steps=true]{max-width:68.29268vw}@media (max-width:48.9275em){.wizard-content div.sections div.wizard-section[data-display-steps=true]{max-width:67.68838vw}}@media (min-width:102.5em){.wizard-content div.sections div.wizard-section[data-display-steps=true]{max-width:1120px}}.wizard-content div.sections div.wizard-section.section-tutorial[data-display-steps=true]{max-width:66.46341vw}@media (max-width:48.9275em){.wizard-content div.sections div.wizard-section.section-tutorial[data-display-steps=true]{max-width:61.30268vw}}@media (min-width:102.5em){.wizard-content div.sections div.wizard-section.section-tutorial[data-display-steps=true]{max-width:1090px}}.wizard-content div.steps{position:absolute;right:0;top:0;bottom:0;width:19.512195122vw;background-color:#3a5674;padding-top:2.9268292683vw;background-image:url(../img/wizard-steps-bg.svg);background-repeat:no-repeat;background-position:bottom;background-size:19.512195122vw;transition:transform .25s linear,opacity .25s linear}@media (min-width:102.5em){.wizard-content div.steps{width:320px}}@media (max-width:48.9275em){.wizard-content div.steps{width:26.8199233716vw}}@media (min-width:102.5em){.wizard-content div.steps{padding-top:48px}}@media (max-width:48.9275em){.wizard-content div.steps{padding-top:4.0868454662vw}}@media (min-width:102.5em){.wizard-content div.steps{background-size:320px}}@media (max-width:48.9275em){.wizard-content div.steps{background-size:26.8199233716vw}}.wizard-content div.steps ul{padding:0;margin:0}.wizard-content div.steps ul li{display:flex;align-items:flex-start;margin:0 0 2.9268292683vw;padding:0 1.4634146341vw 0 0;perspective:1000px}@media (min-width:102.5em){.wizard-content div.steps ul li{margin-bottom:48px}}@media (max-width:48.9275em){.wizard-content div.steps ul li{margin-bottom:3.0651340996vw}}@media (min-width:102.5em){.wizard-content div.steps ul li{padding-right:24px}}@media (max-width:48.9275em){.wizard-content div.steps ul li{padding-right:1.5325670498vw}}.wizard-content div.steps ul li input[type=checkbox]{display:none}.wizard-content div.steps ul li div.step-number{position:relative;width:3.9024390244vw;min-width:3.9024390244vw;max-width:3.9024390244vw;height:3.9024390244vw;min-height:3.9024390244vw;max-height:3.9024390244vw;margin-top:-.487804878vw;display:flex;align-items:center;justify-content:center;transform:translateX(-50%);transform-style:preserve-3d;transition:transform .5s linear}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number{width:64px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number{width:8.1736909323vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number{min-width:64px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number{min-width:8.1736909323vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number{max-width:64px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number{max-width:8.1736909323vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number{height:64px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number{height:8.1736909323vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number{min-height:64px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number{min-height:8.1736909323vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number{max-height:64px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number{max-height:8.1736909323vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number{margin-top:-8px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number{margin-top:-1.0217113665vw}}.wizard-content div.steps ul li div.step-number span{position:absolute;left:.487804878vw;top:.487804878vw;width:2.9268292683vw;min-width:2.9268292683vw;max-width:2.9268292683vw;height:2.9268292683vw;min-height:2.9268292683vw;max-height:2.9268292683vw;border-radius:2.9268292683vw;border:.0609756098vw solid #e6e6e6;background-color:#fff;color:#50ade2;display:flex;align-items:center;justify-content:center;transition:border-width .25s linear,border-color .25s linear,transform .25s linear;-webkit-backface-visibility:hidden;backface-visibility:hidden}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number span{left:8px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number span{left:1.0217113665vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number span{top:8px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number span{top:1.0217113665vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number span{width:48px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number span{width:6.1302681992vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number span{min-width:48px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number span{min-width:6.1302681992vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number span{max-width:48px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number span{max-width:6.1302681992vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number span{height:48px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number span{height:6.1302681992vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number span{min-height:48px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number span{min-height:6.1302681992vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number span{max-height:48px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number span{max-height:6.1302681992vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number span{border-radius:48px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number span{border-radius:6.1302681992vw}}.wizard-content div.steps ul li div.step-number span.back{transform:rotateY(180deg)}.wizard-content div.steps ul li div.step-number span.back img{width:.9756097561vw;min-width:.9756097561vw;max-width:.9756097561vw;height:auto}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number span.back img{width:16px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number span.back img{width:2.0434227331vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number span.back img{min-width:16px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number span.back img{min-width:2.0434227331vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number span.back img{max-width:16px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number span.back img{max-width:2.0434227331vw}}.wizard-content div.steps ul li.current div.step-number span{background:linear-gradient(135.29deg,#62c5f1 7.95%,#50ade2 101.07%);color:#fff;border:.487804878vw solid #fff;transform:translate(-12.5%,-12.5%)}.wizard-content div.steps ul li.current div.step-number span.back{transform:translate(-12.5%,-12.5%) rotateY(180deg)}@media (min-width:102.5em){.wizard-content div.steps ul li.current div.step-number span{border:8px solid #fff}}.wizard-content div.steps ul li.current div.description h3{color:#fff}.wizard-content div.steps ul li.complete div.step-number{transform:translateX(-50%) rotateY(180deg)}.wizard-content div.steps ul li.complete div.step-number span{background:linear-gradient(135.29deg,#62c5f1 7.95%,#50ade2 101.07%);color:#fff;border:0 solid hsla(0,0%,100%,0)}.wizard-content div.steps ul li div.description{margin-left:-.487804878vw}@media (min-width:102.5em){.wizard-content div.steps ul li div.description{margin-left:-8px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.description{margin-left:-2.5542784163vw}}.wizard-content div.steps ul li div.description h3{padding:0;color:hsla(0,0%,100%,.5);font-weight:700;font-size:1em;line-height:1.5em;margin:.7317073171vw 0 .487804878vw;transition:margin-top .25s linear}@media (min-width:102.5em){.wizard-content div.steps ul li div.description h3{margin-top:12px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.description h3{margin-top:1.5325670498vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.description h3{margin-bottom:8px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.description h3{margin-bottom:1.0217113665vw}}.wizard-content div.steps ul li div.description div.description-container{max-height:0;overflow:hidden;transition:max-height .25s linear}.wizard-content div.steps ul li div.description div.description-container p{opacity:0;margin:0;padding:0;font-size:.875em;color:hsla(0,0%,100%,.7);line-height:1.5em;transition:opacity .25s linear}.wizard-content div.steps ul li input[type=checkbox]:checked+div.description h3{margin-top:0}.wizard-content div.steps ul li input[type=checkbox]:checked+div.description div.description-container{max-height:8.5365853659vw}@media (min-width:102.5em){.wizard-content div.steps ul li input[type=checkbox]:checked+div.description div.description-container{max-height:140px}}@media (max-width:48.9275em){.wizard-content div.steps ul li input[type=checkbox]:checked+div.description div.description-container{max-height:17.8799489144vw}}.wizard-content div.steps ul li input[type=checkbox]:checked+div.description div.description-container p{opacity:1}.wizard-content footer{display:flex;height:5.8536585366vw;margin-right:19.512195122vw;padding:0 7.3170731707vw;align-items:center;justify-content:space-between;border-top:1px solid #e6e6e6;transition:margin-right .25s linear}@media (min-width:102.5em){.wizard-content footer{height:96px}}@media (max-width:48.9275em){.wizard-content footer{height:12.2605363985vw}}@media (min-width:102.5em){.wizard-content footer{margin-right:320px}}@media (max-width:48.9275em){.wizard-content footer{margin-right:26.8199233716vw}}@media (min-width:102.5em){.wizard-content footer{padding-bottom:0}}@media (max-width:48.9275em){.wizard-content footer{padding-bottom:0}}@media (min-width:102.5em){.wizard-content footer{padding-top:0}}@media (max-width:48.9275em){.wizard-content footer{padding-top:0}}@media (min-width:102.5em){.wizard-content footer{padding-left:120px}}@media (max-width:48.9275em){.wizard-content footer{padding-left:7.662835249vw}}@media (min-width:102.5em){.wizard-content footer{padding-right:120px}}@media (max-width:48.9275em){.wizard-content footer{padding-right:7.662835249vw}}.wizard-content footer img.logo{width:3.9024390244vw;height:auto}@media (min-width:102.5em){.wizard-content footer img.logo{width:64px}}@media (max-width:48.9275em){.wizard-content footer img.logo{width:8.1736909323vw}}.wizard-content footer a{font-style:normal;font-weight:500;font-size:1em;display:flex;align-items:center;justify-content:center;letter-spacing:.0457317073vw;text-transform:uppercase;text-decoration:none;color:#50abe0;transition:opacity .25s linear,background .25s linear}@media (min-width:102.5em){.wizard-content footer a{letter-spacing:.75px}}@media (max-width:48.9275em){.wizard-content footer a{letter-spacing:.0957854406vw}}.wizard-content footer a.disabled{color:#b3b3b3;pointer-events:none}.wizard-content footer a.invisible{opacity:0;pointer-events:none}.wizard-content footer nav{display:flex}.wizard-content footer nav a{margin-left:.6097560976vw;padding:.9146341463vw 2.1341463415vw}@media (min-width:102.5em){.wizard-content footer nav a{margin-left:10px}}@media (max-width:48.9275em){.wizard-content footer nav a{margin-left:1.2771392082vw}}@media (min-width:102.5em){.wizard-content footer nav a{padding-bottom:15px}}@media (max-width:48.9275em){.wizard-content footer nav a{padding-bottom:1.1494252874vw}}@media (min-width:102.5em){.wizard-content footer nav a{padding-top:15px}}@media (max-width:48.9275em){.wizard-content footer nav a{padding-top:1.1494252874vw}}@media (min-width:102.5em){.wizard-content footer nav a{padding-left:35px}}@media (max-width:48.9275em){.wizard-content footer nav a{padding-left:3.0651340996vw}}@media (min-width:102.5em){.wizard-content footer nav a{padding-right:35px}}@media (max-width:48.9275em){.wizard-content footer nav a{padding-right:3.0651340996vw}}.wizard-content footer nav a.hidden{display:none}.wizard-content footer nav a.next,.wizard-content footer nav a.return{color:#fff;border-radius:6.0975609756vw;background:linear-gradient(180deg,#62c5f1,#50ade2)}@media (min-width:102.5em){.wizard-content footer nav a.next,.wizard-content footer nav a.return{border-radius:100px}}@media (max-width:48.9275em){.wizard-content footer nav a.next,.wizard-content footer nav a.return{border-radius:6.3856960409vw}}.wizard-content footer nav a.next.disabled,.wizard-content footer nav a.return.disabled{background:linear-gradient(180deg,#f0f0f0,#e0e0e0)}.wizard-step{padding:0 7.3170731707vw;display:flex;flex-direction:column;justify-content:center;flex:1}@media (min-width:102.5em){.wizard-step{padding-bottom:0}}@media (max-width:48.9275em){.wizard-step{padding-bottom:0}}@media (min-width:102.5em){.wizard-step{padding-top:0}}@media (max-width:48.9275em){.wizard-step{padding-top:0}}@media (min-width:102.5em){.wizard-step{padding-left:120px}}@media (max-width:48.9275em){.wizard-step{padding-left:7.662835249vw}}@media (min-width:102.5em){.wizard-step{padding-right:120px}}@media (max-width:48.9275em){.wizard-step{padding-right:7.662835249vw}}.wizard-step .intro{margin-bottom:3.6585365854vw}.wizard-step .intro h1{line-height:1.2;margin-bottom:2.4390243902vw}@media (min-width:102.5em){.wizard-step .intro h1{margin-bottom:40px}}@media (max-width:48.9275em){.wizard-step .intro h1{margin-bottom:2.5542784163vw}}@media (min-width:102.5em){.wizard-step .intro{margin-bottom:60px}}@media (max-width:48.9275em){.wizard-step .intro{margin-bottom:3.8314176245vw}}.wizard-step .intro p{padding:0;margin:0 0 1.0975609756vw;font-size:1.125em;text-align:left}@media (min-width:102.5em){.wizard-step .intro p{margin-bottom:18px}}@media (max-width:48.9275em){.wizard-step .intro p{margin-bottom:1.1494252874vw}}.wizard-step .intro p:last-of-type{margin-bottom:0}div.wizard-section.section-tutorial[data-display-steps=true] .wizard-step-tutorial{padding:0 5.487804878vw 0 7.3170731707vw}@media (min-width:102.5em){div.wizard-section.section-tutorial[data-display-steps=true] .wizard-step-tutorial{padding-left:120px}}@media (max-width:48.9275em){div.wizard-section.section-tutorial[data-display-steps=true] .wizard-step-tutorial{padding-left:7.662835249vw}}@media (min-width:102.5em){div.wizard-section.section-tutorial[data-display-steps=true] .wizard-step-tutorial{padding-top:0}}@media (max-width:48.9275em){div.wizard-section.section-tutorial[data-display-steps=true] .wizard-step-tutorial{padding-top:0}}@media (min-width:102.5em){div.wizard-section.section-tutorial[data-display-steps=true] .wizard-step-tutorial{padding-right:90px}}@media (max-width:48.9275em){div.wizard-section.section-tutorial[data-display-steps=true] .wizard-step-tutorial{padding-right:0}}@media (min-width:102.5em){div.wizard-section.section-tutorial[data-display-steps=true] .wizard-step-tutorial{padding-bottom:0}}@media (max-width:48.9275em){div.wizard-section.section-tutorial[data-display-steps=true] .wizard-step-tutorial{padding-bottom:0}}.wizard-step-select div.step-contents{margin-bottom:2.4390243902vw}@media (min-width:102.5em){.wizard-step-select div.step-contents{margin-bottom:40px}}@media (max-width:48.9275em){.wizard-step-select div.step-contents{margin-bottom:2.5542784163vw}}.wizard-step-select div.step-contents:last-of-type{margin-bottom:0}.wizard-step-select .intro{text-align:center}.wizard-step-select ul{display:flex;flex-wrap:wrap;padding:0;margin:0;justify-content:center;align-items:center}.wizard-step-select ul li{position:relative;display:block;padding:0;margin:1.8292682927vw 2.4390243902vw}@media (min-width:102.5em){.wizard-step-select ul li{margin-top:30px}}@media (max-width:48.9275em){.wizard-step-select ul li{margin-top:1.9157088123vw}}@media (min-width:102.5em){.wizard-step-select ul li{margin-bottom:30px}}@media (max-width:48.9275em){.wizard-step-select ul li{margin-bottom:1.9157088123vw}}@media (min-width:102.5em){.wizard-step-select ul li{margin-left:40px}}@media (max-width:48.9275em){.wizard-step-select ul li{margin-left:5.1085568327vw}}@media (min-width:102.5em){.wizard-step-select ul li{margin-right:40px}}@media (max-width:48.9275em){.wizard-step-select ul li{margin-right:5.1085568327vw}}.wizard-step-select ul li div.description{position:absolute;left:50%;transform:translate(-50%,24px) scale(.7);bottom:calc(100% + 30px);padding:1.4634146341vw;background-color:#3a5674;color:#fff;width:17.6829268293vw;display:flex;flex-direction:column;align-items:center;justify-content:center;border-radius:10px;box-shadow:0 0 10px 1px rgba(0,0,0,.25);opacity:0;pointer-events:none;transition:transform .125s linear,opacity .125s linear}@media (min-width:102.5em){.wizard-step-select ul li div.description{padding:24px}}@media (max-width:48.9275em){.wizard-step-select ul li div.description{padding:1.5325670498vw}}@media (min-width:102.5em){.wizard-step-select ul li div.description{width:290px}}@media (max-width:48.9275em){.wizard-step-select ul li div.description{width:32.5670498084vw}}.wizard-step-select ul li div.description div.arrow-down{position:absolute;bottom:-13px;width:0;height:0;left:calc(50% - 14px);border-left:14px solid transparent;border-right:14px solid transparent;border-top:14px solid #3a5674}.wizard-step-select ul li:hover div.description{opacity:1;transform:translate(-50%) scale(1)}ul.options.select-icons li:hover a img{transform:scale(1.2)}ul.options.select-icons li a{font-size:0}ul.options.select-icons li a img{transition:transform .2s linear;height:2.9268292683vw;width:auto}@media (min-width:102.5em){ul.options.select-icons li a img{height:48px}}@media (max-width:48.9275em){ul.options.select-icons li a img{height:3.0651340996vw}}ul.options.select-icons li a.select-s3 img{height:3.6585365854vw}@media (min-width:102.5em){ul.options.select-icons li a.select-s3 img{height:60px}}@media (max-width:48.9275em){ul.options.select-icons li a.select-s3 img{height:3.8314176245vw}}ul.options.select-buttons li{margin:1.8292682927vw .9146341463vw}@media (min-width:102.5em){ul.options.select-buttons li{margin-top:30px}}@media (max-width:48.9275em){ul.options.select-buttons li{margin-top:1.9157088123vw}}@media (min-width:102.5em){ul.options.select-buttons li{margin-bottom:30px}}@media (max-width:48.9275em){ul.options.select-buttons li{margin-bottom:1.9157088123vw}}@media (min-width:102.5em){ul.options.select-buttons li{margin-left:15px}}@media (max-width:48.9275em){ul.options.select-buttons li{margin-left:1.0217113665vw}}@media (min-width:102.5em){ul.options.select-buttons li{margin-right:15px}}@media (max-width:48.9275em){ul.options.select-buttons li{margin-right:1.0217113665vw}}ul.options.select-buttons li a{font-style:normal;font-weight:500;font-size:1em;display:flex;align-items:center;justify-content:center;letter-spacing:.0457317073vw;text-transform:uppercase;text-decoration:none;color:#fff;border-radius:6.0975609756vw;padding:.9146341463vw 2.1341463415vw;background:linear-gradient(180deg,#62c5f1,#50ade2)}@media (min-width:102.5em){ul.options.select-buttons li a{letter-spacing:.75px;padding:15px 35px}}ul.options.select-flat-buttons li{margin:1.8292682927vw .9146341463vw}@media (min-width:102.5em){ul.options.select-flat-buttons li{margin-top:30px}}@media (max-width:48.9275em){ul.options.select-flat-buttons li{margin-top:1.9157088123vw}}@media (min-width:102.5em){ul.options.select-flat-buttons li{margin-bottom:30px}}@media (max-width:48.9275em){ul.options.select-flat-buttons li{margin-bottom:1.9157088123vw}}@media (min-width:102.5em){ul.options.select-flat-buttons li{margin-left:15px}}@media (max-width:48.9275em){ul.options.select-flat-buttons li{margin-left:1.0217113665vw}}@media (min-width:102.5em){ul.options.select-flat-buttons li{margin-right:15px}}@media (max-width:48.9275em){ul.options.select-flat-buttons li{margin-right:1.0217113665vw}}ul.options.select-flat-buttons li a{font-style:normal;font-weight:500;font-size:1.5em;letter-spacing:.0457317073vw;text-transform:uppercase;text-decoration:none;border-bottom:1px dotted #50ade2;color:#50ade2}@media (min-width:102.5em){ul.options.select-flat-buttons li a{letter-spacing:.75px}}.wizard-step-video{padding:0}.wizard-step-video .step-contents .video,.wizard-step-video .step-contents .video iframe{position:absolute;top:0;left:0;width:100%;height:100%}@-webkit-keyframes logo-rotate{0%{transform:rotateY(0deg)}to{transform:rotateY(-1turn)}}@keyframes logo-rotate{0%{transform:rotateY(0deg)}to{transform:rotateY(-1turn)}}@-webkit-keyframes logo-rotate-x{0%{transform:rotateX(0deg)}to{transform:rotateX(-1turn)}}@keyframes logo-rotate-x{0%{transform:rotateX(0deg)}to{transform:rotateX(-1turn)}}@-webkit-keyframes logo-rotate-z{0%{transform:rotate(-1turn)}to{transform:rotate(0deg)}}@keyframes logo-rotate-z{0%{transform:rotate(-1turn)}to{transform:rotate(0deg)}}.wizard-step-form div.intro{margin-bottom:1.8292682927vw}@media (min-width:102.5em){.wizard-step-form div.intro{margin-bottom:30px}}@media (max-width:48.9275em){.wizard-step-form div.intro{margin-bottom:1.9157088123vw}}.wizard-step-form form{display:flex;flex-direction:column}.wizard-step-form form div.form-field{display:flex;flex-direction:column;border:1px solid #f3f3f3;background-color:#f3f3f3;padding:1.2195121951vw;border-radius:.9756097561vw;margin-bottom:1.2195121951vw}@media (min-width:102.5em){.wizard-step-form form div.form-field{padding:20px}}@media (max-width:48.9275em){.wizard-step-form form div.form-field{padding:1.2771392082vw}}@media (min-width:102.5em){.wizard-step-form form div.form-field{border-radius:16px}}@media (max-width:48.9275em){.wizard-step-form form div.form-field{border-radius:1.0217113665vw}}@media (min-width:102.5em){.wizard-step-form form div.form-field{margin-bottom:20px}}@media (max-width:48.9275em){.wizard-step-form form div.form-field{margin-bottom:1.2771392082vw}}.wizard-step-form form div.form-field:last-of-type{margin-bottom:0}.wizard-step-form form div.form-field:focus-within{border:1px solid #50ade2}.wizard-step-form form div.form-field label{font-weight:500;font-size:.75em;line-height:1em;text-transform:uppercase;color:#3a5674;margin-bottom:.487804878vw}@media (min-width:102.5em){.wizard-step-form form div.form-field label{margin-bottom:8px}}@media (max-width:48.9275em){.wizard-step-form form div.form-field label{margin-bottom:.5108556833vw}}.wizard-step-form form div.form-field input[type=password],.wizard-step-form form div.form-field input[type=text]{box-shadow:none;padding:0;border:0;background:none;font-size:1.125em}.wizard-step-form form div.form-field input[type=password]::-webkit-input-placeholder,.wizard-step-form form div.form-field input[type=text]::-webkit-input-placeholder{color:rgba(0,0,0,.125)}.wizard-step-form form div.form-field input[type=password]::-moz-placeholder,.wizard-step-form form div.form-field input[type=text]::-moz-placeholder{color:rgba(0,0,0,.125)}.wizard-step-form form div.form-field input[type=password]:-ms-input-placeholder,.wizard-step-form form div.form-field input[type=text]:-ms-input-placeholder{color:rgba(0,0,0,.125)}.wizard-step-form form div.form-field input[type=password]::-ms-input-placeholder,.wizard-step-form form div.form-field input[type=text]::-ms-input-placeholder{color:rgba(0,0,0,.125)}.wizard-step-form form div.form-field input[type=password]::placeholder,.wizard-step-form form div.form-field input[type=text]::placeholder{color:rgba(0,0,0,.125)}.wizard-step-form form div.form-field select{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:0;padding:0;background:transparent;outline:0;font-size:1.125em}.wizard-step-form form div.form-field select:focus{outline:0}.wizard-step-form form div.form-field.field-checkbox{background:none;flex-direction:row;align-items:flex-start;padding:1.2195121951vw 0;border:1px solid #fff}@media (min-width:102.5em){.wizard-step-form form div.form-field.field-checkbox{padding-bottom:20px}}@media (max-width:48.9275em){.wizard-step-form form div.form-field.field-checkbox{padding-bottom:1.2771392082vw}}@media (min-width:102.5em){.wizard-step-form form div.form-field.field-checkbox{padding-top:20px}}@media (max-width:48.9275em){.wizard-step-form form div.form-field.field-checkbox{padding-top:1.2771392082vw}}@media (min-width:102.5em){.wizard-step-form form div.form-field.field-checkbox{padding-left:0}}@media (max-width:48.9275em){.wizard-step-form form div.form-field.field-checkbox{padding-left:0}}@media (min-width:102.5em){.wizard-step-form form div.form-field.field-checkbox{padding-right:0}}@media (max-width:48.9275em){.wizard-step-form form div.form-field.field-checkbox{padding-right:0}}.wizard-step-form form div.form-field.field-checkbox div.checkbox{margin-right:1.2195121951vw}@media (min-width:102.5em){.wizard-step-form form div.form-field.field-checkbox div.checkbox{margin-right:20px}}@media (max-width:48.9275em){.wizard-step-form form div.form-field.field-checkbox div.checkbox{margin-right:1.2771392082vw}}.wizard-step-form form div.form-field.field-checkbox div.title{padding-top:.3048780488vw;margin-right:1.2195121951vw;white-space:nowrap;font-size:1em;font-weight:500}@media (min-width:102.5em){.wizard-step-form form div.form-field.field-checkbox div.title{padding-top:5px}}@media (max-width:48.9275em){.wizard-step-form form div.form-field.field-checkbox div.title{padding-top:.6385696041vw}}@media (min-width:102.5em){.wizard-step-form form div.form-field.field-checkbox div.title{margin-right:20px}}@media (max-width:48.9275em){.wizard-step-form form div.form-field.field-checkbox div.title{margin-right:1.2771392082vw}}.wizard-step-form form div.form-field.field-checkbox div.description{padding-top:.3048780488vw;font-size:1em;font-weight:300}@media (min-width:102.5em){.wizard-step-form form div.form-field.field-checkbox div.description{padding-top:5px}}@media (max-width:48.9275em){.wizard-step-form form div.form-field.field-checkbox div.description{padding-top:.6385696041vw;display:none}}.wizard-step-form .progress{position:absolute;left:0;right:0;bottom:0;top:0;display:flex;flex-direction:column;align-items:center;justify-content:center;opacity:0;pointer-events:none;transition:opacity .25s linear;perspective:100em}.wizard-step-form .progress h3{color:#50abe0;margin-bottom:3.0487804878vw;font-size:1.625em}@media (min-width:102.5em){.wizard-step-form .progress h3{margin-bottom:50px}}.wizard-step-form .progress div.logo-spinner{-webkit-animation:logo-rotate 2s;animation:logo-rotate 2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:linear;animation-timing-function:linear}.wizard-step-form .progress div.logo-spinner img{width:7.3170731707vw;height:auto}@media (min-width:102.5em){.wizard-step-form .progress div.logo-spinner img{width:120px}}.wizard-step-form.processing .progress{opacity:1}.wizard-step-form.processing div.step-contents{-webkit-filter:blur(5px);filter:blur(5px)}.wizard-step-test{justify-content:flex-start}.wizard-step-test div.step-contents{margin-top:3.0487804878vw}@media (min-width:102.5em){.wizard-step-test div.step-contents{margin-top:50px}}@media (max-width:48.9275em){.wizard-step-test div.step-contents{margin-top:6.3856960409vw}}.wizard-step-test div.step-contents div.intro{margin-bottom:1.8292682927vw}@media (min-width:102.5em){.wizard-step-test div.step-contents div.intro{margin-bottom:30px}}@media (max-width:48.9275em){.wizard-step-test div.step-contents div.intro{margin-bottom:1.9157088123vw}}.wizard-step-test div.step-contents div.start-buttons{display:flex;justify-content:center;margin-bottom:1.8292682927vw}@media (max-width:48.9275em){.wizard-step-test div.step-contents div.start-buttons{margin-bottom:1.9157088123vw}}.wizard-step-test div.step-contents div.start-buttons a{font-style:normal;font-weight:500;font-size:1em;display:flex;align-items:center;justify-content:center;letter-spacing:.0457317073vw;text-transform:uppercase;text-decoration:none;color:#fff;border-radius:6.0975609756vw;padding:.9146341463vw 2.1341463415vw;background:linear-gradient(180deg,#62c5f1,#50ade2)}@media (min-width:102.5em){.wizard-step-test div.step-contents div.start-buttons a{letter-spacing:.75px;padding:15px 35px}}@media (min-width:102.5em){.wizard-step-test div.step-contents div.start-buttons{margin-bottom:30px}}.wizard-step-test div.step-contents ul.tests>li{border:1px solid #f3f3f3;background-color:#f3f3f3;border-radius:.9756097561vw;padding:1.2195121951vw;margin-bottom:20xp;display:flex;transition:opacity .25s linear}@media (min-width:102.5em){.wizard-step-test div.step-contents ul.tests>li{border-radius:16px}}@media (max-width:48.9275em){.wizard-step-test div.step-contents ul.tests>li{border-radius:1.0217113665vw}}@media (min-width:102.5em){.wizard-step-test div.step-contents ul.tests>li{padding:20px}}@media (max-width:48.9275em){.wizard-step-test div.step-contents ul.tests>li{padding:1.2771392082vw}}@media (min-width:102.5em){.wizard-step-test div.step-contents ul.tests>li{margin-bottom:20xp}}@media (max-width:48.9275em){.wizard-step-test div.step-contents ul.tests>li{margin-bottom:1.2771392082vw}}.wizard-step-test div.step-contents ul.tests>li.hidden{opacity:0}.wizard-step-test div.step-contents ul.tests>li div.icon{width:1.4634146341vw;min-width:1.4634146341vw;max-width:1.4634146341vw;height:1.4634146341vw;min-height:1.4634146341vw;max-height:1.4634146341vw;display:flex;justify-content:center;align-items:center;margin-right:.6097560976vw}@media (min-width:102.5em){.wizard-step-test div.step-contents ul.tests>li div.icon{width:24px}}@media (max-width:48.9275em){.wizard-step-test div.step-contents ul.tests>li div.icon{width:3.0651340996vw}}@media (min-width:102.5em){.wizard-step-test div.step-contents ul.tests>li div.icon{min-width:24px}}@media (max-width:48.9275em){.wizard-step-test div.step-contents ul.tests>li div.icon{min-width:3.0651340996vw}}@media (min-width:102.5em){.wizard-step-test div.step-contents ul.tests>li div.icon{max-width:24px}}@media (max-width:48.9275em){.wizard-step-test div.step-contents ul.tests>li div.icon{max-width:3.0651340996vw}}@media (min-width:102.5em){.wizard-step-test div.step-contents ul.tests>li div.icon{height:24px}}@media (max-width:48.9275em){.wizard-step-test div.step-contents ul.tests>li div.icon{height:3.0651340996vw}}@media (min-width:102.5em){.wizard-step-test div.step-contents ul.tests>li div.icon{min-height:24px}}@media (max-width:48.9275em){.wizard-step-test div.step-contents ul.tests>li div.icon{min-height:3.0651340996vw}}@media (min-width:102.5em){.wizard-step-test div.step-contents ul.tests>li div.icon{max-height:24px}}@media (max-width:48.9275em){.wizard-step-test div.step-contents ul.tests>li div.icon{max-height:3.0651340996vw}}@media (min-width:102.5em){.wizard-step-test div.step-contents ul.tests>li div.icon{margin-right:10px}}@media (max-width:48.9275em){.wizard-step-test div.step-contents ul.tests>li div.icon{margin-right:1.2771392082vw}}.wizard-step-test div.step-contents ul.tests>li div.icon img{display:none;width:100%;height:auto}.wizard-step-test div.step-contents ul.tests>li.waiting div.icon{perspective:100em}.wizard-step-test div.step-contents ul.tests>li.waiting div.icon img.waiting{display:block;-webkit-animation:logo-rotate-z 1s;animation:logo-rotate-z 1s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:linear;animation-timing-function:linear}.wizard-step-test div.step-contents ul.tests>li.error>div.icon>img.error,.wizard-step-test div.step-contents ul.tests>li.success>div.icon>img.success,.wizard-step-test div.step-contents ul.tests>li.warning>div.icon>img.warning{display:block}.wizard-step-test div.step-contents ul.tests>li div.description h3{margin:.243902439vw 0;padding:0;font-size:1.125em}@media (min-width:102.5em){.wizard-step-test div.step-contents ul.tests>li div.description h3{margin-top:4px}}@media (max-width:48.9275em){.wizard-step-test div.step-contents ul.tests>li div.description h3{margin-top:0}}@media (min-width:102.5em){.wizard-step-test div.step-contents ul.tests>li div.description h3{margin-bottom:4px}}@media (max-width:48.9275em){.wizard-step-test div.step-contents ul.tests>li div.description h3{margin-bottom:0}}@media (min-width:102.5em){.wizard-step-test div.step-contents ul.tests>li div.description h3{margin-left:0}}@media (max-width:48.9275em){.wizard-step-test div.step-contents ul.tests>li div.description h3{margin-left:0}}@media (min-width:102.5em){.wizard-step-test div.step-contents ul.tests>li div.description h3{margin-right:0}}@media (max-width:48.9275em){.wizard-step-test div.step-contents ul.tests>li div.description h3{margin-right:0}}.wizard-step-test div.step-contents ul.tests>li div.description p{margin:0 0 4px;padding:0;font-size:1em}.wizard-step-test div.step-contents ul.tests>li div.description ul.errors{margin-left:1.2195121951vw;list-style:disc}@media (min-width:102.5em){.wizard-step-test div.step-contents ul.tests>li div.description ul.errors{margin-left:20px}}@media (max-width:48.9275em){.wizard-step-test div.step-contents ul.tests>li div.description ul.errors{margin-left:1.2771392082vw}}.wizard-step-test div.step-contents ul.tests>li div.description ul.errors li{display:list-item;font-size:1em}.wizard-step-tutorial{justify-content:flex-start}.wizard-step-tutorial div.tutorial{padding-top:2.4390243902vw;margin-bottom:60px}@media (min-width:102.5em){.wizard-step-tutorial div.tutorial{padding-top:40px}}@media (max-width:48.9275em){.wizard-step-tutorial div.tutorial{padding-top:5.1085568327vw}}.wizard-step-tutorial div.tutorial h2,.wizard-step-tutorial div.tutorial h3{margin-top:2.4390243902vw}@media (min-width:102.5em){.wizard-step-tutorial div.tutorial h2,.wizard-step-tutorial div.tutorial h3{margin-top:40px}}@media (max-width:48.9275em){.wizard-step-tutorial div.tutorial h2,.wizard-step-tutorial div.tutorial h3{margin-top:2.5542784163vw}}.wizard-step-tutorial div.tutorial p{padding:0;margin:0 0 .6097560976vw;font-size:1.125em}@media (min-width:102.5em){.wizard-step-tutorial div.tutorial p{margin-bottom:10px}}@media (max-width:48.9275em){.wizard-step-tutorial div.tutorial p{margin-bottom:1.2771392082vw}}.wizard-step-tutorial div.tutorial p:last-of-type{margin-bottom:0}.wizard-step-tutorial div.tutorial figure{padding:0;margin:2.4390243902vw 0}@media (min-width:102.5em){.wizard-step-tutorial div.tutorial figure{margin-top:40px}}@media (max-width:48.9275em){.wizard-step-tutorial div.tutorial figure{margin-top:2.5542784163vw}}@media (min-width:102.5em){.wizard-step-tutorial div.tutorial figure{margin-bottom:40px}}@media (max-width:48.9275em){.wizard-step-tutorial div.tutorial figure{margin-bottom:2.5542784163vw}}.wizard-step-tutorial div.tutorial figure img{width:100%;height:auto}.wizard-step-tutorial div.tutorial ul{margin-left:20px;margin-bottom:30px;list-style:disc}.wizard-step-tutorial div.tutorial ul li{display:list-item}.wizard-modal.no-steps div.steps-background{opacity:0}.wizard-modal.no-steps div.wizard-content div.steps{transform:translateX(calc(100% + 1.95122vw));opacity:0}@media (min-width:102.5em){.wizard-modal.no-steps div.wizard-content div.steps{transform:translateX(calc(100% + 32px))}}.wizard-modal.no-steps div.wizard-content footer{margin-right:0}.wizard-modal.no-animations *{transition:none!important}.wizard-invisible .wizard-modal{transform:scale(.8);opacity:0}#s3-importer-progress{padding:24px;background:#ddd;border-radius:8px}#s3-importer-progress .button-whoa{background:#a42929!important;border-color:#e62a2a #a42929 #a42929!important;box-shadow:0 1px 0 #a42929!important;color:#fff!important;text-decoration:none!important;text-shadow:0 -1px 1px #a42929,1px 0 1px #a42929,0 1px 1px #a42929,-1px 0 1px #a42929!important}#s3-importer-progress>button{margin-top:20px}.s3-importer-progress-container{position:relative;width:100%;height:32px;background:#aaa;border-radius:16px;overflow:hidden;background-image:url(../img/candy-stripe.svg)}#s3-importer-progress-bar{background-color:#4f90c4;height:100%}.tool-disabled{padding:10px 15px;border:1px solid #df8403}.force-cancel-help{margin-top:20px}.wp-cli-callout{padding:24px;background:#ddd;margin-top:20px;border-radius:8px}.wp-cli-callout>h3{margin:0;padding:0;font-size:14px}.wp-cli-callout>code{background-color:#bbb;padding:10px 15px;margin-top:5px;display:inline-block}#s3-importer-options{padding:24px;background:#e7e7e7;margin-top:20px;border-radius:8px}#s3-importer-options h3{margin:0;padding:0;font-size:14px}#s3-importer-options ul{padding:0;display:flex;flex-direction:column;margin:20px 0 0}#s3-importer-options ul li{display:flex;margin-bottom:30px}#s3-importer-options ul li:last-of-type{margin-bottom:0}#s3-importer-options ul li>div:first-of-type{padding:10px 10px 20px 0;width:160px;min-width:160px;line-height:1.3;font-weight:600}#s3-importer-options ul li div.description{margin-top:8px}#s3-importer-options ul li div.option-ui{display:flex;align-items:center}#s3-importer-options ul li div.option-ui.option-ui-browser input[type=text]{width:40vw;margin-right:10px;padding:7px 11px;border-radius:4px}#s3-importer-options ul li div.option-ui.option-ui-browser input[type=text]:disabled{color:#000}#s3-timing-stats{display:none}#s3-importer-status-text{position:absolute;left:16px;top:0;bottom:0;right:16px;display:flex;align-items:center;color:#fff;font-weight:700}#s3-importer-thumbnails{position:relative;width:100%;height:150px;margin-bottom:15px}#s3-importer-thumbnails-container{position:absolute;left:0;top:0;right:0;bottom:0;overflow:hidden;-webkit-mask-image:linear-gradient(90deg,#ddd 0,hsla(0,0%,86.7%,0) 90%);mask-image:linear-gradient(90deg,#ddd 0,hsla(0,0%,86.7%,0) 90%)}#s3-importer-thumbnails-container img{width:150px;height:150px;max-width:150px;max-height:150px;border-radius:4px}#s3-importer-thumbnails-container>img{margin-right:10px}#s3-importer-thumbnails-fade{background:linear-gradient(90deg,#ddd 0,hsla(0,0%,86.7%,0) 90%);position:absolute;left:150px;top:0;right:0;bottom:0}@supports ((-webkit-mask-image:linear-gradient(to left,rgba(221,221,221,0) 0%,#dddddd 95%,#dddddd 100%)) or (mask-image:linear-gradient(to left,rgba(221,221,221,0) 0%,#dddddd 95%,#dddddd 100%))){#s3-importer-thumbnails-fade{display:none}}#s3-importer-thumbnails-cloud{position:absolute;right:20px;top:50%;transform:translateY(-50%)}.s3-importer-thumb{position:absolute;left:0;top:0;width:150px;min-width:150px;max-width:150px;height:150px;min-height:150px;max-height:150px;background-size:cover;background-position:50%;background-repeat:no-repeat;margin-right:10px;border-radius:4px;background-color:#888;transition:opacity .25s linear,transform .25s linear}.s3-importer-thumb.ilab-hidden{opacity:0;transform:scale(.7)}.s3-importer-image-icon{position:absolute;left:0;top:0;position:relative;width:150px;min-width:150px;max-width:150px;height:150px;min-height:150px;max-height:150px;display:flex;align-items:center;justify-content:center;transition:opacity .25s linear,transform .25s linear}.s3-importer-image-icon.ilab-hidden{opacity:0;transform:scale(.8)}.s3-importer-info-warning{border:1px solid orange;padding:24px;background:rgba(255,165,0,.125);margin-top:20px;border-radius:8px}.s3-importer-info-warning h4{padding:0;font-size:14px;margin:0 0 8px}
\ No newline at end of file
+/*! mediabox v1.1.3 | (c) 2018 Pedro Rogerio | https://github.com/pinceladasdaweb/mediabox */.stop-scroll{height:100%;overflow:hidden}.mediabox-wrap{position:fixed;width:100%;height:100%;background-color:rgba(0,0,0,.8);top:0;left:0;opacity:0;z-index:999;-webkit-animation-duration:.5s;animation-duration:.5s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:mediabox;animation-name:mediabox}@-webkit-keyframes mediabox{0%{opacity:0}to{opacity:1}}@keyframes mediabox{0%{opacity:0}to{opacity:1}}.mediabox-content{max-width:853px;display:block;margin:0 auto;height:100%;position:relative}.mediabox-content iframe{max-width:100%!important;width:100%!important;display:block!important;height:480px!important;border:none!important;position:absolute;top:0;bottom:0;margin:auto 0}.mediabox-hide{-webkit-animation-duration:.5s;animation-duration:.5s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:mediaboxhide;animation-name:mediaboxhide}@-webkit-keyframes mediaboxhide{0%{opacity:1}to{opacity:0}}@keyframes mediaboxhide{0%{opacity:1}to{opacity:0}}.mediabox-close{position:absolute;top:0;cursor:pointer;bottom:528px;right:0;margin:auto 0;width:24px;height:24px;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAMvSURBVHja7Js9aBRBFMd/d1lPY6FiJVjY+Fkoxl7wA1Q0prQRS6tgoZV2MWIRRVHUUq3U+JnESrS2sBXBzipREWMlATXwt8gFznC5nd15M7Nn8uC45nZnfr/dY96+N1uTxFKOOks8lgUU/H2t4tJqIQUcAiaBGeBymcECRgO4B/wBPgJ9zkdKcvkclfRL/8ZtSTXH40N+GpLGF8zth6Q9Lse7DHCsDXxVJLSDLyQhb4B+Sb/VOVJJ6ATfKqGvrIDjDvCpJLjAz8d0JwmLDTBQAD62hIakiYJzm5a021VAfwn4WBLKwLdK2JUnIJP0XX4RSoIP/Hy8W3jeepv1dL3nmjwI3DLOExrAU2DA8zwb8xKhGeCuwYQtJTSAZwbwAHdcEqFM0mPZhO/foSHppdFcrraby2IDV0FCcPi8PCClhCjwLplgCgkrDeGv5I3pcjViSogK7yogloTo8EUEhJaQBL6oAGsJ9yVtkrRD0qsU8JKolagKZ8AD4ETFymFXgPOAQpXE5mMWOAk86XZ4n6pwlSSUhvcti1dBghe8RV8gpYQRX3irxkgKCSPABV94y85QTAlm8NatsRgSTOGBUnmAS57w3KiA0Ro3gHOW8KEEAOwE3hvfXWubFauu6A6vCND07OmW9viq5vpsGT3AtRAN2XoA+BfAwQBiTweoNpMZw48BRwKuAoPN7zNVWwZjwAfpO9S7DN5cQmYAPw4cTvAsYPJ3qHcpvNmdUO9ieBMJZQT0AhMVgfeWUC8BP87cjjHfuA6sATY0c4c0EgpUUHslvTaq3l5aUL1N1oarAnxSCVWBTyYhJvyw41XJJI3GkpAH/yYyfHQJi01gdUL4qBKqCh9NQrtBx4wGvGi0XS6T9MhoTkN5AtZVDN5awlTePsGfwDfPjGwYGDKu3s4Cp4BRz/N8cskED0iaqciVt7wTvkra5roKlJEQGt5HwhdJ24vmAUUkDEV+VyCT9NBxbp/bXXnXTNBFQmz4IhI6wrs+C+zvICEVvIuEKUlbrZ4G97WRkBq+k4RJSVusd4ntlfSheVudrQh8q4SbmntH6K2kzSF3if1Xsfzq7LKAJR5/BwCdAQBJn4egPgAAAABJRU5ErkJggg==") no-repeat;background-size:24px 24px}.mediabox-close:hover{opacity:.5}@media (max-width:768px){.mediabox-content{max-width:90%}}@media (max-width:600px){.mediabox-content iframe{height:320px!important}.mediabox-close{bottom:362px}}@media (max-width:480px){.mediabox-content iframe{height:220px!important}.mediabox-close{bottom:262px}}.mediabox-wrap{z-index:1000000}.mediabox-content{max-width:75vw}.mediabox-content iframe{height:42.1875vw!important}.mediabox-close{bottom:46vw}.ic-Super-toggle__label{box-sizing:border-box;margin:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ic-Form-group.ic-Form-group--horizontal .ic-Super-toggle__label{display:inline-flex;align-items:center}.ic-Super-toggle__input{opacity:0;position:absolute}.ic-Super-toggle__input:checked~label .ic-Super-toggle-switch:after{transform:translate3d(100%,0,0)}.ic-Super-toggle__input:checked~label .ic-Super-toggle__disabled-msg:before{content:attr(data-checked)}.ic-Super-toggle__input[disabled]{opacity:0!important}.ic-Super-toggle__input[disabled]~label .ic-Super-toggle-switch{opacity:.33}.ic-Super-toggle-switch{transition:background .1s,border-color .1s;position:relative;line-height:1;display:flex;align-items:center;background-clip:padding-box}.ic-Super-toggle-switch:after{transition:all .1s ease-in-out;content:"";position:absolute;top:0;left:0;transform:translateZ(0);border-radius:100%;box-shadow:0 3px 6px rgba(0,0,0,.3);background-image:url(https://cl.ly/320m31452k2X/handle.svg);background-position:50% 50%;background-repeat:no-repeat;background-size:20px}.ic-Super-toggle__disabled-msg{display:none}.ic-Super-toggle__disabled-msg:before{content:attr(data-unchecked);font-style:italic;opacity:.8}[class^=ic-Super-toggle-option-]{transition:all .2s ease-out;flex:0 0 50%;text-align:center;position:relative;z-index:1;text-transform:uppercase;font-weight:700;line-height:1;speak:none;box-sizing:border-box}.ic-Super-toggle__screenreader{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute}.ic-Super-toggle--on-off{display:inline-block;vertical-align:middle}.ic-Super-toggle--on-off .ic-Super-toggle__input:focus~label .ic-Super-toggle-switch:after{box-shadow:inset 0 0 0 1px #fff,inset 0 0 0 3px #5b6c79,0 3px 6px rgba(0,0,0,.3)}.ic-Super-toggle--on-off .ic-Super-toggle__input:checked~label .ic-Super-toggle-switch{background:#4cace3;border-color:#4cace3}.ic-Super-toggle--on-off .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT{color:#fff}.ic-Super-toggle--on-off .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT .ic-Super-toggle__svg>*{fill:#fff}.ic-Super-toggle--on-off .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT{color:#fff}.ic-Super-toggle--on-off .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT .ic-Super-toggle__svg>*{fill:#fff}.ic-Super-toggle--on-off .ic-Super-toggle__input:checked:focus~label .ic-Super-toggle-switch:after{box-shadow:inset 0 0 0 1px #fff,inset 0 0 0 3px #4cace3,0 3px 6px rgba(0,0,0,.3)}.ic-Super-toggle--on-off .ic-Super-toggle-switch{width:50px;height:25px;background:#5b6c79;border:2px solid #5b6c79;border-radius:14.5px}.ic-Form-group.ic-Form-group--horizontal .ic-Super-toggle--on-off .ic-Super-toggle-switch{flex:0 0 50px}.ic-Super-toggle--on-off .ic-Super-toggle-switch:after{background-color:#fff;width:25px;height:25px}.ic-Super-toggle--on-off .ic-Super-toggle-option-LEFT{color:#fff}.ic-Super-toggle--on-off .ic-Super-toggle-option-LEFT .ic-Super-toggle__svg>*{fill:#fff}.ic-Super-toggle--on-off .ic-Super-toggle-option-RIGHT{color:#fff}.ic-Super-toggle--on-off .ic-Super-toggle-option-RIGHT .ic-Super-toggle__svg>*{fill:#fff}.ic-Super-toggle--on-off .ic-Super-toggle__svg{max-width:12.5px;max-height:12.5px}.ic-Super-toggle--on-off [class^=ic-Super-toggle-option-]{transition-delay:.1s}.ic-Super-toggle--on-off .ic-Super-toggle-option-LEFT{transform:scale(.1);opacity:0}.ic-Super-toggle--on-off .ic-Super-toggle-option-RIGHT,.ic-Super-toggle--on-off .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT{transform:scale(1);opacity:1}.ic-Super-toggle--on-off .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT{transform:scale(.1);opacity:0}.toggle-warning{display:inline-block;vertical-align:middle}.toggle-warning .ic-Super-toggle__input:focus~label .ic-Super-toggle-switch:after{box-shadow:inset 0 0 0 1px #fff,inset 0 0 0 3px #5b6c79,0 3px 6px rgba(0,0,0,.3)}.toggle-warning .ic-Super-toggle__input:checked~label .ic-Super-toggle-switch{background:#ffaa10;border-color:#ffaa10}.toggle-warning .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT{color:#fff}.toggle-warning .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT .ic-Super-toggle__svg>*{fill:#fff}.toggle-warning .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT{color:#fff}.toggle-warning .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT .ic-Super-toggle__svg>*{fill:#fff}.toggle-warning .ic-Super-toggle__input:checked:focus~label .ic-Super-toggle-switch:after{box-shadow:inset 0 0 0 1px #fff,inset 0 0 0 3px #ffaa10,0 3px 6px rgba(0,0,0,.3)}.toggle-warning .ic-Super-toggle-switch{width:50px;height:25px;background:#5b6c79;border:2px solid #5b6c79;border-radius:14.5px}.ic-Form-group.ic-Form-group--horizontal .toggle-warning .ic-Super-toggle-switch{flex:0 0 50px}.toggle-warning .ic-Super-toggle-switch:after{background-color:#fff;width:25px;height:25px}.toggle-warning .ic-Super-toggle-option-LEFT{color:#fff}.toggle-warning .ic-Super-toggle-option-LEFT .ic-Super-toggle__svg>*{fill:#fff}.toggle-warning .ic-Super-toggle-option-RIGHT{color:#fff}.toggle-warning .ic-Super-toggle-option-RIGHT .ic-Super-toggle__svg>*{fill:#fff}.toggle-warning .ic-Super-toggle__svg{max-width:12.5px;max-height:12.5px}.ic-Super-toggle--ui-switch{display:inline-block;vertical-align:middle}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:focus~label .ic-Super-toggle-switch:after{box-shadow:inset 0 0 0 1px #fff,inset 0 0 0 3px #5b6c79,0 3px 6px rgba(0,0,0,.3)}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked~label .ic-Super-toggle-switch{background:#5b6c79;border-color:#5b6c79}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT{color:#888}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT .ic-Super-toggle__svg>*{fill:#888}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT{color:#08c}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT .ic-Super-toggle__svg>*{fill:#08c}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked:focus~label .ic-Super-toggle-switch:after{box-shadow:inset 0 0 0 1px #fff,inset 0 0 0 3px #5b6c79,0 3px 6px rgba(0,0,0,.3)}.ic-Super-toggle--ui-switch .ic-Super-toggle-switch{width:50px;height:25px;background:#5b6c79;border:2px solid #5b6c79;border-radius:14.5px}.ic-Form-group.ic-Form-group--horizontal .ic-Super-toggle--ui-switch .ic-Super-toggle-switch{flex:0 0 50px}.ic-Super-toggle--ui-switch .ic-Super-toggle-switch:after{background-color:#fff;width:25px;height:25px}.ic-Super-toggle--ui-switch .ic-Super-toggle-option-LEFT{color:#08c}.ic-Super-toggle--ui-switch .ic-Super-toggle-option-LEFT .ic-Super-toggle__svg>*{fill:#08c}.ic-Super-toggle--ui-switch .ic-Super-toggle-option-RIGHT{color:#888}.ic-Super-toggle--ui-switch .ic-Super-toggle-option-RIGHT .ic-Super-toggle__svg>*{fill:#888}.ic-Super-toggle--ui-switch .ic-Super-toggle__svg{max-width:12.5px;max-height:12.5px}.ic-Super-toggle--ui-switch .ic-Super-toggle__label{display:inline-flex;align-items:center}.ic-Super-toggle--ui-switch .ic-Super-toggle-switch{display:block}.ic-Super-toggle--ui-switch [class^=ic-Super-toggle-option-]{flex:none;min-width:24px}.ic-Super-toggle--ui-switch .ic-Super-toggle-option-LEFT{text-align:left;transform:scale(1.1)}.ic-Super-toggle--ui-switch .ic-Super-toggle-option-RIGHT{text-align:right;transform:scale(.9)}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT{transform:scale(.9)}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT{transform:scale(1.1)}.settings-container{font-family:system-ui,-apple-system,BlinkMacSystemFont,Avenir Next,Avenir,Segoe UI,Lucida Grande,Helvetica Neue,Helvetica,Fira Sans,Roboto,Noto,Droid Sans,Cantarell,Oxygen,Ubuntu,Franklin Gothic Medium,Century Gothic,Liberation Sans,sans-serif;margin:0 0 64px -20px}.settings-container header{position:relative;background-image:url(../img/settings-bg-large.svg);background-position:0;background-repeat:no-repeat;background-size:cover;min-height:80px;width:100%;display:flex;align-items:center}.settings-container header>img{margin:0 20px;width:88px;max-width:88px}.settings-container header h1{margin-left:5px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Avenir Next,Avenir,Segoe UI,Lucida Grande,Helvetica Neue,Helvetica,Fira Sans,Roboto,Noto,Droid Sans,Cantarell,Oxygen,Ubuntu,Franklin Gothic Medium,Century Gothic,Liberation Sans,sans-serif;text-transform:uppercase;font-weight:400;font-size:1.5em;color:#777}.settings-container header .header-actions{position:absolute!important;right:40px;top:50%;transform:translateY(-50%)!important;display:flex}.settings-container header .header-actions a{margin-left:8px;display:flex;align-items:center}.settings-container header .header-actions a svg{height:16px;width:auto;margin-right:8px}.settings-container header .header-actions a svg>path,.settings-container header .header-actions a svg>rect{fill:#fff}.settings-container header .header-actions div.spacer{width:8px;min-width:8px}.settings-container header.all-settings{display:flex;flex-direction:column;align-items:flex-start}.settings-container header.all-settings div.contents{height:104px;display:flex;justify-content:space-between;align-items:center;width:100%}.settings-container header.all-settings div.contents img.logo{margin:0 0 0 23px;width:108px;max-width:108px}.settings-container header.all-settings div.contents div.settings-select-container{background-color:hsla(0,0%,100%,.6);padding:10px 14px;border-radius:8px;z-index:1000;margin-right:23px;display:none}@media (max-width:992px){.settings-container header.all-settings div.contents div.settings-select-container{display:unset}}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown{display:flex;align-items:center;z-index:1000}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown>div:first-of-type{font-family:system-ui,-apple-system,BlinkMacSystemFont,Avenir Next,Avenir,Segoe UI,Lucida Grande,Helvetica Neue,Helvetica,Fira Sans,Roboto,Noto,Droid Sans,Cantarell,Oxygen,Ubuntu,Franklin Gothic Medium,Century Gothic,Liberation Sans,sans-serif;margin-right:10px;color:#777;text-decoration:none;text-transform:uppercase;font-weight:700;font-size:1em}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown div.dropdown{position:relative;width:200px;height:36px;z-index:1000;cursor:pointer}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown div.dropdown div.current{font-family:system-ui,-apple-system,BlinkMacSystemFont,Avenir Next,Avenir,Segoe UI,Lucida Grande,Helvetica Neue,Helvetica,Fira Sans,Roboto,Noto,Droid Sans,Cantarell,Oxygen,Ubuntu,Franklin Gothic Medium,Century Gothic,Liberation Sans,sans-serif;display:flex;align-items:center;position:absolute;left:0;top:0;right:0;bottom:0;background-color:#eee;border:1px solid #ddd;padding-left:10px;color:#777;text-decoration:none;text-transform:uppercase;font-weight:700;font-size:13px;cursor:pointer;background-image:url(../img/icon-dropdown-arrow.svg);background-repeat:no-repeat;background-position:right 12px center;transition:background-color .15s linear}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown div.dropdown div.current:hover{background-color:#fff}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown div.dropdown div.items{z-index:1001;position:absolute;top:0;left:0;right:0;transition:opacity .15s linear,transform .15s linear;opacity:0;pointer-events:none}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown div.dropdown div.items.visible{pointer-events:auto;opacity:1}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown div.dropdown div.items ul{margin:0;padding:0;box-shadow:0 0 8px 1px rgba(0,0,0,.125)}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown div.dropdown div.items ul li{position:relative;margin:0;padding:0;border:1px solid #ddd;border-top:0;align-items:center}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown div.dropdown div.items ul li:first-of-type{border:1px solid #ddd}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown div.dropdown div.items ul li a.tool{position:relative;display:flex;align-items:center;height:36px;background-color:#eee;padding-left:10px;color:#777;text-decoration:none;text-transform:uppercase;font-weight:700;font-size:13px;transition:background-color .15s linear}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown div.dropdown div.items ul li a.tool:hover{background:#fff}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown div.dropdown div.items ul li a.tool-pin{display:block;position:absolute;top:0;width:36px;height:36px;right:0;background-image:url(../img/icon-pin-deselected.svg);background-repeat:no-repeat;background-position:50%}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown div.dropdown div.items ul li a.tool-pin.pinned{background-image:url(../img/icon-pin-selected.svg)}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown div.dropdown div.items ul li.active a.tool{background:#fff}.settings-container header.all-settings div.contents div.settings-select-container nav.dropdown.active div.dropdown div.current{background-color:#ddd}.settings-container header.all-settings div.mcloud-settings-tabs{position:relative;width:100%;padding-left:23px;border-bottom:1px solid #d1d1d1;width:calc(100% - 24px);margin-top:8px}@media (max-width:992px){.settings-container header.all-settings div.mcloud-settings-tabs{display:none}}.settings-container header.all-settings div.mcloud-settings-tabs .navwrap{position:relative;overflow:hidden;transform:translateY(1px);width:100%;height:36px}.settings-container header.all-settings div.mcloud-settings-tabs .navwrap ul{position:absolute;left:0;top:0;bottom:0;width:30000px;display:flex;align-items:center;padding:0;margin:0}.settings-container header.all-settings div.mcloud-settings-tabs .navwrap ul li{height:100%;display:flex;margin:0 3px 0 0;padding:0 11px 0 14px;background-color:#ddd;align-items:center;border:1px solid #d1d1d1;border-bottom:none;border-top-left-radius:4px;border-top-right-radius:4px}.settings-container header.all-settings div.mcloud-settings-tabs .navwrap ul li a.tool{display:flex;align-items:center;color:#777;text-decoration:none;text-transform:uppercase;font-weight:700;font-size:11px;white-space:nowrap}.settings-container header.all-settings div.mcloud-settings-tabs .navwrap ul li a.tool-pin{display:block;width:20px;height:36px;margin-left:8px;background-image:url(../img/icon-pin-deselected.svg);background-repeat:no-repeat;background-position:50%;background-size:14px}.settings-container header.all-settings div.mcloud-settings-tabs .navwrap ul li a.tool-pin.pinned{background-image:url(../img/icon-pin-selected.svg)}.settings-container header.all-settings div.mcloud-settings-tabs .navwrap ul li.active{background-color:#f1f1f1}.settings-container header.all-settings div.mcloud-settings-tabs .navwrap ul li.active a{color:#000}.settings-container header.all-settings div.mcloud-settings-tabs a.tabs-nav{position:absolute;display:flex;align-items:center;justify-content:center;width:96px;top:-1px;bottom:0}.settings-container header.all-settings div.mcloud-settings-tabs a.tabs-nav span{font-size:0;line-height:0;display:block;width:20px;height:20px;background-repeat:no-repeat;background-position:50%;background-size:contain}.settings-container header.all-settings div.mcloud-settings-tabs a.tabs-nav.hidden{opacity:0;pointer-events:none}.settings-container header.all-settings div.mcloud-settings-tabs a.tabs-prev{left:0;justify-content:flex-start;background:linear-gradient(90deg,#f1f1f1 50%,hsla(0,0%,94.5%,0))}.settings-container header.all-settings div.mcloud-settings-tabs a.tabs-prev span{margin-left:10px;background-image:url(../img/ilab-icons-prev.svg)}.settings-container header.all-settings div.mcloud-settings-tabs a.tabs-next{right:0;justify-content:flex-end;background:linear-gradient(270deg,#f1f1f1 50%,hsla(0,0%,94.5%,0))}.settings-container header.all-settings div.mcloud-settings-tabs a.tabs-next span{margin-right:10px;background-image:url(../img/ilab-icons-next.svg)}.settings-container header.all-settings div.mcloud-settings-tabs.animated .navwrap ul{transition:transform .25s linear}.settings-container header.all-settings div.mcloud-settings-tabs.animated a.tabs-nav{transition:opacity .25s linear}.settings-container .settings-body{margin:20px}.settings-container .settings-body .settings-description{font-size:1.1em;text-align:center;background-color:#fafafa;padding:25px;border-radius:8px;margin-bottom:20px}.settings-container .settings-body.show-upgrade{display:flex}.settings-container .settings-body.show-upgrade>.settings-interior{flex:1;margin-right:20px}@media (max-width:64em){.settings-container .settings-body.show-upgrade>.settings-interior{order:1;margin-right:0}}@media (max-width:64em){.settings-container .settings-body.show-upgrade{flex-direction:column}}.settings-container .settings-body .upgrade-feature{background-color:#fafafa;border-radius:8px;padding:15px 20px}.settings-container .settings-body .upgrade-feature h2{padding:0;margin:0 0 30px;color:#46a4dd}.settings-container .settings-body .upgrade-feature ul{margin-left:20px;list-style:unset}.settings-container .settings-body .upgrade-feature ul li{list-style-type:square}.settings-container .settings-body .upgrade-feature div.button-container{text-align:right;padding:20px 0}.settings-container .settings-body .upgrade-feature div.button-container a{padding:10px;background-color:#46a4dd;border-radius:6px;color:#fff;text-decoration:none;font-weight:700;font-size:1.1em}.settings-container .settings-body .upgrade-promo{min-width:200px;max-width:320px;position:relative}.settings-container .settings-body .upgrade-promo .upgrade-interior{position:relative;background-color:#fafafa;border-radius:8px;padding:15px 20px}.settings-container .settings-body .upgrade-promo .upgrade-interior h2{padding:0;margin:0 0 30px;color:#46a4dd}.settings-container .settings-body .upgrade-promo .upgrade-interior ul{margin-left:20px}.settings-container .settings-body .upgrade-promo .upgrade-interior ul li{list-style-type:square}@media (max-width:64em){.settings-container .settings-body .upgrade-promo .upgrade-interior ul{display:flex;flex-wrap:wrap;width:100%}@supports (display:grid){.settings-container .settings-body .upgrade-promo .upgrade-interior ul{display:grid;grid-template-columns:1fr 1fr 1fr}}.settings-container .settings-body .upgrade-promo .upgrade-interior ul li{margin-right:30px}}@media (max-width:48.9275em){@supports (display:grid){.settings-container .settings-body .upgrade-promo .upgrade-interior ul{grid-template-columns:1fr 1fr}}}.settings-container .settings-body .upgrade-promo .upgrade-interior div.button-container{text-align:right;padding:20px 0}.settings-container .settings-body .upgrade-promo .upgrade-interior div.button-container a{padding:10px;background-color:#46a4dd;border-radius:6px;color:#fff;text-decoration:none;font-weight:700;font-size:1.1em}.settings-container .settings-body .upgrade-promo .upgrade-interior a.upgrade-close{display:none;position:absolute;top:15px;right:20px}@media (max-width:64em){.settings-container .settings-body .upgrade-promo .upgrade-interior a.upgrade-close{display:block}}@media (max-width:64em){.settings-container .settings-body .upgrade-promo{order:0;margin-bottom:20px;max-width:100%}}@media (max-width:64em){.settings-container .settings-body .upgrade-promo.hide-on-mobile{display:none}}.button-warning{background:#dd9000!important;border-color:#dd9000 #b97800 #b97800!important;box-shadow:0 1px 0 #b97800!important;color:#fff!important;text-decoration:none!important;text-shadow:0 -1px 1px #b97800,1px 0 1px #b97800,0 1px 1px #b97800,-1px 0 1px #b97800!important}.media-cloud-tool-description{padding:24px;background:#ddd;border-radius:8px;margin-bottom:20px}.media-cloud-tool-description h2{font-family:system-ui,-apple-system,BlinkMacSystemFont,Avenir Next,Avenir,Segoe UI,Lucida Grande,Helvetica Neue,Helvetica,Fira Sans,Roboto,Noto,Droid Sans,Cantarell,Oxygen,Ubuntu,Franklin Gothic Medium,Century Gothic,Liberation Sans,sans-serif;text-transform:uppercase;margin:0 0 5px;padding:0}.media-cloud-tool-description p{margin-top:0;font-size:1.2em}.ilab-notification-container .notice{margin-left:0;margin-right:0;margin-bottom:10px}.ilab-notification-container .notice:last-of-type{margin-bottom:20px}.ilab-settings-section{background-color:#fafafa;padding:25px;border-radius:8px;margin-bottom:20px;overflow:hidden;border:1px solid #eaeaea}.ilab-settings-section h2{padding:10px 25px;background-color:#fff;margin:-25px -25px 0;border-bottom:1px solid #eaeaea;font-family:system-ui,-apple-system,BlinkMacSystemFont,Avenir Next,Avenir,Segoe UI,Lucida Grande,Helvetica Neue,Helvetica,Fira Sans,Roboto,Noto,Droid Sans,Cantarell,Oxygen,Ubuntu,Franklin Gothic Medium,Century Gothic,Liberation Sans,sans-serif;font-weight:700;font-size:13px;color:#50ade2!important;text-transform:uppercase;display:flex;align-items:center}.ilab-settings-section h2 a.help-beacon{margin:0 0 0 10px;padding:0;display:block;width:16px;height:16px;color:transparent;overflow:hidden;background-image:url(../img/mcloud-icon-help.svg);background-position:50%;background-size:contain;background-repeat:no-repeat}.ilab-settings-section .section-description{margin-top:20px;margin-bottom:15px;font-style:italic}.ilab-settings-section .checkbox-w-description{display:flex;align-items:center}.ilab-settings-section .checkbox-w-description label{margin-right:20px}.ilab-settings-section .checkbox-w-description>div>p{margin:0}.ilab-settings-toggle{padding:0 25px 5px}.ilab-settings-toggle table.form-table tr{display:flex;flex-direction:row;align-items:center}@media (max-width:48.9275em){.ilab-settings-toggle table.form-table tr{flex-direction:column;align-items:flex-start}}.ilab-settings-toggle table.form-table tr th{min-width:200px;max-width:200px}@media (max-width:48.9275em){.ilab-settings-toggle table.form-table tr{margin-bottom:20px}.ilab-settings-toggle table.form-table tr th{margin-bottom:10px}}.ilab-settings-features{padding:10px 25px 15px}.ilab-settings-features table.form-table tr{display:flex;flex-direction:row;align-items:center}.ilab-settings-features table.form-table tr td.toggle{display:flex;align-items:center;max-width:220px;min-width:220px}.ilab-settings-features table.form-table tr td.toggle div.title{display:flex;flex-direction:column;margin-left:30px;white-space:nowrap;font-weight:700;font-size:1.05em}.ilab-settings-features table.form-table tr td.toggle div.title div.tool-links{display:flex}.ilab-settings-features table.form-table tr td.toggle div.title div.tool-links a{margin-right:10px;margin-top:5px;font-size:.85em;font-weight:400}.ilab-settings-features table.form-table tr td.toggle div.title div.tool-links a:last-of-type{margin-right:0}.ilab-settings-features table.form-table tr td.description p{font-size:1.05em}@media (max-width:48.9275em){.ilab-settings-features table.form-table tr{flex-direction:column;align-items:flex-start;margin-bottom:30px}.ilab-settings-features table.form-table td.toggle div.title{font-size:1.2em!important}}.ilab-settings-button{margin-top:40px;display:flex;justify-content:center}.ilab-settings-button p{padding:0;margin:0}.ilab-settings-batch-tools{display:flex}.ilab-settings-batch-tools a.button{margin-right:10px}.ilab-settings-batch-tools.has-submit{padding-right:10px;margin-right:20px;border-right:1px solid #ccc}span.tool-indicator{background:#ccc;border:1px solid #979797;display:block;width:9px;height:9px;border-radius:9px;margin-right:6px}span.tool-indicator.tool-active{background:#6dd51b}span.tool-indicator.tool-env-active{background:#fdac00}div.ilab-section-doc-links{margin-top:10px}div.ilab-section-doc-links div.doc-links-setting{background-color:rgba(0,0,0,.04);width:100%;border-radius:6px;display:flex;align-items:center;justify-content:center;padding:12px 0}div.ilab-section-doc-links div.doc-links-setting a{margin:0 5px!important}.troubleshooter-info li{margin:0;padding:8px 0 8px 28px;list-style:none;background-repeat:no-repeat;background-position:left top 6px;background-size:20px}.troubleshooter-info li.info-warning{background-image:url(../img/icon-warning.svg)}.troubleshooter-info li.info-success{background-image:url(../img/icon-success.svg)}.troubleshooter-info li.info-error{background-image:url(../img/icon-error.svg)}.troubleshooter-wait{display:flex;align-items:center}.troubleshooter-wait.hidden{display:none}.troubleshooter-wait>img{margin-right:7px;height:18px}.upload-path-preview{margin:10px 0;padding:10px;font-style:italic;background-color:#fff;border:1px dashed #ddd;display:flex;line-height:1;align-items:center}.upload-path-preview span:first-of-type{text-transform:uppercase;color:#ccc;font-size:11px;font-style:normal;margin-right:10px}.settings-image-preview-container{display:flex;flex-direction:column;margin-bottom:10px}.settings-image-preview-container .settings-image-preview{display:block;border:1px solid #ddd;width:256px;min-width:256px;height:256px;min-height:256px;margin-bottom:10px;background-color:#eee;background-size:contain;background-position:50%;background-repeat:no-repeat}.subsite-setting-group{margin-bottom:20px}.subsite-setting-group:last-of-type{margin-bottom:0}.subsite-upload-path{display:flex;align-items:center}.subsite-upload-path label{min-width:100px}.presigned-url-container>div{display:flex;align-items:flex-start;margin-bottom:20px}.presigned-url-container>div:nth-of-type(2n){margin-bottom:40px}.presigned-url-container>div:last-of-type{margin-bottom:0}.presigned-url-container>div div.presigned-label{line-height:1.3;font-weight:600;margin-right:10px;margin-top:6px;min-width:175px}.privacy-container>div{display:flex;align-items:flex-start;margin-bottom:20px}.privacy-container>div:last-of-type{margin-bottom:0}.privacy-container>div div.privacy-label{line-height:1.3;font-weight:600;margin-right:10px;margin-top:6px;min-width:135px}#beacon-container iframe{z-index:200000!important}.ilab-popup{position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,.85);pointer-events:all;z-index:100002;display:flex;align-items:center;justify-content:center;transition:opacity .25s linear;opacity:1}.ilab-popup .ilab-popup-body{position:relative}.ilab-popup .ilab-popup-body .ilab-popup-contents{width:80vw;height:80vh;min-width:80vw;min-height:80vh;max-width:80vw;max-height:80vh;background-color:#fff}.ilab-popup .ilab-popup-body .ilab-popup-close{position:absolute;right:38px;top:12px;font-size:0}.ilab-popup .ilab-popup-body .ilab-popup-close:after,.ilab-popup .ilab-popup-body .ilab-popup-close:before{position:absolute;left:13px;content:" ";height:25px;width:2px;background-color:#000}.ilab-popup .ilab-popup-body .ilab-popup-close:before{transform:rotate(45deg)}.ilab-popup .ilab-popup-body .ilab-popup-close:after{transform:rotate(-45deg)}.ilab-popup.hidden{pointer-events:none;opacity:0}.mcloud-inline-help-container{position:fixed;left:0;top:0;right:0;bottom:0;z-index:100002;transition:opacity .25s linear}.mcloud-inline-help-container .mcloud-inline-help{background-color:#fff;position:absolute;width:375px;height:425px;box-shadow:0 0 10px 1px rgba(0,0,0,.25);border-radius:8px;transform-origin:left center;transition:transform .25s ease-out}.mcloud-inline-help-container .mcloud-inline-help .mcloud-inline-help-arrow{right:100%;top:50%;content:" ";height:0;width:0;position:absolute;pointer-events:none;border:10px solid hsla(0,0%,100%,0);border-right-color:#fff;margin-top:-10px}.mcloud-inline-help-container .mcloud-inline-help .mcloud-inline-help-body{box-sizing:border-box;position:absolute;left:15px;top:15px;right:7.5px;bottom:15px;padding-right:15px;overflow:auto}.mcloud-inline-help-container.mcloud-invisible{opacity:0;pointer-events:none}.mcloud-inline-help-container.mcloud-invisible .mcloud-inline-help{transform:scale(.8)}.mcloud-sidebar-help-container{position:fixed;left:0;top:0;right:0;bottom:0;z-index:1000001}.mcloud-sidebar-help-container .mcloud-sidebar-help{position:absolute;right:0;top:0;bottom:0;width:450px;transition:transform .25s linear;background-color:#fff;box-shadow:0 0 10px 1px rgba(0,0,0,.25)}.mcloud-sidebar-help-container .mcloud-sidebar-help .mcloud-sidebar-help-body{box-sizing:border-box;position:absolute;left:15px;top:0;right:7.5px;bottom:0;padding-top:15px;padding-right:22.5px;overflow:auto}.mcloud-sidebar-help-container .mcloud-sidebar-help .mcloud-sidebar-help-body figure{margin-left:0;margin-right:0;padding-left:0;padding-right:0}.mcloud-sidebar-help-container .mcloud-sidebar-help .mcloud-sidebar-help-body figure img{width:100%;height:auto}.mcloud-sidebar-help-container .mcloud-sidebar-help .mcloud-sidebar-help-body div.code-block{overflow-x:auto}.mcloud-sidebar-help-container .mcloud-sidebar-help .mcloud-sidebar-close{display:block;position:absolute;right:10px;top:10px;font-size:0;line-height:0;width:14px;height:14px}.mcloud-sidebar-help-container .mcloud-sidebar-help .mcloud-sidebar-close:before{position:absolute;content:"";width:14px;height:2px;background-color:#aaa;transform:translateX(-50%) rotate(-45deg);left:50%;top:50%}.mcloud-sidebar-help-container .mcloud-sidebar-help .mcloud-sidebar-close:after{position:absolute;content:"";width:14px;height:2px;background-color:#aaa;transform:translateX(-50%) rotate(45deg);left:50%;top:50%}.mcloud-sidebar-help-container.mcloud-invisible{pointer-events:none}.mcloud-sidebar-help-container.mcloud-invisible .mcloud-sidebar-help{transform:translateX(100%)}body.modal-open #beacon-container{display:none!important}.BeaconContainer{right:10px!important;bottom:88px!important}.BeaconFabButtonFrame{right:10px!important;bottom:10px!important}.section-jumps{display:flex;align-items:center;justify-content:center;margin-top:30px;margin-bottom:35px}.section-jumps span.label{color:#777;text-decoration:none;text-transform:uppercase;font-weight:700;font-size:10px;margin-right:20px;margin-top:2px}.section-jumps a,.section-jumps span.label{display:block;line-height:1}.section-jumps span.sep{margin-left:10px;margin-right:10px;color:#777;font-weight:700;font-size:11px}.section-submit{display:flex;justify-content:center;border:1px solid #eaeaea;background-color:rgba(0,0,0,.04);width:100%;border-radius:6px;align-items:center;padding:12px 0;margin-top:20px}.section-submit p{margin:0;padding:0}.wizard-container{position:fixed;left:0;top:0;width:100%;height:100%;background-color:#000;z-index:100000;display:flex;align-items:center;justify-content:center;overflow:hidden;transition:opacity .333s linear}.wizard-container *{font-family:SF Pro Text,SFProText,system-ui,-apple-system,BlinkMacSystemFont,Avenir Next,Avenir,Segoe UI,Lucida Grande,Helvetica Neue,Helvetica,Fira Sans,Roboto,Noto,Droid Sans,Cantarell,Oxygen,Ubuntu,Franklin Gothic Medium,Century Gothic,Liberation Sans,sans-serif}.wizard-container a{text-decoration:none}.wizard-container a:focus{outline:none;box-shadow:none}.wizard-container .wizard-modal{position:relative;width:87.8048780488vw;height:51.2195121951vw;transition:transform .333s linear,opacity .333s linear}@media (min-width:102.5em){.wizard-container .wizard-modal{width:1440px}}@media (max-width:48.9275em){.wizard-container .wizard-modal{width:94.5083014049vw}}@media (min-width:102.5em){.wizard-container .wizard-modal{height:840px}}@media (max-width:48.9275em){.wizard-container .wizard-modal{height:81.7369093231vw}}.wizard-container .wizard-modal div.steps-background{position:absolute;left:calc(100% - 320px);top:-100vh;width:100vw;height:300vh;background-color:rgba(58,86,116,.5);transition:transform .25s linear,opacity .25s linear}@media (max-width:48.9275em){.wizard-container .wizard-modal div.steps-background{left:calc(100% - 26.81992vw)}}@media (min-width:48.9375em) and (max-width:102.49em){.wizard-container .wizard-modal div.steps-background{left:calc(100% - 19.5122vw)}}.wizard-container .wizard-modal a.close-modal{position:absolute;left:.6097560976vw;top:.6097560976vw;width:1.7073170732vw;height:1.7073170732vw;background-image:url(../img/wizard-close-modal.svg);background-position:50%;background-repeat:no-repeat;background-size:contain;font-size:0;line-height:0}@media (min-width:102.5em){.wizard-container .wizard-modal a.close-modal{left:10px}}@media (max-width:48.9275em){.wizard-container .wizard-modal a.close-modal{left:1.2771392082vw}}@media (min-width:102.5em){.wizard-container .wizard-modal a.close-modal{top:10px}}@media (max-width:48.9275em){.wizard-container .wizard-modal a.close-modal{top:1.2771392082vw}}@media (min-width:102.5em){.wizard-container .wizard-modal a.close-modal{width:28px}}@media (max-width:48.9275em){.wizard-container .wizard-modal a.close-modal{width:3.5759897829vw}}@media (min-width:102.5em){.wizard-container .wizard-modal a.close-modal{height:28px}}@media (max-width:48.9275em){.wizard-container .wizard-modal a.close-modal{height:3.5759897829vw}}.wizard-content{position:absolute;left:0;top:0;right:0;bottom:0;font-size:.9756097561vw;border-radius:.7317073171vw;overflow:hidden;background-color:#fff;display:flex;flex-direction:column}@media (min-width:102.5em){.wizard-content{font-size:16px}}@media (max-width:48.9275em){.wizard-content{font-size:1.7879948914vw}}@media (min-width:102.5em){.wizard-content{border-radius:12px}}@media (max-width:48.9275em){.wizard-content{border-radius:1.5325670498vw}}.wizard-content div.sections{flex:1;position:relative;overflow:hidden}.wizard-content div.sections div.wizard-section{position:absolute;left:0;right:0;top:0;bottom:0;transform:translateX(87.8048780488vw);transition:transform .25s linear,opacity .25s linear,filter .25s linear,-webkit-filter .25s linear;overflow-x:hidden;opacity:0}.wizard-content div.sections div.wizard-section.current{opacity:1;transform:translateX(0)}.wizard-content div.sections div.wizard-section.past{transform:translateX(-87.8048780488vw)}@media (min-width:102.5em){.wizard-content div.sections div.wizard-section{transform:translateX(1440px)}.wizard-content div.sections div.wizard-section.past{transform:translateX(-1440px)}}.wizard-content div.sections div.wizard-section div.wizard-step{position:absolute;left:0;right:0;top:0;bottom:0;transform:translateX(100%);transition:transform .25s linear,opacity .25s linear;opacity:0}.wizard-content div.sections div.wizard-section div.wizard-step.current{opacity:1;transform:translateX(0)}.wizard-content div.sections div.wizard-section div.wizard-step.past{transform:translateX(-100%)}.wizard-content div.sections div.wizard-section[data-display-steps=true]{max-width:68.29268vw}@media (max-width:48.9275em){.wizard-content div.sections div.wizard-section[data-display-steps=true]{max-width:67.68838vw}}@media (min-width:102.5em){.wizard-content div.sections div.wizard-section[data-display-steps=true]{max-width:1120px}}.wizard-content div.sections div.wizard-section.section-tutorial[data-display-steps=true]{max-width:66.46341vw}@media (max-width:48.9275em){.wizard-content div.sections div.wizard-section.section-tutorial[data-display-steps=true]{max-width:61.30268vw}}@media (min-width:102.5em){.wizard-content div.sections div.wizard-section.section-tutorial[data-display-steps=true]{max-width:1090px}}.wizard-content div.steps{position:absolute;right:0;top:0;bottom:0;width:19.512195122vw;background-color:#3a5674;padding-top:2.9268292683vw;background-image:url(../img/wizard-steps-bg.svg);background-repeat:no-repeat;background-position:bottom;background-size:19.512195122vw;transition:transform .25s linear,opacity .25s linear}@media (min-width:102.5em){.wizard-content div.steps{width:320px}}@media (max-width:48.9275em){.wizard-content div.steps{width:26.8199233716vw}}@media (min-width:102.5em){.wizard-content div.steps{padding-top:48px}}@media (max-width:48.9275em){.wizard-content div.steps{padding-top:4.0868454662vw}}@media (min-width:102.5em){.wizard-content div.steps{background-size:320px}}@media (max-width:48.9275em){.wizard-content div.steps{background-size:26.8199233716vw}}.wizard-content div.steps ul{padding:0;margin:0}.wizard-content div.steps ul li{display:flex;align-items:flex-start;margin:0 0 2.9268292683vw;padding:0 1.4634146341vw 0 0;perspective:1000px}@media (min-width:102.5em){.wizard-content div.steps ul li{margin-bottom:48px}}@media (max-width:48.9275em){.wizard-content div.steps ul li{margin-bottom:3.0651340996vw}}@media (min-width:102.5em){.wizard-content div.steps ul li{padding-right:24px}}@media (max-width:48.9275em){.wizard-content div.steps ul li{padding-right:1.5325670498vw}}.wizard-content div.steps ul li input[type=checkbox]{display:none}.wizard-content div.steps ul li div.step-number{position:relative;width:3.9024390244vw;min-width:3.9024390244vw;max-width:3.9024390244vw;height:3.9024390244vw;min-height:3.9024390244vw;max-height:3.9024390244vw;margin-top:-.487804878vw;display:flex;align-items:center;justify-content:center;transform:translateX(-50%);transform-style:preserve-3d;transition:transform .5s linear}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number{width:64px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number{width:8.1736909323vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number{min-width:64px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number{min-width:8.1736909323vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number{max-width:64px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number{max-width:8.1736909323vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number{height:64px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number{height:8.1736909323vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number{min-height:64px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number{min-height:8.1736909323vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number{max-height:64px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number{max-height:8.1736909323vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number{margin-top:-8px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number{margin-top:-1.0217113665vw}}.wizard-content div.steps ul li div.step-number span{position:absolute;left:.487804878vw;top:.487804878vw;width:2.9268292683vw;min-width:2.9268292683vw;max-width:2.9268292683vw;height:2.9268292683vw;min-height:2.9268292683vw;max-height:2.9268292683vw;border-radius:2.9268292683vw;border:.0609756098vw solid #e6e6e6;background-color:#fff;color:#50ade2;display:flex;align-items:center;justify-content:center;transition:border-width .25s linear,border-color .25s linear,transform .25s linear;-webkit-backface-visibility:hidden;backface-visibility:hidden}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number span{left:8px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number span{left:1.0217113665vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number span{top:8px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number span{top:1.0217113665vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number span{width:48px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number span{width:6.1302681992vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number span{min-width:48px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number span{min-width:6.1302681992vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number span{max-width:48px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number span{max-width:6.1302681992vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number span{height:48px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number span{height:6.1302681992vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number span{min-height:48px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number span{min-height:6.1302681992vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number span{max-height:48px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number span{max-height:6.1302681992vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number span{border-radius:48px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number span{border-radius:6.1302681992vw}}.wizard-content div.steps ul li div.step-number span.back{transform:rotateY(180deg)}.wizard-content div.steps ul li div.step-number span.back img{width:.9756097561vw;min-width:.9756097561vw;max-width:.9756097561vw;height:auto}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number span.back img{width:16px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number span.back img{width:2.0434227331vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number span.back img{min-width:16px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number span.back img{min-width:2.0434227331vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.step-number span.back img{max-width:16px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.step-number span.back img{max-width:2.0434227331vw}}.wizard-content div.steps ul li.current div.step-number span{background:linear-gradient(135.29deg,#62c5f1 7.95%,#50ade2 101.07%);color:#fff;border:.487804878vw solid #fff;transform:translate(-12.5%,-12.5%)}.wizard-content div.steps ul li.current div.step-number span.back{transform:translate(-12.5%,-12.5%) rotateY(180deg)}@media (min-width:102.5em){.wizard-content div.steps ul li.current div.step-number span{border:8px solid #fff}}.wizard-content div.steps ul li.current div.description h3{color:#fff}.wizard-content div.steps ul li.complete div.step-number{transform:translateX(-50%) rotateY(180deg)}.wizard-content div.steps ul li.complete div.step-number span{background:linear-gradient(135.29deg,#62c5f1 7.95%,#50ade2 101.07%);color:#fff;border:0 solid hsla(0,0%,100%,0)}.wizard-content div.steps ul li div.description{margin-left:-.487804878vw}@media (min-width:102.5em){.wizard-content div.steps ul li div.description{margin-left:-8px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.description{margin-left:-2.5542784163vw}}.wizard-content div.steps ul li div.description h3{padding:0;color:hsla(0,0%,100%,.5);font-weight:700;font-size:1em;line-height:1.5em;margin:.7317073171vw 0 .487804878vw;transition:margin-top .25s linear}@media (min-width:102.5em){.wizard-content div.steps ul li div.description h3{margin-top:12px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.description h3{margin-top:1.5325670498vw}}@media (min-width:102.5em){.wizard-content div.steps ul li div.description h3{margin-bottom:8px}}@media (max-width:48.9275em){.wizard-content div.steps ul li div.description h3{margin-bottom:1.0217113665vw}}.wizard-content div.steps ul li div.description div.description-container{max-height:0;overflow:hidden;transition:max-height .25s linear}.wizard-content div.steps ul li div.description div.description-container p{opacity:0;margin:0;padding:0;font-size:.875em;color:hsla(0,0%,100%,.7);line-height:1.5em;transition:opacity .25s linear}.wizard-content div.steps ul li input[type=checkbox]:checked+div.description h3{margin-top:0}.wizard-content div.steps ul li input[type=checkbox]:checked+div.description div.description-container{max-height:8.5365853659vw}@media (min-width:102.5em){.wizard-content div.steps ul li input[type=checkbox]:checked+div.description div.description-container{max-height:140px}}@media (max-width:48.9275em){.wizard-content div.steps ul li input[type=checkbox]:checked+div.description div.description-container{max-height:17.8799489144vw}}.wizard-content div.steps ul li input[type=checkbox]:checked+div.description div.description-container p{opacity:1}.wizard-content footer{display:flex;height:5.8536585366vw;margin-right:19.512195122vw;padding:0 7.3170731707vw;align-items:center;justify-content:space-between;border-top:1px solid #e6e6e6;transition:margin-right .25s linear}@media (min-width:102.5em){.wizard-content footer{height:96px}}@media (max-width:48.9275em){.wizard-content footer{height:12.2605363985vw}}@media (min-width:102.5em){.wizard-content footer{margin-right:320px}}@media (max-width:48.9275em){.wizard-content footer{margin-right:26.8199233716vw}}@media (min-width:102.5em){.wizard-content footer{padding-bottom:0}}@media (max-width:48.9275em){.wizard-content footer{padding-bottom:0}}@media (min-width:102.5em){.wizard-content footer{padding-top:0}}@media (max-width:48.9275em){.wizard-content footer{padding-top:0}}@media (min-width:102.5em){.wizard-content footer{padding-left:120px}}@media (max-width:48.9275em){.wizard-content footer{padding-left:7.662835249vw}}@media (min-width:102.5em){.wizard-content footer{padding-right:120px}}@media (max-width:48.9275em){.wizard-content footer{padding-right:7.662835249vw}}.wizard-content footer img.logo{width:3.9024390244vw;height:auto}@media (min-width:102.5em){.wizard-content footer img.logo{width:64px}}@media (max-width:48.9275em){.wizard-content footer img.logo{width:8.1736909323vw}}.wizard-content footer a{font-style:normal;font-weight:500;font-size:1em;display:flex;align-items:center;justify-content:center;letter-spacing:.0457317073vw;text-transform:uppercase;text-decoration:none;color:#50abe0;transition:opacity .25s linear,background .25s linear}@media (min-width:102.5em){.wizard-content footer a{letter-spacing:.75px}}@media (max-width:48.9275em){.wizard-content footer a{letter-spacing:.0957854406vw}}.wizard-content footer a.disabled{color:#b3b3b3;pointer-events:none}.wizard-content footer a.invisible{opacity:0;pointer-events:none}.wizard-content footer nav{display:flex}.wizard-content footer nav a{margin-left:.6097560976vw;padding:.9146341463vw 2.1341463415vw}@media (min-width:102.5em){.wizard-content footer nav a{margin-left:10px}}@media (max-width:48.9275em){.wizard-content footer nav a{margin-left:1.2771392082vw}}@media (min-width:102.5em){.wizard-content footer nav a{padding-bottom:15px}}@media (max-width:48.9275em){.wizard-content footer nav a{padding-bottom:1.1494252874vw}}@media (min-width:102.5em){.wizard-content footer nav a{padding-top:15px}}@media (max-width:48.9275em){.wizard-content footer nav a{padding-top:1.1494252874vw}}@media (min-width:102.5em){.wizard-content footer nav a{padding-left:35px}}@media (max-width:48.9275em){.wizard-content footer nav a{padding-left:3.0651340996vw}}@media (min-width:102.5em){.wizard-content footer nav a{padding-right:35px}}@media (max-width:48.9275em){.wizard-content footer nav a{padding-right:3.0651340996vw}}.wizard-content footer nav a.hidden{display:none}.wizard-content footer nav a.next,.wizard-content footer nav a.return{color:#fff;border-radius:6.0975609756vw;background:linear-gradient(180deg,#62c5f1,#50ade2)}@media (min-width:102.5em){.wizard-content footer nav a.next,.wizard-content footer nav a.return{border-radius:100px}}@media (max-width:48.9275em){.wizard-content footer nav a.next,.wizard-content footer nav a.return{border-radius:6.3856960409vw}}.wizard-content footer nav a.next.disabled,.wizard-content footer nav a.return.disabled{background:linear-gradient(180deg,#f0f0f0,#e0e0e0)}.wizard-step{padding:0 7.3170731707vw;display:flex;flex-direction:column;justify-content:center;flex:1}@media (min-width:102.5em){.wizard-step{padding-bottom:0}}@media (max-width:48.9275em){.wizard-step{padding-bottom:0}}@media (min-width:102.5em){.wizard-step{padding-top:0}}@media (max-width:48.9275em){.wizard-step{padding-top:0}}@media (min-width:102.5em){.wizard-step{padding-left:120px}}@media (max-width:48.9275em){.wizard-step{padding-left:7.662835249vw}}@media (min-width:102.5em){.wizard-step{padding-right:120px}}@media (max-width:48.9275em){.wizard-step{padding-right:7.662835249vw}}.wizard-step .intro{margin-bottom:3.6585365854vw}.wizard-step .intro h1{line-height:1.2;margin-bottom:2.4390243902vw}@media (min-width:102.5em){.wizard-step .intro h1{margin-bottom:40px}}@media (max-width:48.9275em){.wizard-step .intro h1{margin-bottom:2.5542784163vw}}@media (min-width:102.5em){.wizard-step .intro{margin-bottom:60px}}@media (max-width:48.9275em){.wizard-step .intro{margin-bottom:3.8314176245vw}}.wizard-step .intro p{padding:0;margin:0 0 1.0975609756vw;font-size:1.125em;text-align:left}@media (min-width:102.5em){.wizard-step .intro p{margin-bottom:18px}}@media (max-width:48.9275em){.wizard-step .intro p{margin-bottom:1.1494252874vw}}.wizard-step .intro p:last-of-type{margin-bottom:0}div.wizard-section.section-tutorial[data-display-steps=true] .wizard-step-tutorial{padding:0 5.487804878vw 0 7.3170731707vw}@media (min-width:102.5em){div.wizard-section.section-tutorial[data-display-steps=true] .wizard-step-tutorial{padding-left:120px}}@media (max-width:48.9275em){div.wizard-section.section-tutorial[data-display-steps=true] .wizard-step-tutorial{padding-left:7.662835249vw}}@media (min-width:102.5em){div.wizard-section.section-tutorial[data-display-steps=true] .wizard-step-tutorial{padding-top:0}}@media (max-width:48.9275em){div.wizard-section.section-tutorial[data-display-steps=true] .wizard-step-tutorial{padding-top:0}}@media (min-width:102.5em){div.wizard-section.section-tutorial[data-display-steps=true] .wizard-step-tutorial{padding-right:90px}}@media (max-width:48.9275em){div.wizard-section.section-tutorial[data-display-steps=true] .wizard-step-tutorial{padding-right:0}}@media (min-width:102.5em){div.wizard-section.section-tutorial[data-display-steps=true] .wizard-step-tutorial{padding-bottom:0}}@media (max-width:48.9275em){div.wizard-section.section-tutorial[data-display-steps=true] .wizard-step-tutorial{padding-bottom:0}}.wizard-step-select div.step-contents{margin-bottom:2.4390243902vw}@media (min-width:102.5em){.wizard-step-select div.step-contents{margin-bottom:40px}}@media (max-width:48.9275em){.wizard-step-select div.step-contents{margin-bottom:2.5542784163vw}}.wizard-step-select div.step-contents:last-of-type{margin-bottom:0}.wizard-step-select .intro{text-align:center}.wizard-step-select ul{display:flex;flex-wrap:wrap;padding:0;margin:0;justify-content:center;align-items:center}.wizard-step-select ul li{position:relative;display:block;padding:0;margin:1.8292682927vw 2.4390243902vw}@media (min-width:102.5em){.wizard-step-select ul li{margin-top:30px}}@media (max-width:48.9275em){.wizard-step-select ul li{margin-top:1.9157088123vw}}@media (min-width:102.5em){.wizard-step-select ul li{margin-bottom:30px}}@media (max-width:48.9275em){.wizard-step-select ul li{margin-bottom:1.9157088123vw}}@media (min-width:102.5em){.wizard-step-select ul li{margin-left:40px}}@media (max-width:48.9275em){.wizard-step-select ul li{margin-left:5.1085568327vw}}@media (min-width:102.5em){.wizard-step-select ul li{margin-right:40px}}@media (max-width:48.9275em){.wizard-step-select ul li{margin-right:5.1085568327vw}}.wizard-step-select ul li div.description{position:absolute;left:50%;transform:translate(-50%,24px) scale(.7);bottom:calc(100% + 30px);padding:1.4634146341vw;background-color:#3a5674;color:#fff;width:17.6829268293vw;display:flex;flex-direction:column;align-items:center;justify-content:center;border-radius:10px;box-shadow:0 0 10px 1px rgba(0,0,0,.25);opacity:0;pointer-events:none;transition:transform .125s linear,opacity .125s linear}@media (min-width:102.5em){.wizard-step-select ul li div.description{padding:24px}}@media (max-width:48.9275em){.wizard-step-select ul li div.description{padding:1.5325670498vw}}@media (min-width:102.5em){.wizard-step-select ul li div.description{width:290px}}@media (max-width:48.9275em){.wizard-step-select ul li div.description{width:32.5670498084vw}}.wizard-step-select ul li div.description div.arrow-down{position:absolute;bottom:-13px;width:0;height:0;left:calc(50% - 14px);border-left:14px solid transparent;border-right:14px solid transparent;border-top:14px solid #3a5674}.wizard-step-select ul li:hover div.description{opacity:1;transform:translate(-50%) scale(1)}ul.options.select-icons li:hover a img{transform:scale(1.2)}ul.options.select-icons li a{font-size:0}ul.options.select-icons li a img{transition:transform .2s linear;height:2.9268292683vw;width:auto}@media (min-width:102.5em){ul.options.select-icons li a img{height:48px}}@media (max-width:48.9275em){ul.options.select-icons li a img{height:3.0651340996vw}}ul.options.select-icons li a.select-s3 img{height:3.6585365854vw}@media (min-width:102.5em){ul.options.select-icons li a.select-s3 img{height:60px}}@media (max-width:48.9275em){ul.options.select-icons li a.select-s3 img{height:3.8314176245vw}}ul.options.select-buttons li{margin:1.8292682927vw .9146341463vw}@media (min-width:102.5em){ul.options.select-buttons li{margin-top:30px}}@media (max-width:48.9275em){ul.options.select-buttons li{margin-top:1.9157088123vw}}@media (min-width:102.5em){ul.options.select-buttons li{margin-bottom:30px}}@media (max-width:48.9275em){ul.options.select-buttons li{margin-bottom:1.9157088123vw}}@media (min-width:102.5em){ul.options.select-buttons li{margin-left:15px}}@media (max-width:48.9275em){ul.options.select-buttons li{margin-left:1.0217113665vw}}@media (min-width:102.5em){ul.options.select-buttons li{margin-right:15px}}@media (max-width:48.9275em){ul.options.select-buttons li{margin-right:1.0217113665vw}}ul.options.select-buttons li a{font-style:normal;font-weight:500;font-size:1em;display:flex;align-items:center;justify-content:center;letter-spacing:.0457317073vw;text-transform:uppercase;text-decoration:none;color:#fff;border-radius:6.0975609756vw;padding:.9146341463vw 2.1341463415vw;background:linear-gradient(180deg,#62c5f1,#50ade2)}@media (min-width:102.5em){ul.options.select-buttons li a{letter-spacing:.75px;padding:15px 35px}}ul.options.select-flat-buttons li{margin:1.8292682927vw .9146341463vw}@media (min-width:102.5em){ul.options.select-flat-buttons li{margin-top:30px}}@media (max-width:48.9275em){ul.options.select-flat-buttons li{margin-top:1.9157088123vw}}@media (min-width:102.5em){ul.options.select-flat-buttons li{margin-bottom:30px}}@media (max-width:48.9275em){ul.options.select-flat-buttons li{margin-bottom:1.9157088123vw}}@media (min-width:102.5em){ul.options.select-flat-buttons li{margin-left:15px}}@media (max-width:48.9275em){ul.options.select-flat-buttons li{margin-left:1.0217113665vw}}@media (min-width:102.5em){ul.options.select-flat-buttons li{margin-right:15px}}@media (max-width:48.9275em){ul.options.select-flat-buttons li{margin-right:1.0217113665vw}}ul.options.select-flat-buttons li a{font-style:normal;font-weight:500;font-size:1.5em;letter-spacing:.0457317073vw;text-transform:uppercase;text-decoration:none;border-bottom:1px dotted #50ade2;color:#50ade2}@media (min-width:102.5em){ul.options.select-flat-buttons li a{letter-spacing:.75px}}.wizard-step-video{padding:0}.wizard-step-video .step-contents .video,.wizard-step-video .step-contents .video iframe{position:absolute;top:0;left:0;width:100%;height:100%}@-webkit-keyframes logo-rotate{0%{transform:rotateY(0deg)}to{transform:rotateY(-1turn)}}@keyframes logo-rotate{0%{transform:rotateY(0deg)}to{transform:rotateY(-1turn)}}@-webkit-keyframes logo-rotate-x{0%{transform:rotateX(0deg)}to{transform:rotateX(-1turn)}}@keyframes logo-rotate-x{0%{transform:rotateX(0deg)}to{transform:rotateX(-1turn)}}@-webkit-keyframes logo-rotate-z{0%{transform:rotate(-1turn)}to{transform:rotate(0deg)}}@keyframes logo-rotate-z{0%{transform:rotate(-1turn)}to{transform:rotate(0deg)}}.wizard-step-form div.intro{margin-bottom:1.8292682927vw}@media (min-width:102.5em){.wizard-step-form div.intro{margin-bottom:30px}}@media (max-width:48.9275em){.wizard-step-form div.intro{margin-bottom:1.9157088123vw}}.wizard-step-form form{display:flex;flex-direction:column}.wizard-step-form form div.form-field{display:flex;flex-direction:column;border:1px solid #f3f3f3;background-color:#f3f3f3;padding:1.2195121951vw;border-radius:.9756097561vw;margin-bottom:1.2195121951vw}@media (min-width:102.5em){.wizard-step-form form div.form-field{padding:20px}}@media (max-width:48.9275em){.wizard-step-form form div.form-field{padding:1.2771392082vw}}@media (min-width:102.5em){.wizard-step-form form div.form-field{border-radius:16px}}@media (max-width:48.9275em){.wizard-step-form form div.form-field{border-radius:1.0217113665vw}}@media (min-width:102.5em){.wizard-step-form form div.form-field{margin-bottom:20px}}@media (max-width:48.9275em){.wizard-step-form form div.form-field{margin-bottom:1.2771392082vw}}.wizard-step-form form div.form-field:last-of-type{margin-bottom:0}.wizard-step-form form div.form-field:focus-within{border:1px solid #50ade2}.wizard-step-form form div.form-field label{font-weight:500;font-size:.75em;line-height:1em;text-transform:uppercase;color:#3a5674;margin-bottom:.487804878vw}@media (min-width:102.5em){.wizard-step-form form div.form-field label{margin-bottom:8px}}@media (max-width:48.9275em){.wizard-step-form form div.form-field label{margin-bottom:.5108556833vw}}.wizard-step-form form div.form-field input[type=password],.wizard-step-form form div.form-field input[type=text]{box-shadow:none;padding:0;border:0;background:none;font-size:1.125em}.wizard-step-form form div.form-field input[type=password]::-webkit-input-placeholder,.wizard-step-form form div.form-field input[type=text]::-webkit-input-placeholder{color:rgba(0,0,0,.125)}.wizard-step-form form div.form-field input[type=password]::-moz-placeholder,.wizard-step-form form div.form-field input[type=text]::-moz-placeholder{color:rgba(0,0,0,.125)}.wizard-step-form form div.form-field input[type=password]:-ms-input-placeholder,.wizard-step-form form div.form-field input[type=text]:-ms-input-placeholder{color:rgba(0,0,0,.125)}.wizard-step-form form div.form-field input[type=password]::-ms-input-placeholder,.wizard-step-form form div.form-field input[type=text]::-ms-input-placeholder{color:rgba(0,0,0,.125)}.wizard-step-form form div.form-field input[type=password]::placeholder,.wizard-step-form form div.form-field input[type=text]::placeholder{color:rgba(0,0,0,.125)}.wizard-step-form form div.form-field select{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:0;padding:0;background:transparent;outline:0;font-size:1.125em}.wizard-step-form form div.form-field select:focus{outline:0}.wizard-step-form form div.form-field.field-checkbox{background:none;flex-direction:row;align-items:flex-start;padding:1.2195121951vw 0;border:1px solid #fff}@media (min-width:102.5em){.wizard-step-form form div.form-field.field-checkbox{padding-bottom:20px}}@media (max-width:48.9275em){.wizard-step-form form div.form-field.field-checkbox{padding-bottom:1.2771392082vw}}@media (min-width:102.5em){.wizard-step-form form div.form-field.field-checkbox{padding-top:20px}}@media (max-width:48.9275em){.wizard-step-form form div.form-field.field-checkbox{padding-top:1.2771392082vw}}@media (min-width:102.5em){.wizard-step-form form div.form-field.field-checkbox{padding-left:0}}@media (max-width:48.9275em){.wizard-step-form form div.form-field.field-checkbox{padding-left:0}}@media (min-width:102.5em){.wizard-step-form form div.form-field.field-checkbox{padding-right:0}}@media (max-width:48.9275em){.wizard-step-form form div.form-field.field-checkbox{padding-right:0}}.wizard-step-form form div.form-field.field-checkbox div.checkbox{margin-right:1.2195121951vw}@media (min-width:102.5em){.wizard-step-form form div.form-field.field-checkbox div.checkbox{margin-right:20px}}@media (max-width:48.9275em){.wizard-step-form form div.form-field.field-checkbox div.checkbox{margin-right:1.2771392082vw}}.wizard-step-form form div.form-field.field-checkbox div.title{padding-top:.3048780488vw;margin-right:1.2195121951vw;white-space:nowrap;font-size:1em;font-weight:500}@media (min-width:102.5em){.wizard-step-form form div.form-field.field-checkbox div.title{padding-top:5px}}@media (max-width:48.9275em){.wizard-step-form form div.form-field.field-checkbox div.title{padding-top:.6385696041vw}}@media (min-width:102.5em){.wizard-step-form form div.form-field.field-checkbox div.title{margin-right:20px}}@media (max-width:48.9275em){.wizard-step-form form div.form-field.field-checkbox div.title{margin-right:1.2771392082vw}}.wizard-step-form form div.form-field.field-checkbox div.description{padding-top:.3048780488vw;font-size:1em;font-weight:300}@media (min-width:102.5em){.wizard-step-form form div.form-field.field-checkbox div.description{padding-top:5px}}@media (max-width:48.9275em){.wizard-step-form form div.form-field.field-checkbox div.description{padding-top:.6385696041vw;display:none}}.wizard-step-form .progress{position:absolute;left:0;right:0;bottom:0;top:0;display:flex;flex-direction:column;align-items:center;justify-content:center;opacity:0;pointer-events:none;transition:opacity .25s linear;perspective:100em}.wizard-step-form .progress h3{color:#50abe0;margin-bottom:3.0487804878vw;font-size:1.625em}@media (min-width:102.5em){.wizard-step-form .progress h3{margin-bottom:50px}}.wizard-step-form .progress div.logo-spinner{-webkit-animation:logo-rotate 2s;animation:logo-rotate 2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:linear;animation-timing-function:linear}.wizard-step-form .progress div.logo-spinner img{width:7.3170731707vw;height:auto}@media (min-width:102.5em){.wizard-step-form .progress div.logo-spinner img{width:120px}}.wizard-step-form.processing .progress{opacity:1}.wizard-step-form.processing div.step-contents{-webkit-filter:blur(5px);filter:blur(5px)}.wizard-step-test{justify-content:flex-start}.wizard-step-test div.step-contents{margin-top:3.0487804878vw}@media (min-width:102.5em){.wizard-step-test div.step-contents{margin-top:50px}}@media (max-width:48.9275em){.wizard-step-test div.step-contents{margin-top:6.3856960409vw}}.wizard-step-test div.step-contents div.intro{margin-bottom:1.8292682927vw}@media (min-width:102.5em){.wizard-step-test div.step-contents div.intro{margin-bottom:30px}}@media (max-width:48.9275em){.wizard-step-test div.step-contents div.intro{margin-bottom:1.9157088123vw}}.wizard-step-test div.step-contents div.start-buttons{display:flex;justify-content:center;margin-bottom:1.8292682927vw}@media (max-width:48.9275em){.wizard-step-test div.step-contents div.start-buttons{margin-bottom:1.9157088123vw}}.wizard-step-test div.step-contents div.start-buttons a{font-style:normal;font-weight:500;font-size:1em;display:flex;align-items:center;justify-content:center;letter-spacing:.0457317073vw;text-transform:uppercase;text-decoration:none;color:#fff;border-radius:6.0975609756vw;padding:.9146341463vw 2.1341463415vw;background:linear-gradient(180deg,#62c5f1,#50ade2)}@media (min-width:102.5em){.wizard-step-test div.step-contents div.start-buttons a{letter-spacing:.75px;padding:15px 35px}}@media (min-width:102.5em){.wizard-step-test div.step-contents div.start-buttons{margin-bottom:30px}}.wizard-step-test div.step-contents ul.tests>li{border:1px solid #f3f3f3;background-color:#f3f3f3;border-radius:.9756097561vw;padding:1.2195121951vw;margin-bottom:20xp;display:flex;transition:opacity .25s linear}@media (min-width:102.5em){.wizard-step-test div.step-contents ul.tests>li{border-radius:16px}}@media (max-width:48.9275em){.wizard-step-test div.step-contents ul.tests>li{border-radius:1.0217113665vw}}@media (min-width:102.5em){.wizard-step-test div.step-contents ul.tests>li{padding:20px}}@media (max-width:48.9275em){.wizard-step-test div.step-contents ul.tests>li{padding:1.2771392082vw}}@media (min-width:102.5em){.wizard-step-test div.step-contents ul.tests>li{margin-bottom:20xp}}@media (max-width:48.9275em){.wizard-step-test div.step-contents ul.tests>li{margin-bottom:1.2771392082vw}}.wizard-step-test div.step-contents ul.tests>li.hidden{opacity:0}.wizard-step-test div.step-contents ul.tests>li div.icon{width:1.4634146341vw;min-width:1.4634146341vw;max-width:1.4634146341vw;height:1.4634146341vw;min-height:1.4634146341vw;max-height:1.4634146341vw;display:flex;justify-content:center;align-items:center;margin-right:.6097560976vw}@media (min-width:102.5em){.wizard-step-test div.step-contents ul.tests>li div.icon{width:24px}}@media (max-width:48.9275em){.wizard-step-test div.step-contents ul.tests>li div.icon{width:3.0651340996vw}}@media (min-width:102.5em){.wizard-step-test div.step-contents ul.tests>li div.icon{min-width:24px}}@media (max-width:48.9275em){.wizard-step-test div.step-contents ul.tests>li div.icon{min-width:3.0651340996vw}}@media (min-width:102.5em){.wizard-step-test div.step-contents ul.tests>li div.icon{max-width:24px}}@media (max-width:48.9275em){.wizard-step-test div.step-contents ul.tests>li div.icon{max-width:3.0651340996vw}}@media (min-width:102.5em){.wizard-step-test div.step-contents ul.tests>li div.icon{height:24px}}@media (max-width:48.9275em){.wizard-step-test div.step-contents ul.tests>li div.icon{height:3.0651340996vw}}@media (min-width:102.5em){.wizard-step-test div.step-contents ul.tests>li div.icon{min-height:24px}}@media (max-width:48.9275em){.wizard-step-test div.step-contents ul.tests>li div.icon{min-height:3.0651340996vw}}@media (min-width:102.5em){.wizard-step-test div.step-contents ul.tests>li div.icon{max-height:24px}}@media (max-width:48.9275em){.wizard-step-test div.step-contents ul.tests>li div.icon{max-height:3.0651340996vw}}@media (min-width:102.5em){.wizard-step-test div.step-contents ul.tests>li div.icon{margin-right:10px}}@media (max-width:48.9275em){.wizard-step-test div.step-contents ul.tests>li div.icon{margin-right:1.2771392082vw}}.wizard-step-test div.step-contents ul.tests>li div.icon img{display:none;width:100%;height:auto}.wizard-step-test div.step-contents ul.tests>li.waiting div.icon{perspective:100em}.wizard-step-test div.step-contents ul.tests>li.waiting div.icon img.waiting{display:block;-webkit-animation:logo-rotate-z 1s;animation:logo-rotate-z 1s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:linear;animation-timing-function:linear}.wizard-step-test div.step-contents ul.tests>li.error>div.icon>img.error,.wizard-step-test div.step-contents ul.tests>li.success>div.icon>img.success,.wizard-step-test div.step-contents ul.tests>li.warning>div.icon>img.warning{display:block}.wizard-step-test div.step-contents ul.tests>li div.description h3{margin:.243902439vw 0;padding:0;font-size:1.125em}@media (min-width:102.5em){.wizard-step-test div.step-contents ul.tests>li div.description h3{margin-top:4px}}@media (max-width:48.9275em){.wizard-step-test div.step-contents ul.tests>li div.description h3{margin-top:0}}@media (min-width:102.5em){.wizard-step-test div.step-contents ul.tests>li div.description h3{margin-bottom:4px}}@media (max-width:48.9275em){.wizard-step-test div.step-contents ul.tests>li div.description h3{margin-bottom:0}}@media (min-width:102.5em){.wizard-step-test div.step-contents ul.tests>li div.description h3{margin-left:0}}@media (max-width:48.9275em){.wizard-step-test div.step-contents ul.tests>li div.description h3{margin-left:0}}@media (min-width:102.5em){.wizard-step-test div.step-contents ul.tests>li div.description h3{margin-right:0}}@media (max-width:48.9275em){.wizard-step-test div.step-contents ul.tests>li div.description h3{margin-right:0}}.wizard-step-test div.step-contents ul.tests>li div.description p{margin:0 0 4px;padding:0;font-size:1em}.wizard-step-test div.step-contents ul.tests>li div.description ul.errors{margin-left:1.2195121951vw;list-style:disc}@media (min-width:102.5em){.wizard-step-test div.step-contents ul.tests>li div.description ul.errors{margin-left:20px}}@media (max-width:48.9275em){.wizard-step-test div.step-contents ul.tests>li div.description ul.errors{margin-left:1.2771392082vw}}.wizard-step-test div.step-contents ul.tests>li div.description ul.errors li{display:list-item;font-size:1em}.wizard-step-tutorial{justify-content:flex-start}.wizard-step-tutorial div.tutorial{padding-top:2.4390243902vw;margin-bottom:60px}@media (min-width:102.5em){.wizard-step-tutorial div.tutorial{padding-top:40px}}@media (max-width:48.9275em){.wizard-step-tutorial div.tutorial{padding-top:5.1085568327vw}}.wizard-step-tutorial div.tutorial h2,.wizard-step-tutorial div.tutorial h3{margin-top:2.4390243902vw}@media (min-width:102.5em){.wizard-step-tutorial div.tutorial h2,.wizard-step-tutorial div.tutorial h3{margin-top:40px}}@media (max-width:48.9275em){.wizard-step-tutorial div.tutorial h2,.wizard-step-tutorial div.tutorial h3{margin-top:2.5542784163vw}}.wizard-step-tutorial div.tutorial p{padding:0;margin:0 0 .6097560976vw;font-size:1.125em}@media (min-width:102.5em){.wizard-step-tutorial div.tutorial p{margin-bottom:10px}}@media (max-width:48.9275em){.wizard-step-tutorial div.tutorial p{margin-bottom:1.2771392082vw}}.wizard-step-tutorial div.tutorial p:last-of-type{margin-bottom:0}.wizard-step-tutorial div.tutorial figure{padding:0;margin:2.4390243902vw 0}@media (min-width:102.5em){.wizard-step-tutorial div.tutorial figure{margin-top:40px}}@media (max-width:48.9275em){.wizard-step-tutorial div.tutorial figure{margin-top:2.5542784163vw}}@media (min-width:102.5em){.wizard-step-tutorial div.tutorial figure{margin-bottom:40px}}@media (max-width:48.9275em){.wizard-step-tutorial div.tutorial figure{margin-bottom:2.5542784163vw}}.wizard-step-tutorial div.tutorial figure img{width:100%;height:auto}.wizard-step-tutorial div.tutorial ul{margin-left:20px;margin-bottom:30px;list-style:disc}.wizard-step-tutorial div.tutorial ul li{display:list-item}.wizard-modal.no-steps div.steps-background{opacity:0}.wizard-modal.no-steps div.wizard-content div.steps{transform:translateX(calc(100% + 1.95122vw));opacity:0}@media (min-width:102.5em){.wizard-modal.no-steps div.wizard-content div.steps{transform:translateX(calc(100% + 32px))}}.wizard-modal.no-steps div.wizard-content footer{margin-right:0}.wizard-modal.no-animations *{transition:none!important}.wizard-invisible .wizard-modal{transform:scale(.8);opacity:0}#s3-importer-progress{padding:24px;background:#ddd;border-radius:8px}#s3-importer-progress .button-whoa{background:#a42929!important;border-color:#e62a2a #a42929 #a42929!important;box-shadow:0 1px 0 #a42929!important;color:#fff!important;text-decoration:none!important;text-shadow:0 -1px 1px #a42929,1px 0 1px #a42929,0 1px 1px #a42929,-1px 0 1px #a42929!important}#s3-importer-progress>button{margin-top:20px}.s3-importer-progress-container{position:relative;width:100%;height:32px;background:#aaa;border-radius:16px;overflow:hidden;background-image:url(../img/candy-stripe.svg)}#s3-importer-progress-bar{background-color:#4f90c4;height:100%}.tool-disabled{padding:10px 15px;border:1px solid #df8403}.force-cancel-help{margin-top:20px}.wp-cli-callout{padding:24px;background:#ddd;margin-top:20px;border-radius:8px}.wp-cli-callout>h3{margin:0;padding:0;font-size:14px}.wp-cli-callout>code{background-color:#bbb;padding:10px 15px;margin-top:5px;display:inline-block}#s3-importer-options{padding:24px;background:#e7e7e7;margin-top:20px;border-radius:8px}#s3-importer-options h3{margin:0;padding:0;font-size:14px}#s3-importer-options ul{padding:0;display:flex;flex-direction:column;margin:20px 0 0}#s3-importer-options ul li{display:flex;margin-bottom:30px}#s3-importer-options ul li:last-of-type{margin-bottom:0}#s3-importer-options ul li>div:first-of-type{padding:10px 10px 20px 0;width:160px;min-width:160px;line-height:1.3;font-weight:600}#s3-importer-options ul li div.description{margin-top:8px}#s3-importer-options ul li div.option-ui{display:flex;align-items:center}#s3-importer-options ul li div.option-ui.option-ui-browser input[type=text]{width:40vw;margin-right:10px;padding:7px 11px;border-radius:4px}#s3-importer-options ul li div.option-ui.option-ui-browser input[type=text]:disabled{color:#000}#s3-timing-stats{display:none}#s3-importer-status-text{position:absolute;left:16px;top:0;bottom:0;right:16px;display:flex;align-items:center;color:#fff;font-weight:700}#s3-importer-thumbnails{position:relative;width:100%;height:150px;margin-bottom:15px}#s3-importer-thumbnails-container{position:absolute;left:0;top:0;right:0;bottom:0;overflow:hidden;-webkit-mask-image:linear-gradient(90deg,#ddd 0,hsla(0,0%,86.7%,0) 90%);mask-image:linear-gradient(90deg,#ddd 0,hsla(0,0%,86.7%,0) 90%)}#s3-importer-thumbnails-container img{width:150px;height:150px;max-width:150px;max-height:150px;border-radius:4px}#s3-importer-thumbnails-container>img{margin-right:10px}#s3-importer-thumbnails-fade{background:linear-gradient(90deg,#ddd 0,hsla(0,0%,86.7%,0) 90%);position:absolute;left:150px;top:0;right:0;bottom:0}@supports ((-webkit-mask-image:linear-gradient(to left,rgba(221,221,221,0) 0%,#dddddd 95%,#dddddd 100%)) or (mask-image:linear-gradient(to left,rgba(221,221,221,0) 0%,#dddddd 95%,#dddddd 100%))){#s3-importer-thumbnails-fade{display:none}}#s3-importer-thumbnails-cloud{position:absolute;right:20px;top:50%;transform:translateY(-50%)}.s3-importer-thumb{position:absolute;left:0;top:0;width:150px;min-width:150px;max-width:150px;height:150px;min-height:150px;max-height:150px;background-size:cover;background-position:50%;background-repeat:no-repeat;margin-right:10px;border-radius:4px;background-color:#888;transition:opacity .25s linear,transform .25s linear}.s3-importer-thumb.ilab-hidden{opacity:0;transform:scale(.7)}.s3-importer-image-icon{position:absolute;left:0;top:0;position:relative;width:150px;min-width:150px;max-width:150px;height:150px;min-height:150px;max-height:150px;display:flex;align-items:center;justify-content:center;transition:opacity .25s linear,transform .25s linear}.s3-importer-image-icon.ilab-hidden{opacity:0;transform:scale(.8)}.s3-importer-info-warning{border:1px solid orange;padding:24px;background:rgba(255,165,0,.125);margin-top:20px;border-radius:8px}.s3-importer-info-warning h4{padding:0;font-size:14px;margin:0 0 8px}
\ No newline at end of file
diff --git a/readme.txt b/readme.txt
index 4f90c5c2..b3541e2e 100755
--- a/readme.txt
+++ b/readme.txt
@@ -5,7 +5,7 @@ Requires at least: 4.4
Tested up to: 5.3
License: GPLv3 or later
License URI: http://www.gnu.org/licenses/gpl-3.0.html
-Stable tag: 3.3.7
+Stable tag: 3.3.8
Requires PHP: 5.6.4
Automatically store media on Amazon S3, Google Cloud Storage, DigitalOcean Spaces + others. Serve CSS/JS assets through CDNs. Integrate with Imgix.
@@ -108,6 +108,11 @@ No, I'm just one very enthusiastic customer.
== Changelog ==
+= 3.3.8 =
+
+* Fix for errors on Task Manager pages caused by a library conflict with other plugins.
+* When using the post editor after migrating an existing site to cloud storage, images appeared broken if the original images were deleted from the server. This is now fixed.
+
= 3.3.7 =
* Massive improvement to background tasks performance. Processing times reduced by 50 to 90% in most cases.
diff --git a/views/base/fields/image.blade.php b/views/base/fields/image.blade.php
new file mode 100755
index 00000000..6ef19e47
--- /dev/null
+++ b/views/base/fields/image.blade.php
@@ -0,0 +1,65 @@
+
+
+
+ @if ($description)
+
{!! $description !!}
+ @endif
+ @if($conditions)
+
+ @endif
+
+
+
+