diff --git a/.doc/contributing-guide/2025.contributing-stickers-side-by-side.png b/.doc/contributing-guide/2025.contributing-stickers-side-by-side.png deleted file mode 100644 index b27f8bdc38..0000000000 Binary files a/.doc/contributing-guide/2025.contributing-stickers-side-by-side.png and /dev/null differ diff --git a/.doc/contributing-guide/contributing-stickers-side-by-side.png b/.doc/contributing-guide/contributing-stickers-side-by-side.png new file mode 100644 index 0000000000..bf3a58cbcf Binary files /dev/null and b/.doc/contributing-guide/contributing-stickers-side-by-side.png differ diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml new file mode 100644 index 0000000000..cde9c390b1 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -0,0 +1,60 @@ +name: "Bug report" +description: "Report a bug that you identified in iTop" +type: bug +body: + - type: markdown + attributes: + value: | + Please explain why you're creating this issue : + - Are you willing to create a PR for the bug fix ? If so, we'll indicate in the issue if we're interested in it. + - Then, please describe how to reproduce the issue. + + - type: dropdown + id: willing_to_pr + attributes: + label: Are you willing to create (at a later stage) a PR for that? + options: + - 'Yes' + - 'No' + validations: + required: true + + - type: input + id: itop_version + attributes: + label: iTop version + description: "Complete iTop version (e.g., 3.2.3)" + validations: + required: false + + - type: input + id: php_version + attributes: + label: PHP version + description: "Complete PHP version (e.g., 8.4.20)" + validations: + required: false + + - type: textarea + id: reproduction_steps + attributes: + label: Reproduction procedure + description: | + Please explain step by step how to reproduce the issue on a standard iTop Community. + If it requires a custom datamodel, provide the minimal XML delta to reproduce it. + placeholder: | + 1. First go there + 2. Then do that + 3. ... + 4. Finally, see that... (what is expected and what is actually happening) + validations: + required: false + + - type: upload + id: additional_info + attributes: + label: Additional information (if needed) + description: "Add/drag and drop screenshots, logs or any files that can be relevant for your issue." + validations: + required: false + accept: ".png, .jpg, .jpeg, .gif, .webp, .log, .txt, .json, .csv, .xml, .zip" diff --git a/.github/ISSUE_TEMPLATE/enhancement.yml b/.github/ISSUE_TEMPLATE/enhancement.yml new file mode 100644 index 0000000000..e66458f087 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/enhancement.yml @@ -0,0 +1,47 @@ +name: "Enhancement suggestion" +description: "Suggest an improvement to iTop" +type: feature +body: + - type: markdown + attributes: + value: | + Please explain why you're creating this issue : + - Please describe what's your improvement proposition. + - Then tell us if you're willing to create a PR for this enhancement ? If so, we'll indicate in the issue if we're interested in it. + + - type: textarea + id: enhancement_details + attributes: + label: Enhancement details + description: | + Please explain what you want to improve, and your proposition to make it better. + If it requires a custom datamodel, provide the minimal XML delta to reproduce it. + validations: + required: false + + - type: input + id: itop_version + attributes: + label: iTop version (if appropriate) + description: "Complete iTop version (e.g., 3.2.3)" + validations: + required: false + + - type: dropdown + id: willing_to_pr + attributes: + label: Are you willing to create (at a later stage) a PR for that? + options: + - 'Yes' + - 'No' + validations: + required: true + + - type: upload + id: additional_info + attributes: + label: Additional information (if needed) + description: "Add/drag and drop screenshots, logs or any files that can be relevant for your issue." + validations: + required: false + accept: ".png, .jpg, .jpeg, .gif, .webp, .log, .txt, .json, .csv, .xml, .zip" diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index bee8d1f055..0d087461f4 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,83 +1,81 @@ ## Base information -| Question | Answer -|---------------------------------------------------------------|-------- -| Related to a SourceForge thread / Another PR / Combodo ticket? | -| Type of change? | Bug fix / Enhancement / Translations +| Question | Answer +|----------------------------------------------------------------|-------- +| Related to a SourceForge thread / Another PR / A GitHub Issue / Combodo ticket? | | +| Type of change? | Bug fix / Enhancement / Translations + +| Question | Answer | +|---------------------------------------------------------------------------------|--------------------------------------| +| Related to a SourceForge thread / Another PR / A GitHub Issue / Combodo ticket? | | +| Type of change? | Bug fix / Enhancement / Translations | ## Symptom (bug) / Objective (enhancement) + - ## Reproduction procedure (bug) + 1. On iTop x.y.z 2. With PHP x.y.z -2. First go there -2. Then do that -3. ... -4. Finally, see that... +3. First go there +4. Then do that +5. ... +6. Finally, see that... (what is expected and what is actually happening) +## Reproduction procedure (enhancement - if needed) + + ## Cause (bug) + - ## Proposed solution (bug and enhancement) + - ## Checklist before requesting a review + + - [ ] I have performed a self-review of my code - [ ] I have tested all changes I made on an iTop instance - [ ] I have added a unit test, otherwise I have explained why I couldn't -- [ ] Is the PR clear and detailed enough so anyone can understand digging in the code? - -## Checklist of things to do before PR is ready to merge - - -- [ ] ... -- [ ] ... -- [ ] ... +- [ ] Is the PR clear and detailed enough so anyone can understand without digging in the code? \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ce0202aab9..954cf93c91 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,30 +4,33 @@ You want to contribute to iTop? Many thanks to you! 🎉 👍 Here are some guidelines that will help us integrate your work! - - +## Contributions ### Subjects + You are welcome to create pull requests on any of those subjects: * 🐛 bug fix * 🌐 translation / i18n / l10n +* 🚸 enhancement -If you want to implement a **new feature**, please [create a corresponding ticket](https://sourceforge.net/p/itop/tickets/new/) for review. -If you ever want to begin implementation, do so in a fork, and add a link to the corresponding commits in the ticket. +But before creating a PR, please [create a corresponding issue][itop-issues] for review. +We should review within two weeks, and get back to you to indicate if we're interested in your proposal or not. +If you don't create an issue, you won't know if we're interested in your contribution, and you may spend time coding something that won't be accepted. +If you ever want to begin implementation, do so in a fork, and add a link to the corresponding commits in the issue. For all **security related subjects**, please see our [security policy](SECURITY.md). -All **datamodel modification** should be done in an extension. Beware that such change would -impact all existing customers, and could prevent them from -upgrading! -Combodo has a long experience of datamodel changes: they are very disruptive! +All **datamodel modification** should be done in an extension. Beware that such change would +impact all existing customers, and could prevent them from upgrading! +Combodo has a long experience of datamodel changes: they are very disruptive! This is why we avoid them in iTop core, especially the changes on existing objects/fields. -If you have an idea you're sure would benefit to all of iTop users, you may -[create a corresponding ticket](https://sourceforge.net/p/itop/tickets/new/) to submit it, but be warned that there are lots of good +If you have an idea you're sure would benefit to all of iTop users, you may +[create a corresponding issue][itop-issues] to submit it, but be warned that there are lots of good reasons to refuse such changes. ### 📄 License and copyright + iTop is distributed under the AGPL-3.0 license (see the [license.txt] file). The iTop repository is divided in three parts: iTop (mainly PHP/JS/XML sources and dictionaries), images, and third-party libraries. @@ -37,48 +40,33 @@ Anyhow, you are encouraged to signal your contribution by the mean of `@author` If you want to use another license or keep the code ownership (copyright), you may [create an extension][wiki new ext]. [license.txt]: https://github.com/Combodo/iTop/blob/develop/license.txt -[wiki new ext]: https://www.itophub.io/wiki/page?id=latest%3Acustomization%3Astart#by_writing_your_own_extension +[itop-issues]: https://github.com/Combodo/iTop/issues + +[wiki new ext]: https://www.itophub.io/wiki/page?id=latest%3Acustomization%3Astart#by_writing_your_own_extension ## 🔀 iTop branch model When we first start with Git, we were using the [GitFlow](https://nvie.com/posts/a-successful-git-branching-model/) branch model. As - there was some confusions about branches to use for current developed release and previous maintained release, and also because we were - using just a very few of the GitFlow commands, we decided to add just a little modification to this branch model : since april 2020 - we don't have a `master` branch anymore. +there was some confusions about branches to use for current developed release and previous maintained release, and also because we were +using just a very few of the GitFlow commands, we decided to add just a little modification to this branch model : since April 2020 +we don't have a `master` branch anymore. -Here are the branches we use and their meaning : +Here are the branches we use and their meaning : - `develop`: ongoing development version -- `release/*`: if present, that means we are working on a alpha/beta/rc version for shipping - `support/*`: maintenance branches for older versions For example, if no version is currently prepared for shipping we could have: -- `develop` containing future 3.1.0 version -- `support/3.0`: 3.0.x maintenance version -- `support/2.7`: 2.7.x maintenance version -- `support/2.6`: 2.6.x maintenance version +- `develop` containing future 3.3.0 version +- `support/3.2`: 3.2.x maintenance version -In this example, when 3.1.0-beta is shipped that will become: - -- `develop`: future 3.2.0 version -- `release/3.1.0`: 3.1.0-beta -- `support/3.0`: 3.0.x maintenance version -- `support/2.7`: 2.7.x maintenance version -- `support/2.6`: 2.6.x maintenance version - -And when 3.1.0 final will be out: - -- `develop`: future 3.2.0 version -- `support/3.1`: 3.1.x maintenance version (will host developments for 3.1.1) -- `support/3.0`: 3.0.x maintenance version -- `support/2.7`: 2.7.x maintenance version -- `support/2.6`: 2.6.x maintenance version - -Also note that we have a "micro-version" concept : each of those versions have a very small amount of modifications. They are made from - `support/*` branches as well. For example 2.6.2-1 and 2.6.2-2 were made from the `support/2.6.2` branch. +And when 3.3.0 will be out: +- `develop`: future 3.4.0 version +- `support/3.3`: 3.3.x maintenance version (will host developments for 3.3.1) +- `support/3.2`: 3.2.x maintenance version ## Coding @@ -92,12 +80,11 @@ A [dedicated page](https://www.itophub.io/wiki/page?id=latest%3Acustomization%3A 2. Create a branch in this fork, based on the develop branch 3. Code ! -Do create a dedicated branch for each modification you want to propose : if you don't it will be very hard to merge back your work ! +Do create a dedicated branch for each modification you want to propose : if you don't, it will be very hard to merge back your work ! -Most of the time you should based your developments on the develop branch. +Most of the time you should base your developments on the develop branch. That may be different if you want to fix a bug, please use develop anyway and ask in your PR if rebase is possible. - ### 🎨 PHP styleguide Please follow [our guidelines](https://www.itophub.io/wiki/page?id=latest%3Acustomization%3Acoding_standards). @@ -106,7 +93,7 @@ Please follow [our guidelines](https://www.itophub.io/wiki/page?id=latest%3Acust Please create tests that covers as much as possible the code you're submitting. -Our tests are located in the `test/` directory, containing a PHPUnit config file : `phpunit.xml.dist`. +Our tests are located in the `tests/` directory, containing a PHPUnit config file : `phpunit.xml.dist`. ### Git Commit Messages @@ -138,14 +125,14 @@ When your code is working, please: * Rebase your branch on our repo last commit, * Create a pull request. _Detailed procedure to work on fork and create PR is available [in GitHub help pages](https://help.github.com/articles/creating-a-pull-request-from-a-fork/)_. * Pull request description: mind to add all the information useful to understand why you're suggesting this modification and anything necessary to dive into your work. Especially: - - Bugfixes: exact steps to reproduce the bug (given/when/then), description of the bug cause and what solution is implemented - - Enhancements: use cases, implementation details if needed -* Mind to check the "[Allow edits from maintainers](https://docs.github.com/en/github-ae@latest/pull-requests/collaborating-with-pull-requests/working-with-forks/allowing-changes-to-a-pull-request-branch-created-from-a-fork)" option ! (note that if you are working with an org fork, this option [won't be available](https://github.com/orgs/community/discussions/5634)) - + - Bugfixes: exact steps to reproduce the bug (given/when/then), description of the bug cause and what solution is implemented + - Enhancements: use cases, implementation details if needed +* Mind to check the "[Allow edits from maintainers](https://docs.github.com/en/github-ae@latest/pull-requests/collaborating-with-pull-requests/working-with-forks/allowing-changes-to-a-pull-request-branch-created-from-a-fork)" option ! (note that if you are working with an org fork, this + option [won't be available](https://github.com/orgs/community/discussions/5634)) ## 🙏 We are thankful -We are thankful for all your contributions to the iTop universe! As a thank you gift, we will send stickers to every iTop (& extensions) contributors! +We are thankful for all your contributions to the iTop universe! As a thank-you gift, we will send stickers to every iTop (& extensions) contributors! We have one sticker per contribution type. You might get multiple stickers with one contribution though :) @@ -159,6 +146,6 @@ We have one sticker per contribution type. You might get multiple stickers with * Beta tester: Test and give feedback on beta releases * Extension developer: Develop and publish an extension -Here is the design of each stickers for year 2024: +Here is the design of each sticker: -![iTop stickers 2025](.doc/contributing-guide/2025.contributing-stickers-side-by-side.png) +![iTop stickers](.doc/contributing-guide/contributing-stickers-side-by-side.png) \ No newline at end of file diff --git a/composer.json b/composer.json index c4e22c1996..b582b6e8ee 100644 --- a/composer.json +++ b/composer.json @@ -4,7 +4,7 @@ "type": "project", "license": "AGPL-3.0-only", "require": { - "php": ">=8.1.0 <8.5.0", + "php": ">=8.2.0 <8.5.0", "ext-ctype": "*", "ext-dom": "*", "ext-gd": "*", @@ -15,18 +15,21 @@ "apereo/phpcas": "dev-master", "guzzlehttp/guzzle": "^7.5.1", "league/oauth2-google": "^4.0.1", - "nikic/php-parser": "^4.14.0", + "nikic/php-parser": "dev-master", "pear/archive_tar": "~1.4.14", "pelago/emogrifier": "^7.2.0", "psr/log": "^3.0.0", "scssphp/scssphp": "dev-combodo/1.x", "symfony/console": "~6.4.0", "symfony/dotenv": "~6.4.0", + "symfony/form": "^6.4", "symfony/framework-bundle": "~6.4.0", "symfony/http-foundation": "~6.4.0", "symfony/http-kernel": "~6.4.0", "symfony/runtime": "~6.4.0", + "symfony/security-csrf": "~6.4.0", "symfony/twig-bundle": "~6.4.0", + "symfony/validator" : "~6.4.0", "symfony/var-dumper": "~6.4.0", "symfony/yaml": "~6.4.0", "symfony/mailer": "~6.4.0", @@ -40,6 +43,10 @@ "symfony/web-profiler-bundle": "~6.4.0" }, "repositories": [ + { + "type": "vcs", + "url": "https://github.com/Combodo/PHP-Parser" + }, { "type": "vcs", "url": "https://github.com/EsupPortail/phpCAS" @@ -60,7 +67,7 @@ }, "config": { "platform": { - "php": "8.1.0" + "php": "8.2.0" }, "vendor-dir": "lib", "preferred-install": { @@ -80,7 +87,6 @@ "sources" ], "exclude-from-classmap": [ - "application/twigextension.class.inc.php", "core/oql/build/PHP/", "core/apc-emulation.php", "application/startup.inc.php", @@ -100,7 +106,7 @@ "extra": { "symfony": { "allow-contrib": false, - "require": "3.4.*" + "require": "6.4.*" }, "runtime": { "dotenv_path": "resources/symfony/.env" diff --git a/composer.lock b/composer.lock index 6a95f3e034..ca84500c7d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "eebbdc6c10a479b0e62fc18d88496f5c", + "content-hash": "1cca58a0e26794fb9c546a001f7f7de8", "packages": [ { "name": "apereo/phpcas", @@ -236,16 +236,16 @@ }, { "name": "firebase/php-jwt", - "version": "v7.0.2", + "version": "v7.0.5", "source": { "type": "git", - "url": "https://github.com/firebase/php-jwt.git", - "reference": "5645b43af647b6947daac1d0f659dd1fbe8d3b65" + "url": "https://github.com/googleapis/php-jwt.git", + "reference": "47ad26bab5e7c70ae8a6f08ed25ff83631121380" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/5645b43af647b6947daac1d0f659dd1fbe8d3b65", - "reference": "5645b43af647b6947daac1d0f659dd1fbe8d3b65", + "url": "https://api.github.com/repos/googleapis/php-jwt/zipball/47ad26bab5e7c70ae8a6f08ed25ff83631121380", + "reference": "47ad26bab5e7c70ae8a6f08ed25ff83631121380", "shasum": "" }, "require": { @@ -253,6 +253,7 @@ }, "require-dev": { "guzzlehttp/guzzle": "^7.4", + "phpfastcache/phpfastcache": "^9.2", "phpspec/prophecy-phpunit": "^2.0", "phpunit/phpunit": "^9.5", "psr/cache": "^2.0||^3.0", @@ -292,10 +293,10 @@ "php" ], "support": { - "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v7.0.2" + "issues": "https://github.com/googleapis/php-jwt/issues", + "source": "https://github.com/googleapis/php-jwt/tree/v7.0.5" }, - "time": "2025-12-16T22:17:28+00:00" + "time": "2026-04-01T20:38:03+00:00" }, { "name": "guzzlehttp/guzzle", @@ -508,16 +509,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "2.8.0", + "version": "2.9.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "21dc724a0583619cd1652f673303492272778051" + "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", - "reference": "21dc724a0583619cd1652f673303492272778051", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/7d0ed42f28e42d61352a7a79de682e5e67fec884", + "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884", "shasum": "" }, "require": { @@ -533,6 +534,7 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "http-interop/http-factory-tests": "0.9.0", + "jshttp/mime-db": "1.54.0.1", "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "suggest": { @@ -604,7 +606,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.8.0" + "source": "https://github.com/guzzle/psr7/tree/2.9.0" }, "funding": [ { @@ -620,7 +622,7 @@ "type": "tidelift" } ], - "time": "2025-08-23T21:21:41+00:00" + "time": "2026-03-10T16:41:02+00:00" }, { "name": "league/oauth2-client", @@ -689,20 +691,20 @@ }, { "name": "league/oauth2-google", - "version": "4.1.0", + "version": "4.2.0", "source": { "type": "git", "url": "https://github.com/thephpleague/oauth2-google.git", - "reference": "8b9bb43740ac6d994aca881a35f7bacbe98c0ffb" + "reference": "72be69505f890ea8b6d4e716f619b3c10a1f5010" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/oauth2-google/zipball/8b9bb43740ac6d994aca881a35f7bacbe98c0ffb", - "reference": "8b9bb43740ac6d994aca881a35f7bacbe98c0ffb", + "url": "https://api.github.com/repos/thephpleague/oauth2-google/zipball/72be69505f890ea8b6d4e716f619b3c10a1f5010", + "reference": "72be69505f890ea8b6d4e716f619b3c10a1f5010", "shasum": "" }, "require": { - "league/oauth2-client": "^2.0", + "league/oauth2-client": "^2.0 || ^3.0", "php": "^7.3 || ^8.0" }, "require-dev": { @@ -738,42 +740,54 @@ ], "support": { "issues": "https://github.com/thephpleague/oauth2-google/issues", - "source": "https://github.com/thephpleague/oauth2-google/tree/4.1.0" + "source": "https://github.com/thephpleague/oauth2-google/tree/4.2.0" }, - "time": "2025-12-15T12:24:14+00:00" + "time": "2026-03-09T09:36:58+00:00" }, { "name": "nikic/php-parser", - "version": "v4.19.5", + "version": "dev-master", "source": { "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "51bd93cc741b7fc3d63d20b6bdcd99fdaa359837" + "url": "https://github.com/Combodo/PHP-Parser.git", + "reference": "b27e577f70d2114b8ba96105e403017919a8611b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/51bd93cc741b7fc3d63d20b6bdcd99fdaa359837", - "reference": "51bd93cc741b7fc3d63d20b6bdcd99fdaa359837", + "url": "https://api.github.com/repos/Combodo/PHP-Parser/zipball/b27e577f70d2114b8ba96105e403017919a8611b", + "reference": "b27e577f70d2114b8ba96105e403017919a8611b", "shasum": "" }, "require": { + "ext-ctype": "*", + "ext-json": "*", "ext-tokenizer": "*", - "php": ">=7.1" + "php": ">=7.4" }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^9.0" }, + "default-branch": true, "bin": [ "bin/php-parse" ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, "autoload": { "psr-4": { "PhpParser\\": "lib/PhpParser" } }, - "notification-url": "https://packagist.org/downloads/", + "autoload-dev": { + "psr-4": { + "PhpParser\\": "test/PhpParser/" + } + }, "license": [ "BSD-3-Clause" ], @@ -788,10 +802,9 @@ "php" ], "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.5" + "source": "https://github.com/Combodo/PHP-Parser/tree/master" }, - "time": "2025-12-06T11:45:25+00:00" + "time": "2026-03-31T15:49:45+00:00" }, { "name": "pear/archive_tar", @@ -1726,16 +1739,16 @@ }, { "name": "symfony/cache", - "version": "v6.4.33", + "version": "v6.4.36", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "5b088fa41eb9568748dc255c45e4054c387ba73b" + "reference": "5b94fba945d1f9e7929cffd50e7a17f1ac36f10b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/5b088fa41eb9568748dc255c45e4054c387ba73b", - "reference": "5b088fa41eb9568748dc255c45e4054c387ba73b", + "url": "https://api.github.com/repos/symfony/cache/zipball/5b94fba945d1f9e7929cffd50e7a17f1ac36f10b", + "reference": "5b94fba945d1f9e7929cffd50e7a17f1ac36f10b", "shasum": "" }, "require": { @@ -1802,7 +1815,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v6.4.33" + "source": "https://github.com/symfony/cache/tree/v6.4.36" }, "funding": [ { @@ -1822,7 +1835,7 @@ "type": "tidelift" } ], - "time": "2026-01-27T15:05:20+00:00" + "time": "2026-03-30T14:52:43+00:00" }, { "name": "symfony/cache-contracts", @@ -1902,16 +1915,16 @@ }, { "name": "symfony/config", - "version": "v6.4.32", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "d445badf0ad2c2a492e38c0378c39997a56ef97b" + "reference": "ce9cb0c0d281aaf188b802d4968e42bfb60701e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/d445badf0ad2c2a492e38c0378c39997a56ef97b", - "reference": "d445badf0ad2c2a492e38c0378c39997a56ef97b", + "url": "https://api.github.com/repos/symfony/config/zipball/ce9cb0c0d281aaf188b802d4968e42bfb60701e9", + "reference": "ce9cb0c0d281aaf188b802d4968e42bfb60701e9", "shasum": "" }, "require": { @@ -1957,7 +1970,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v6.4.32" + "source": "https://github.com/symfony/config/tree/v6.4.34" }, "funding": [ { @@ -1977,20 +1990,20 @@ "type": "tidelift" } ], - "time": "2026-01-13T08:40:30+00:00" + "time": "2026-02-24T17:34:50+00:00" }, { "name": "symfony/console", - "version": "v6.4.32", + "version": "v6.4.36", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "0bc2199c6c1f05276b05956f1ddc63f6d7eb5fc3" + "reference": "9f481cfb580db8bcecc9b2d4c63f3e13df022ad5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/0bc2199c6c1f05276b05956f1ddc63f6d7eb5fc3", - "reference": "0bc2199c6c1f05276b05956f1ddc63f6d7eb5fc3", + "url": "https://api.github.com/repos/symfony/console/zipball/9f481cfb580db8bcecc9b2d4c63f3e13df022ad5", + "reference": "9f481cfb580db8bcecc9b2d4c63f3e13df022ad5", "shasum": "" }, "require": { @@ -2055,7 +2068,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.32" + "source": "https://github.com/symfony/console/tree/v6.4.36" }, "funding": [ { @@ -2075,20 +2088,20 @@ "type": "tidelift" } ], - "time": "2026-01-13T08:45:59+00:00" + "time": "2026-03-27T15:30:51+00:00" }, { "name": "symfony/css-selector", - "version": "v6.4.24", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "9b784413143701aa3c94ac1869a159a9e53e8761" + "reference": "b0314c186f1464de048cce58979ff1625ca88bbb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/9b784413143701aa3c94ac1869a159a9e53e8761", - "reference": "9b784413143701aa3c94ac1869a159a9e53e8761", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/b0314c186f1464de048cce58979ff1625ca88bbb", + "reference": "b0314c186f1464de048cce58979ff1625ca88bbb", "shasum": "" }, "require": { @@ -2124,7 +2137,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.4.24" + "source": "https://github.com/symfony/css-selector/tree/v6.4.34" }, "funding": [ { @@ -2144,20 +2157,20 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2026-02-16T08:37:21+00:00" }, { "name": "symfony/dependency-injection", - "version": "v6.4.32", + "version": "v6.4.36", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "b17882e933c4c606620247b6708ab53aa3b88753" + "reference": "cd7881a6dc84b780411199cd0584e1a53a3b9ba7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/b17882e933c4c606620247b6708ab53aa3b88753", - "reference": "b17882e933c4c606620247b6708ab53aa3b88753", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/cd7881a6dc84b780411199cd0584e1a53a3b9ba7", + "reference": "cd7881a6dc84b780411199cd0584e1a53a3b9ba7", "shasum": "" }, "require": { @@ -2209,7 +2222,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v6.4.32" + "source": "https://github.com/symfony/dependency-injection/tree/v6.4.36" }, "funding": [ { @@ -2229,7 +2242,7 @@ "type": "tidelift" } ], - "time": "2026-01-23T10:54:33+00:00" + "time": "2026-03-30T16:39:36+00:00" }, { "name": "symfony/deprecation-contracts", @@ -2300,16 +2313,16 @@ }, { "name": "symfony/dotenv", - "version": "v6.4.30", + "version": "v6.4.36", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "924edbc9631b75302def0258ed1697948b17baf6" + "reference": "cae019cc92a46fe9e498ea011107f26bdf5d897f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/924edbc9631b75302def0258ed1697948b17baf6", - "reference": "924edbc9631b75302def0258ed1697948b17baf6", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/cae019cc92a46fe9e498ea011107f26bdf5d897f", + "reference": "cae019cc92a46fe9e498ea011107f26bdf5d897f", "shasum": "" }, "require": { @@ -2354,7 +2367,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v6.4.30" + "source": "https://github.com/symfony/dotenv/tree/v6.4.36" }, "funding": [ { @@ -2374,20 +2387,20 @@ "type": "tidelift" } ], - "time": "2025-11-14T17:33:48+00:00" + "time": "2026-03-30T07:25:04+00:00" }, { "name": "symfony/error-handler", - "version": "v6.4.32", + "version": "v6.4.36", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "8c18400784fcb014dc73c8d5601a9576af7f8ad4" + "reference": "2ea68f0e1835ad6a126f93bbc14cd236c10ab361" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/8c18400784fcb014dc73c8d5601a9576af7f8ad4", - "reference": "8c18400784fcb014dc73c8d5601a9576af7f8ad4", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/2ea68f0e1835ad6a126f93bbc14cd236c10ab361", + "reference": "2ea68f0e1835ad6a126f93bbc14cd236c10ab361", "shasum": "" }, "require": { @@ -2433,7 +2446,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.4.32" + "source": "https://github.com/symfony/error-handler/tree/v6.4.36" }, "funding": [ { @@ -2453,20 +2466,20 @@ "type": "tidelift" } ], - "time": "2026-01-19T19:28:19+00:00" + "time": "2026-03-10T15:56:14+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.4.32", + "version": "v6.4.36", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "99d7e101826e6610606b9433248f80c1997cd20b" + "reference": "fc828863e26ceec86e2513b5e46aa0b149d76b69" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/99d7e101826e6610606b9433248f80c1997cd20b", - "reference": "99d7e101826e6610606b9433248f80c1997cd20b", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/fc828863e26ceec86e2513b5e46aa0b149d76b69", + "reference": "fc828863e26ceec86e2513b5e46aa0b149d76b69", "shasum": "" }, "require": { @@ -2517,7 +2530,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.32" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.36" }, "funding": [ { @@ -2537,7 +2550,7 @@ "type": "tidelift" } ], - "time": "2026-01-05T11:13:48+00:00" + "time": "2026-03-30T11:18:01+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -2617,16 +2630,16 @@ }, { "name": "symfony/filesystem", - "version": "v6.4.30", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "441c6b69f7222aadae7cbf5df588496d5ee37789" + "reference": "01ffe0411b842f93c571e5c391f289c3fdd498c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/441c6b69f7222aadae7cbf5df588496d5ee37789", - "reference": "441c6b69f7222aadae7cbf5df588496d5ee37789", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/01ffe0411b842f93c571e5c391f289c3fdd498c3", + "reference": "01ffe0411b842f93c571e5c391f289c3fdd498c3", "shasum": "" }, "require": { @@ -2663,7 +2676,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.30" + "source": "https://github.com/symfony/filesystem/tree/v6.4.34" }, "funding": [ { @@ -2683,20 +2696,20 @@ "type": "tidelift" } ], - "time": "2025-11-26T14:43:45+00:00" + "time": "2026-02-24T17:51:06+00:00" }, { "name": "symfony/finder", - "version": "v6.4.33", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "24965ca011dac87431729640feef8bcf7b5523e0" + "reference": "9590e86be1d1c57bfbb16d0dd040345378c20896" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/24965ca011dac87431729640feef8bcf7b5523e0", - "reference": "24965ca011dac87431729640feef8bcf7b5523e0", + "url": "https://api.github.com/repos/symfony/finder/zipball/9590e86be1d1c57bfbb16d0dd040345378c20896", + "reference": "9590e86be1d1c57bfbb16d0dd040345378c20896", "shasum": "" }, "require": { @@ -2731,7 +2744,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.33" + "source": "https://github.com/symfony/finder/tree/v6.4.34" }, "funding": [ { @@ -2751,20 +2764,121 @@ "type": "tidelift" } ], - "time": "2026-01-26T13:03:48+00:00" + "time": "2026-01-28T15:16:37+00:00" }, { - "name": "symfony/framework-bundle", - "version": "v6.4.33", + "name": "symfony/form", + "version": "v6.4.36", "source": { "type": "git", - "url": "https://github.com/symfony/framework-bundle.git", - "reference": "9ef2d0b63b9e855ba351e770a603d89699115801" + "url": "https://github.com/symfony/form.git", + "reference": "3a38a81150400f0a486f8963e21a195311b30b27" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/9ef2d0b63b9e855ba351e770a603d89699115801", - "reference": "9ef2d0b63b9e855ba351e770a603d89699115801", + "url": "https://api.github.com/repos/symfony/form/zipball/3a38a81150400f0a486f8963e21a195311b30b27", + "reference": "3a38a81150400f0a486f8963e21a195311b30b27", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/options-resolver": "^5.4|^6.0|^7.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/polyfill-mbstring": "~1.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/doctrine-bridge": "<5.4.21|>=6,<6.2.7", + "symfony/error-handler": "<5.4", + "symfony/framework-bundle": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3|>=7.0,<7.0.3", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<6.3" + }, + "require-dev": { + "doctrine/collections": "^1.0|^2.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/html-sanitizer": "^6.1|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", + "symfony/security-core": "^6.2|^7.0", + "symfony/security-csrf": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4.35|~6.3.12|^6.4.3|^7.0.3", + "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/validator": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Form\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows to easily create, process and reuse HTML forms", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/form/tree/v6.4.36" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-13T14:59:02+00:00" + }, + { + "name": "symfony/framework-bundle", + "version": "v6.4.36", + "source": { + "type": "git", + "url": "https://github.com/symfony/framework-bundle.git", + "reference": "147b02cfa45dcc74a290462551f5ee5c7fa8ab17" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/147b02cfa45dcc74a290462551f5ee5c7fa8ab17", + "reference": "147b02cfa45dcc74a290462551f5ee5c7fa8ab17", "shasum": "" }, "require": { @@ -2884,7 +2998,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v6.4.33" + "source": "https://github.com/symfony/framework-bundle/tree/v6.4.36" }, "funding": [ { @@ -2904,20 +3018,20 @@ "type": "tidelift" } ], - "time": "2026-01-26T14:46:41+00:00" + "time": "2026-03-25T17:41:29+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.4.33", + "version": "v6.4.35", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "f1a490cc9d595ba7ebe684220e625d1e472ad278" + "reference": "cffffd0a2c037117b742b4f8b379a22a2a33f6d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f1a490cc9d595ba7ebe684220e625d1e472ad278", - "reference": "f1a490cc9d595ba7ebe684220e625d1e472ad278", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/cffffd0a2c037117b742b4f8b379a22a2a33f6d2", + "reference": "cffffd0a2c037117b742b4f8b379a22a2a33f6d2", "shasum": "" }, "require": { @@ -2965,7 +3079,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.33" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.35" }, "funding": [ { @@ -2985,20 +3099,20 @@ "type": "tidelift" } ], - "time": "2026-01-27T15:04:55+00:00" + "time": "2026-03-06T11:15:58+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.4.33", + "version": "v6.4.36", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "73fa5c999d7f741ca544a97d3c791cc97890ae4d" + "reference": "4087ec02119de450e9ebb60806d69c6bb8c6e468" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/73fa5c999d7f741ca544a97d3c791cc97890ae4d", - "reference": "73fa5c999d7f741ca544a97d3c791cc97890ae4d", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/4087ec02119de450e9ebb60806d69c6bb8c6e468", + "reference": "4087ec02119de450e9ebb60806d69c6bb8c6e468", "shasum": "" }, "require": { @@ -3039,7 +3153,7 @@ "symfony/config": "^6.1|^7.0", "symfony/console": "^5.4|^6.0|^7.0", "symfony/css-selector": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4.1|^7.0.1", "symfony/dom-crawler": "^5.4|^6.0|^7.0", "symfony/expression-language": "^5.4|^6.0|^7.0", "symfony/finder": "^5.4|^6.0|^7.0", @@ -3083,7 +3197,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.4.33" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.36" }, "funding": [ { @@ -3103,20 +3217,20 @@ "type": "tidelift" } ], - "time": "2026-01-28T10:02:13+00:00" + "time": "2026-03-31T20:38:11+00:00" }, { "name": "symfony/mailer", - "version": "v6.4.31", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "8835f93333474780fda1b987cae37e33c3e026ca" + "reference": "01b846f48e53ee4096692a383637a1fa4d577301" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/8835f93333474780fda1b987cae37e33c3e026ca", - "reference": "8835f93333474780fda1b987cae37e33c3e026ca", + "url": "https://api.github.com/repos/symfony/mailer/zipball/01b846f48e53ee4096692a383637a1fa4d577301", + "reference": "01b846f48e53ee4096692a383637a1fa4d577301", "shasum": "" }, "require": { @@ -3167,7 +3281,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.4.31" + "source": "https://github.com/symfony/mailer/tree/v6.4.34" }, "funding": [ { @@ -3187,20 +3301,20 @@ "type": "tidelift" } ], - "time": "2025-12-12T07:33:25+00:00" + "time": "2026-02-24T09:34:36+00:00" }, { "name": "symfony/mime", - "version": "v6.4.32", + "version": "v6.4.36", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "7409686879ca36c09fc970a5fa8ff6e93504dba4" + "reference": "9c31726137c70798f815fb98293ffb8a2a47694c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/7409686879ca36c09fc970a5fa8ff6e93504dba4", - "reference": "7409686879ca36c09fc970a5fa8ff6e93504dba4", + "url": "https://api.github.com/repos/symfony/mime/zipball/9c31726137c70798f815fb98293ffb8a2a47694c", + "reference": "9c31726137c70798f815fb98293ffb8a2a47694c", "shasum": "" }, "require": { @@ -3256,7 +3370,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.32" + "source": "https://github.com/symfony/mime/tree/v6.4.36" }, "funding": [ { @@ -3276,20 +3390,167 @@ "type": "tidelift" } ], - "time": "2026-01-04T11:53:14+00:00" + "time": "2026-03-30T09:31:23+00:00" }, { - "name": "symfony/polyfill-ctype", - "version": "v1.33.0", + "name": "symfony/options-resolver", + "version": "v6.4.30", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + "url": "https://github.com/symfony/options-resolver.git", + "reference": "eeaa8cabe54c7b3516938c72a4a161c0cc80a34f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/eeaa8cabe54c7b3516938c72a4a161c0cc80a34f", + "reference": "eeaa8cabe54c7b3516938c72a4a161c0cc80a34f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v6.4.30" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-12T13:06:53+00:00" + }, + { + "name": "symfony/password-hasher", + "version": "v6.4.32", + "source": { + "type": "git", + "url": "https://github.com/symfony/password-hasher.git", + "reference": "fbdfa5a2ca218ec8bb9029517426df2d780bdba9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/fbdfa5a2ca218ec8bb9029517426df2d780bdba9", + "reference": "fbdfa5a2ca218ec8bb9029517426df2d780bdba9", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "conflict": { + "symfony/security-core": "<5.4" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/security-core": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PasswordHasher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Robin Chalas", + "email": "robin.chalas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides password hashing utilities", + "homepage": "https://symfony.com", + "keywords": [ + "hashing", + "password" + ], + "support": { + "source": "https://github.com/symfony/password-hasher/tree/v6.4.32" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-01-01T21:24:53+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2", "shasum": "" }, "require": { @@ -3339,7 +3600,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.36.0" }, "funding": [ { @@ -3359,20 +3620,20 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-04-10T16:19:22+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.33.0", + "version": "v1.36.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" + "reference": "ad1b7b9092976d6c948b8a187cec9faaea9ec1df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/ad1b7b9092976d6c948b8a187cec9faaea9ec1df", + "reference": "ad1b7b9092976d6c948b8a187cec9faaea9ec1df", "shasum": "" }, "require": { @@ -3421,7 +3682,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.36.0" }, "funding": [ { @@ -3441,11 +3702,99 @@ "type": "tidelift" } ], - "time": "2025-06-27T09:58:17+00:00" + "time": "2026-04-10T16:19:22+00:00" + }, + { + "name": "symfony/polyfill-intl-icu", + "version": "v1.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-icu.git", + "reference": "3510b63d07376b04e57e27e82607d468bb134f78" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/3510b63d07376b04e57e27e82607d468bb134f78", + "reference": "3510b63d07376b04e57e27e82607d468bb134f78", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance and support of other locales than \"en\"" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Icu\\": "" + }, + "classmap": [ + "Resources/stubs" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's ICU-related data and classes", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "icu", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.36.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T16:50:15+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.33.0", + "version": "v1.36.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", @@ -3508,7 +3857,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.36.0" }, "funding": [ { @@ -3532,7 +3881,7 @@ }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.33.0", + "version": "v1.36.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", @@ -3593,7 +3942,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.36.0" }, "funding": [ { @@ -3617,16 +3966,16 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.33.0", + "version": "v1.36.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6a21eb99c6973357967f6ce3708cd55a6bec6315", + "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315", "shasum": "" }, "require": { @@ -3678,7 +4027,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.36.0" }, "funding": [ { @@ -3698,20 +4047,20 @@ "type": "tidelift" } ], - "time": "2024-12-23T08:48:59+00:00" + "time": "2026-04-10T17:25:58+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.33.0", + "version": "v1.36.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" + "reference": "3600c2cb22399e25bb226e4a135ce91eeb2a6149" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/3600c2cb22399e25bb226e4a135ce91eeb2a6149", + "reference": "3600c2cb22399e25bb226e4a135ce91eeb2a6149", "shasum": "" }, "require": { @@ -3758,7 +4107,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.36.0" }, "funding": [ { @@ -3778,20 +4127,191 @@ "type": "tidelift" } ], - "time": "2025-07-08T02:45:35+00:00" + "time": "2026-04-10T17:25:58+00:00" }, { - "name": "symfony/routing", + "name": "symfony/property-access", "version": "v6.4.32", "source": { "type": "git", - "url": "https://github.com/symfony/routing.git", - "reference": "0dc6253e864e71b486e8ba4970a56ab849106ebe" + "url": "https://github.com/symfony/property-access.git", + "reference": "6dfa655ac9e9860c05cabb287f34da86b18c237e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/0dc6253e864e71b486e8ba4970a56ab849106ebe", - "reference": "0dc6253e864e71b486e8ba4970a56ab849106ebe", + "url": "https://api.github.com/repos/symfony/property-access/zipball/6dfa655ac9e9860c05cabb287f34da86b18c237e", + "reference": "6dfa655ac9e9860c05cabb287f34da86b18c237e", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/property-info": "^6.4.32|~7.3.10|^7.4.4" + }, + "require-dev": { + "symfony/cache": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyAccess\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides functions to read and write from/to an object or array using a simple string notation", + "homepage": "https://symfony.com", + "keywords": [ + "access", + "array", + "extraction", + "index", + "injection", + "object", + "property", + "property-path", + "reflection" + ], + "support": { + "source": "https://github.com/symfony/property-access/tree/v6.4.32" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-01-05T08:25:17+00:00" + }, + { + "name": "symfony/property-info", + "version": "v6.4.34", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-info.git", + "reference": "916455e4c9dcddbebfd101f29d7983841c3564e0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-info/zipball/916455e4c9dcddbebfd101f29d7983841c3564e0", + "reference": "916455e4c9dcddbebfd101f29d7983841c3564e0", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/string": "^5.4|^6.0|^7.0" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "phpdocumentor/reflection-docblock": "<5.2|>=6", + "phpdocumentor/type-resolver": "<1.5.1", + "symfony/cache": "<5.4", + "symfony/dependency-injection": "<5.4|>=6.0,<6.4", + "symfony/serializer": "<5.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12|^2", + "phpdocumentor/reflection-docblock": "^5.2", + "phpstan/phpdoc-parser": "^1.0|^2.0", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/serializer": "^5.4|^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "dunglas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Extracts information about PHP class' properties using metadata of popular sources", + "homepage": "https://symfony.com", + "keywords": [ + "doctrine", + "phpdoc", + "property", + "symfony", + "type", + "validator" + ], + "support": { + "source": "https://github.com/symfony/property-info/tree/v6.4.34" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-02-13T09:42:46+00:00" + }, + { + "name": "symfony/routing", + "version": "v6.4.34", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "5ab3a3e1a03535ec5ca6ce2d39e4369a1096ae47" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/5ab3a3e1a03535ec5ca6ce2d39e4369a1096ae47", + "reference": "5ab3a3e1a03535ec5ca6ce2d39e4369a1096ae47", "shasum": "" }, "require": { @@ -3845,7 +4365,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.32" + "source": "https://github.com/symfony/routing/tree/v6.4.34" }, "funding": [ { @@ -3865,7 +4385,7 @@ "type": "tidelift" } ], - "time": "2026-01-12T08:31:19+00:00" + "time": "2026-02-24T17:34:50+00:00" }, { "name": "symfony/runtime", @@ -3950,6 +4470,168 @@ ], "time": "2025-12-05T10:55:13+00:00" }, + { + "name": "symfony/security-core", + "version": "v6.4.36", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-core.git", + "reference": "1b7db28bcc3655543abfe58764025aef563705cd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-core/zipball/1b7db28bcc3655543abfe58764025aef563705cd", + "reference": "1b7db28bcc3655543abfe58764025aef563705cd", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/event-dispatcher-contracts": "^2.5|^3", + "symfony/password-hasher": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/event-dispatcher": "<5.4", + "symfony/http-foundation": "<5.4", + "symfony/ldap": "<5.4", + "symfony/security-guard": "<5.4", + "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3|>=7.0,<7.0.3", + "symfony/validator": "<5.4" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "psr/container": "^1.1|^2.0", + "psr/log": "^1|^2|^3", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/ldap": "^5.4|^6.0|^7.0", + "symfony/string": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4.35|~6.3.12|^6.4.3|^7.0.3", + "symfony/validator": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Core\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Security Component - Core Library", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-core/tree/v6.4.36" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-31T01:40:43+00:00" + }, + { + "name": "symfony/security-csrf", + "version": "v6.4.31", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-csrf.git", + "reference": "52f62836fcb19cd351ef3a2aa9cf61a489e8990f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/52f62836fcb19cd351ef3a2aa9cf61a489e8990f", + "reference": "52f62836fcb19cd351ef3a2aa9cf61a489e8990f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/security-core": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony/http-foundation": "<5.4" + }, + "require-dev": { + "symfony/http-foundation": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Csrf\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Security Component - CSRF Library", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-csrf/tree/v6.4.31" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-12-17T22:32:13+00:00" + }, { "name": "symfony/service-contracts", "version": "v3.6.1", @@ -4039,16 +4721,16 @@ }, { "name": "symfony/string", - "version": "v6.4.30", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "50590a057841fa6bf69d12eceffce3465b9e32cb" + "reference": "2adaf4106f2ef4c67271971bde6d3fe0a6936432" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/50590a057841fa6bf69d12eceffce3465b9e32cb", - "reference": "50590a057841fa6bf69d12eceffce3465b9e32cb", + "url": "https://api.github.com/repos/symfony/string/zipball/2adaf4106f2ef4c67271971bde6d3fe0a6936432", + "reference": "2adaf4106f2ef4c67271971bde6d3fe0a6936432", "shasum": "" }, "require": { @@ -4104,7 +4786,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.30" + "source": "https://github.com/symfony/string/tree/v6.4.34" }, "funding": [ { @@ -4124,7 +4806,7 @@ "type": "tidelift" } ], - "time": "2025-11-21T18:03:05+00:00" + "time": "2026-02-08T20:44:54+00:00" }, { "name": "symfony/translation-contracts", @@ -4210,16 +4892,16 @@ }, { "name": "symfony/twig-bridge", - "version": "v6.4.32", + "version": "v6.4.36", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "1dcf980dd4f79885b986befdeb1c1bc0d6aedfc8" + "reference": "3ae963a108fd6fc14d09a7fe5e41fe64d8ac11ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/1dcf980dd4f79885b986befdeb1c1bc0d6aedfc8", - "reference": "1dcf980dd4f79885b986befdeb1c1bc0d6aedfc8", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/3ae963a108fd6fc14d09a7fe5e41fe64d8ac11ba", + "reference": "3ae963a108fd6fc14d09a7fe5e41fe64d8ac11ba", "shasum": "" }, "require": { @@ -4299,7 +4981,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v6.4.32" + "source": "https://github.com/symfony/twig-bridge/tree/v6.4.36" }, "funding": [ { @@ -4319,7 +5001,7 @@ "type": "tidelift" } ], - "time": "2026-01-03T23:03:08+00:00" + "time": "2026-03-30T09:31:23+00:00" }, { "name": "symfony/twig-bundle", @@ -4410,17 +5092,118 @@ "time": "2026-01-05T12:44:39+00:00" }, { - "name": "symfony/var-dumper", - "version": "v6.4.32", + "name": "symfony/validator", + "version": "v6.4.36", "source": { "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "131fc9915e0343052af5ed5040401b481ca192aa" + "url": "https://github.com/symfony/validator.git", + "reference": "14921e87b2bd69dfbd9757cdb1c6974a1316aac5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/131fc9915e0343052af5ed5040401b481ca192aa", - "reference": "131fc9915e0343052af5ed5040401b481ca192aa", + "url": "https://api.github.com/repos/symfony/validator/zipball/14921e87b2bd69dfbd9757cdb1c6974a1316aac5", + "reference": "14921e87b2bd69dfbd9757cdb1c6974a1316aac5", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php83": "^1.27", + "symfony/translation-contracts": "^2.5|^3" + }, + "conflict": { + "doctrine/annotations": "<1.13", + "doctrine/lexer": "<1.1", + "symfony/dependency-injection": "<5.4", + "symfony/expression-language": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/intl": "<5.4", + "symfony/property-info": "<5.4", + "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3|>=7.0,<7.0.3", + "symfony/yaml": "<5.4" + }, + "require-dev": { + "doctrine/annotations": "^1.13|^2", + "egulias/email-validator": "^2.1.10|^3|^4", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4.35|~6.3.12|^6.4.3|^7.0.3", + "symfony/yaml": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Validator\\": "" + }, + "exclude-from-classmap": [ + "/Tests/", + "/Resources/bin/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to validate values", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/validator/tree/v6.4.36" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-26T15:58:46+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v6.4.36", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "7c8ad9ce4faf6c8a99948e70ce02b601a0439782" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/7c8ad9ce4faf6c8a99948e70ce02b601a0439782", + "reference": "7c8ad9ce4faf6c8a99948e70ce02b601a0439782", "shasum": "" }, "require": { @@ -4475,7 +5258,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.32" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.36" }, "funding": [ { @@ -4495,20 +5278,20 @@ "type": "tidelift" } ], - "time": "2026-01-01T13:34:06+00:00" + "time": "2026-03-30T15:36:00+00:00" }, { "name": "symfony/var-exporter", - "version": "v6.4.26", + "version": "v6.4.36", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "466fcac5fa2e871f83d31173f80e9c2684743bfc" + "reference": "f9c4a9695a9e2bbc65c920e147d8d7ae28f8d79a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/466fcac5fa2e871f83d31173f80e9c2684743bfc", - "reference": "466fcac5fa2e871f83d31173f80e9c2684743bfc", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/f9c4a9695a9e2bbc65c920e147d8d7ae28f8d79a", + "reference": "f9c4a9695a9e2bbc65c920e147d8d7ae28f8d79a", "shasum": "" }, "require": { @@ -4556,7 +5339,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.4.26" + "source": "https://github.com/symfony/var-exporter/tree/v6.4.36" }, "funding": [ { @@ -4576,20 +5359,20 @@ "type": "tidelift" } ], - "time": "2025-09-11T09:57:09+00:00" + "time": "2026-03-10T15:06:19+00:00" }, { "name": "symfony/yaml", - "version": "v6.4.30", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "8207ae83da19ee3748d6d4f567b4d9a7c656e331" + "reference": "7bca30dabed7900a08c5ad4f1d6483f881a64d0f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/8207ae83da19ee3748d6d4f567b4d9a7c656e331", - "reference": "8207ae83da19ee3748d6d4f567b4d9a7c656e331", + "url": "https://api.github.com/repos/symfony/yaml/zipball/7bca30dabed7900a08c5ad4f1d6483f881a64d0f", + "reference": "7bca30dabed7900a08c5ad4f1d6483f881a64d0f", "shasum": "" }, "require": { @@ -4632,7 +5415,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.4.30" + "source": "https://github.com/symfony/yaml/tree/v6.4.34" }, "funding": [ { @@ -4652,20 +5435,20 @@ "type": "tidelift" } ], - "time": "2025-12-02T11:50:18+00:00" + "time": "2026-02-06T18:32:11+00:00" }, { "name": "tecnickcom/tcpdf", - "version": "6.10.1", + "version": "6.11.2", "source": { "type": "git", "url": "https://github.com/tecnickcom/TCPDF.git", - "reference": "7a2701251e5d52fc3d508fd71704683eb54f5939" + "reference": "e1e2ade18e574e963473f53271591edd8c0033ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tecnickcom/TCPDF/zipball/7a2701251e5d52fc3d508fd71704683eb54f5939", - "reference": "7a2701251e5d52fc3d508fd71704683eb54f5939", + "url": "https://api.github.com/repos/tecnickcom/TCPDF/zipball/e1e2ade18e574e963473f53271591edd8c0033ec", + "reference": "e1e2ade18e574e963473f53271591edd8c0033ec", "shasum": "" }, "require": { @@ -4715,7 +5498,7 @@ ], "support": { "issues": "https://github.com/tecnickcom/TCPDF/issues", - "source": "https://github.com/tecnickcom/TCPDF/tree/6.10.1" + "source": "https://github.com/tecnickcom/TCPDF/tree/6.11.2" }, "funding": [ { @@ -4723,20 +5506,20 @@ "type": "custom" } ], - "time": "2025-11-21T10:58:21+00:00" + "time": "2026-03-03T08:58:10+00:00" }, { "name": "thenetworg/oauth2-azure", - "version": "v2.2.4", + "version": "v2.2.5", "source": { "type": "git", "url": "https://github.com/TheNetworg/oauth2-azure.git", - "reference": "a897d60b6b127daa2f27b1b4e62e7af40829d02f" + "reference": "06f1aa023e18cc3ea80df6410c7c2dc5502a3655" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TheNetworg/oauth2-azure/zipball/a897d60b6b127daa2f27b1b4e62e7af40829d02f", - "reference": "a897d60b6b127daa2f27b1b4e62e7af40829d02f", + "url": "https://api.github.com/repos/TheNetworg/oauth2-azure/zipball/06f1aa023e18cc3ea80df6410c7c2dc5502a3655", + "reference": "06f1aa023e18cc3ea80df6410c7c2dc5502a3655", "shasum": "" }, "require": { @@ -4781,22 +5564,22 @@ ], "support": { "issues": "https://github.com/TheNetworg/oauth2-azure/issues", - "source": "https://github.com/TheNetworg/oauth2-azure/tree/v2.2.4" + "source": "https://github.com/TheNetworg/oauth2-azure/tree/v2.2.5" }, - "time": "2026-01-29T12:43:59+00:00" + "time": "2026-02-26T08:05:57+00:00" }, { "name": "twig/twig", - "version": "v3.23.0", + "version": "v3.24.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "a64dc5d2cc7d6cafb9347f6cd802d0d06d0351c9" + "reference": "a6769aefb305efef849dc25c9fd1653358c148f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/a64dc5d2cc7d6cafb9347f6cd802d0d06d0351c9", - "reference": "a64dc5d2cc7d6cafb9347f6cd802d0d06d0351c9", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/a6769aefb305efef849dc25c9fd1653358c148f0", + "reference": "a6769aefb305efef849dc25c9fd1653358c148f0", "shasum": "" }, "require": { @@ -4806,7 +5589,8 @@ "symfony/polyfill-mbstring": "^1.3" }, "require-dev": { - "phpstan/phpstan": "^2.0", + "php-cs-fixer/shim": "^3.0@stable", + "phpstan/phpstan": "^2.0@stable", "psr/container": "^1.0|^2.0", "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" }, @@ -4850,7 +5634,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.23.0" + "source": "https://github.com/twigphp/Twig/tree/v3.24.0" }, "funding": [ { @@ -4862,22 +5646,22 @@ "type": "tidelift" } ], - "time": "2026-01-23T21:00:41+00:00" + "time": "2026-03-17T21:31:11+00:00" } ], "packages-dev": [ { "name": "symfony/debug-bundle", - "version": "v6.4.27", + "version": "v6.4.35", "source": { "type": "git", "url": "https://github.com/symfony/debug-bundle.git", - "reference": "21a61c55192d558a6b81cdb12e8c010fc9474fe0" + "reference": "eb79084c2c9778559b21f61cb1507cbd580cc6e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/21a61c55192d558a6b81cdb12e8c010fc9474fe0", - "reference": "21a61c55192d558a6b81cdb12e8c010fc9474fe0", + "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/eb79084c2c9778559b21f61cb1507cbd580cc6e1", + "reference": "eb79084c2c9778559b21f61cb1507cbd580cc6e1", "shasum": "" }, "require": { @@ -4922,7 +5706,7 @@ "description": "Provides a tight integration of the Symfony VarDumper component and the ServerLogCommand from MonologBridge into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/debug-bundle/tree/v6.4.27" + "source": "https://github.com/symfony/debug-bundle/tree/v6.4.35" }, "funding": [ { @@ -4942,7 +5726,7 @@ "type": "tidelift" } ], - "time": "2025-10-11T17:35:31+00:00" + "time": "2026-03-02T09:25:10+00:00" }, { "name": "symfony/stopwatch", @@ -5012,16 +5796,16 @@ }, { "name": "symfony/web-profiler-bundle", - "version": "v6.4.32", + "version": "v6.4.36", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "011f59e3f3d20f60d11b4e78b8dc63504f56e145" + "reference": "6f75b4c748886c8e04a3674225d00eaa51f3842d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/011f59e3f3d20f60d11b4e78b8dc63504f56e145", - "reference": "011f59e3f3d20f60d11b4e78b8dc63504f56e145", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/6f75b4c748886c8e04a3674225d00eaa51f3842d", + "reference": "6f75b4c748886c8e04a3674225d00eaa51f3842d", "shasum": "" }, "require": { @@ -5074,7 +5858,7 @@ "dev" ], "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.4.32" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.4.36" }, "funding": [ { @@ -5094,19 +5878,20 @@ "type": "tidelift" } ], - "time": "2026-01-06T09:13:42+00:00" + "time": "2026-03-17T09:05:06+00:00" } ], "aliases": [], "minimum-stability": "stable", "stability-flags": { "apereo/phpcas": 20, + "nikic/php-parser": 20, "scssphp/scssphp": 20 }, "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=8.1.0 <8.5.0", + "php": ">=8.2.0 <8.5.0", "ext-ctype": "*", "ext-dom": "*", "ext-gd": "*", @@ -5117,7 +5902,7 @@ }, "platform-dev": {}, "platform-overrides": { - "php": "8.1.0" + "php": "8.2.0" }, "plugin-api-version": "2.9.0" } diff --git a/core/cmdbsource.class.inc.php b/core/cmdbsource.class.inc.php index 25ccbd7e16..8b17a931db 100644 --- a/core/cmdbsource.class.inc.php +++ b/core/cmdbsource.class.inc.php @@ -1579,8 +1579,6 @@ class CMDBSource if (static::GetDBVendor() === static::ENUM_DB_VENDOR_MYSQL) { //Mysql 5.7.0 and upper deprecated --ssl and uses --ssl-mode instead return version_compare(static::GetDBVersion(), '5.7.11', '>='); - } elseif (static::GetDBVendor() === static::ENUM_DB_VENDOR_MARIADB) { - return version_compare(static::GetDBVersion(), '10.2.6', '>='); } return false; } diff --git a/core/event.class.inc.php b/core/event.class.inc.php index 0e45ffffe8..cd8544b4b4 100644 --- a/core/event.class.inc.php +++ b/core/event.class.inc.php @@ -178,7 +178,7 @@ class EventNotificationEmail extends EventNotification // Display lists MetaModel::Init_SetZListItems('details', ['date', 'userinfo', 'message', 'trigger_id', 'action_id', 'object_class', 'object_id', 'to', 'cc', 'bcc', 'from', 'subject', 'body', 'attachments']); // Attributes to be displayed for the complete details - MetaModel::Init_SetZListItems('list', ['date', 'message', 'to', 'subject', 'attachments']); // Attributes to be displayed for a list + MetaModel::Init_SetZListItems('list', ['date', 'message', 'to', 'cc', 'bcc', 'subject', 'attachments']); // Attributes to be displayed for a list // Search criteria // MetaModel::Init_SetZListItems('standard_search', array('name')); // Criteria of the std search form diff --git a/css/backoffice/components/_panel.scss b/css/backoffice/components/_panel.scss index 134d5ba216..993f8bf551 100644 --- a/css/backoffice/components/_panel.scss +++ b/css/backoffice/components/_panel.scss @@ -185,16 +185,20 @@ $ibo-panel--is-selectable--body--after--font-size: $ibo-font-size-700 !default; .ibo-panel--icon-img, .ibo-panel--icon-background { // second class is deprecated, remove it when dealing with N°9317 width: 100%; height: 100%; + object-position: center; + object-fit: $ibo-panel--icon-img--size--must-contain; background-position: center; background-repeat: no-repeat; background-size: $ibo-panel--icon-img--size--must-contain; } .ibo-panel--icon-img--must-contain, .ibo-panel--icon-background--must-contain { // second class is deprecated, remove it when dealing with N°9317 + object-fit: $ibo-panel--icon-img--size--must-contain; background-size: $ibo-panel--icon-img--size--must-contain; } .ibo-panel--icon-img--must-cover, .ibo-panel--icon-background--must-cover { // second class is deprecated, remove it when dealing with N°9317 + object-fit: $ibo-panel--icon-img--size--must-cover; background-size: $ibo-panel--icon-img--size--must-cover; } diff --git a/css/backoffice/components/_title.scss b/css/backoffice/components/_title.scss index d430d90c28..f61e1ddd59 100644 --- a/css/backoffice/components/_title.scss +++ b/css/backoffice/components/_title.scss @@ -51,19 +51,23 @@ $ibo-title--icon-img--size--must-zoomout: $ibo-title--icon-background--size--mus width: 100%; height: 100%; object-position: center; + object-fit: $ibo-title--icon-img--size--must-contain; background-size: $ibo-title--icon-img--size--must-contain; } .ibo-title--icon-img--must-contain, .ibo-title--icon-background--must-contain { // second class is deprecated, remove it when dealing with N°9317 + object-fit: $ibo-title--icon-img--size--must-contain; background-size: $ibo-title--icon-img--size--must-contain; } .ibo-title--icon-img--must-cover, .ibo-title--icon-background--must-cover { // second class is deprecated, remove it when dealing with N°9317 + object-fit: $ibo-title--icon-img--size--must-cover; background-size: $ibo-title--icon-img--size--must-cover; } .ibo-title--icon-img--must-zoomout, .ibo-title--icon-background--must-zoomout { // second class is deprecated, remove it when dealing with N°9317 - background-size: $ibo-title--icon-img--size--must-zoomout; + width: $ibo-title--icon-img--size--must-zoomout; + height: $ibo-title--icon-img--size--must-zoomout; } .ibo-title--for-object-details { diff --git a/css/setup.css b/css/setup.css index 03200744bd..5c19f25bfb 100644 --- a/css/setup.css +++ b/css/setup.css @@ -15,7 +15,7 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - */:root{--skeleton-start-color: #e1e7ec;--skeleton-stop-color: #cfd8dc}.ibo-panel.ibo-is-selectable:hover .ibo-panel--body::after{font-family:"Font Awesome 5 Free";font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.dataTables_scrollHead thead tr th.sorting::after,.selectize-input .attribute-set-item.item-add::before,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active .attribute-set-item.item-add::before,.selectize-input .attribute-set-item.item-remove::before,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active .attribute-set-item.item-remove::before,.ibo-breadcrumbs--item:not(:last-child)::after,.ibo-breadcrumbs--previous-items-list-toggler:not(:last-child)::after,.ibo-panel.ibo-is-selectable .ibo-panel--body::after,.ibo-panel.ibo-is-selected .ibo-panel--body::after,.ibo-prop--apply.ui-state-error:after,.ibo-sort-order::after,.ibo-dashboard--slider:before,.ibo-dashboard--slider:after,.ibo-bulk--bulk-modify--incompatible-attribute:before,.ibo-linked-set--bulk-tooltip-info:before,.ibo-tab-container--tab-header.ibo-drag-in>a::after,.ibo-drag-in.ibo-tab-container--extra-tabs-container>a::after,.ibo-quick-create--compartment-results--element.ibo-tab-container--tab-header>.option:hover::after,.ibo-quick-create--compartment-results--element.ibo-drag-in>.option:hover::after,.collapsable-options [data-role="setup-collapsable-options--toggler"]::before,#params_summary div.closed .title::before,#params_summary div:not(.closed) .title::before{font-family:"Font Awesome 5 Free";font-weight:900;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.common-is-fullwidth{width:100%}.common-font-size-50{font-size:0.83rem}.common-font-size-100{font-size:1rem}.common-font-size-150{font-size:1.17rem}.common-font-size-200{font-size:1.33rem}.common-font-size-250{font-size:1.5rem}.common-font-size-300{font-size:1.67rem}.common-font-size-350{font-size:1.83rem}.common-font-size-400{font-size:2rem}.common-font-size-450{font-size:2.5rem}.common-font-size-500{font-size:3rem}.common-font-size-550{font-size:4rem}.common-font-weight-100{font-weight:100}.common-font-weight-200{font-weight:200}.common-font-weight-300{font-weight:300}.common-font-weight-400{font-weight:400}.common-font-weight-500{font-weight:500}.common-font-weight-600{font-weight:600}.common-font-weight-700{font-weight:700}.common-font-weight-800{font-weight:800}.common-font-weight-900{font-weight:900}.common-font-weight-950{font-weight:950}.common-font-ral-nor-50{font-size:0.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-nor-100{font-size:1rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-nor-150{font-size:1.17rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-nor-200{font-size:1.33rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-nor-250{font-size:1.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-nor-300{font-size:1.67rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-nor-350{font-size:1.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-nor-400{font-size:2rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-nor-450{font-size:2.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-nor-500{font-size:3rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-nor-550{font-size:4rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-med-50{font-size:0.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-med-100{font-size:1rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-med-150{font-size:1.17rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-med-200{font-size:1.33rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-med-250{font-size:1.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-med-300{font-size:1.67rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-med-350{font-size:1.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-med-400{font-size:2rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-med-450{font-size:2.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-med-500{font-size:3rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-med-550{font-size:4rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-bol-50{font-size:0.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-bol-100{font-size:1rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-bol-150{font-size:1.17rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-bol-200{font-size:1.33rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-bol-250{font-size:1.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-bol-300{font-size:1.67rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-bol-350{font-size:1.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-bol-400{font-size:2rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-bol-450{font-size:2.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-bol-500{font-size:3rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-bol-550{font-size:4rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-sembol-50{font-size:0.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-sembol-100{font-size:1rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-sembol-150{font-size:1.17rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-sembol-200{font-size:1.33rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-sembol-250{font-size:1.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-sembol-300{font-size:1.67rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-sembol-350{font-size:1.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-sembol-400{font-size:2rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-sembol-450{font-size:2.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-sembol-500{font-size:3rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-sembol-550{font-size:4rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-ita-50{font-size:0.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-ita-100{font-size:1rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-ita-150{font-size:1.17rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-ita-200{font-size:1.33rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-ita-250{font-size:1.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-ita-300{font-size:1.67rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-ita-350{font-size:1.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-ita-400{font-size:2rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-ita-450{font-size:2.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-ita-500{font-size:3rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-ita-550{font-size:4rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-code-50{font-size:0.83rem;font-family:monospace;font-weight:400}.common-font-code-100{font-size:1rem;font-family:monospace;font-weight:400}.common-font-code-150{font-size:1.17rem;font-family:monospace;font-weight:400}.common-font-code-200{font-size:1.33rem;font-family:monospace;font-weight:400}.common-font-code-250{font-size:1.5rem;font-family:monospace;font-weight:400}.common-font-code-300{font-size:1.67rem;font-family:monospace;font-weight:400}.common-font-code-350{font-size:1.83rem;font-family:monospace;font-weight:400}.common-font-code-400{font-size:2rem;font-family:monospace;font-weight:400}.common-font-code-450{font-size:2.5rem;font-family:monospace;font-weight:400}.common-font-code-500{font-size:3rem;font-family:monospace;font-weight:400}.common-font-code-550{font-size:4rem;font-family:monospace;font-weight:400}@font-face{font-family:Raleway;font-weight:100;font-style:normal;font-display:swap;src:local("Raleway Thin"), url("../node_modules/@fontsource/raleway/files/raleway-all-100-normal.woff") format("woff")}@font-face{font-family:Raleway;font-weight:100;font-style:italic;font-display:swap;src:local("Raleway Thin"), url("../node_modules/@fontsource/raleway/files/raleway-all-100-italic.woff") format("woff")}@font-face{font-family:Raleway;font-weight:200;font-style:normal;font-display:swap;src:local("Raleway ExtraLight"), url("../node_modules/@fontsource/raleway/files/raleway-all-200-normal.woff") format("woff")}@font-face{font-family:Raleway;font-weight:200;font-style:italic;font-display:swap;src:local("Raleway ExtraLight"), url("../node_modules/@fontsource/raleway/files/raleway-all-200-italic.woff") format("woff")}@font-face{font-family:Raleway;font-weight:300;font-style:normal;font-display:swap;src:local("Raleway Light"), url("../node_modules/@fontsource/raleway/files/raleway-all-300-normal.woff") format("woff")}@font-face{font-family:Raleway;font-weight:300;font-style:italic;font-display:swap;src:local("Raleway Light"), url("../node_modules/@fontsource/raleway/files/raleway-all-300-italic.woff") format("woff")}@font-face{font-family:Raleway;font-weight:400;font-style:normal;font-display:swap;src:local("Raleway"), url("../node_modules/@fontsource/raleway/files/raleway-all-400-normal.woff") format("woff")}@font-face{font-family:Raleway;font-weight:400;font-style:italic;font-display:swap;src:local("Raleway"), url("../node_modules/@fontsource/raleway/files/raleway-all-400-italic.woff") format("woff")}@font-face{font-family:Raleway;font-weight:500;font-style:normal;font-display:swap;src:local("Raleway Medium"), url("../node_modules/@fontsource/raleway/files/raleway-all-500-normal.woff") format("woff")}@font-face{font-family:Raleway;font-weight:500;font-style:italic;font-display:swap;src:local("Raleway Medium"), url("../node_modules/@fontsource/raleway/files/raleway-all-500-italic.woff") format("woff")}@font-face{font-family:Raleway;font-weight:600;font-style:normal;font-display:swap;src:local("Raleway SemiBold"), url("../node_modules/@fontsource/raleway/files/raleway-all-600-normal.woff") format("woff")}@font-face{font-family:Raleway;font-weight:600;font-style:italic;font-display:swap;src:local("Raleway SemiBold"), url("../node_modules/@fontsource/raleway/files/raleway-all-600-italic.woff") format("woff")}@font-face{font-family:Raleway;font-weight:700;font-style:normal;font-display:swap;src:local("Raleway"), url("../node_modules/@fontsource/raleway/files/raleway-all-700-normal.woff") format("woff")}@font-face{font-family:Raleway;font-weight:700;font-style:italic;font-display:swap;src:local("Raleway"), url("../node_modules/@fontsource/raleway/files/raleway-all-700-italic.woff") format("woff")}@font-face{font-family:Raleway;font-weight:800;font-style:normal;font-display:swap;src:local("Raleway ExtraBold"), url("../node_modules/@fontsource/raleway/files/raleway-all-800-normal.woff") format("woff")}@font-face{font-family:Raleway;font-weight:800;font-style:italic;font-display:swap;src:local("Raleway ExtraBold"), url("../node_modules/@fontsource/raleway/files/raleway-all-800-italic.woff") format("woff")}@font-face{font-family:Raleway;font-weight:900;font-style:normal;font-display:swap;src:local("Raleway Black"), url("../node_modules/@fontsource/raleway/files/raleway-all-900-normal.woff") format("woff")}@font-face{font-family:Raleway;font-weight:900;font-style:italic;font-display:swap;src:local("Raleway Black"), url("../node_modules/@fontsource/raleway/files/raleway-all-900-italic.woff") format("woff")}:root{--ibo-color-white-100: white;--ibo-color-white-200: #f2f2f2;--ibo-color-transparent: rgba(255, 255, 255, 0);--ibo-color-grey-50: #fcfcfd;--ibo-color-grey-100: #f8f9fa;--ibo-color-grey-200: #e1e7ec;--ibo-color-grey-300: #d5dde5;--ibo-color-grey-400: #ccd4db;--ibo-color-grey-500: #aebecd;--ibo-color-grey-600: #929fb1;--ibo-color-grey-700: #6e7a8a;--ibo-color-grey-800: #404b5a;--ibo-color-grey-900: #212934;--ibo-color-grey-950: #141a22;--ibo-color-blue-grey-50: #f1f5f8;--ibo-color-blue-grey-100: #cfd8dc;--ibo-color-blue-grey-200: #b0bec5;--ibo-color-blue-grey-300: #90a4ae;--ibo-color-blue-grey-400: #78909c;--ibo-color-blue-grey-500: #607d8b;--ibo-color-blue-grey-600: #546e7a;--ibo-color-blue-grey-700: #455a64;--ibo-color-blue-grey-800: #37474f;--ibo-color-blue-grey-900: #263238;--ibo-color-blue-grey-950: #1b2428;--ibo-color-blue-100: #ebf8ff;--ibo-color-blue-200: #bee3f8;--ibo-color-blue-300: #90cef4;--ibo-color-blue-400: #63b4ed;--ibo-color-blue-500: #429ae1;--ibo-color-blue-600: #3182ce;--ibo-color-blue-700: #2b6bb0;--ibo-color-blue-800: #2c5382;--ibo-color-blue-900: #2a4265;--ibo-color-blue-950: #253750;--ibo-color-cyan-100: #c9eef2;--ibo-color-cyan-200: #80deea;--ibo-color-cyan-300: #4dd0e1;--ibo-color-cyan-400: #26c5da;--ibo-color-cyan-500: #00bbd4;--ibo-color-cyan-600: #00aac1;--ibo-color-cyan-700: #0096a7;--ibo-color-cyan-800: #00838f;--ibo-color-cyan-900: #006164;--ibo-color-cyan-950: #003636;--ibo-color-green-100: #dcedc8;--ibo-color-green-200: #c5e1a5;--ibo-color-green-300: #aed581;--ibo-color-green-400: #9ccc65;--ibo-color-green-500: #8ac34a;--ibo-color-green-600: #7cb342;--ibo-color-green-700: #689f38;--ibo-color-green-800: #558b2f;--ibo-color-green-900: #33691e;--ibo-color-green-950: #235816;--ibo-color-orange-100: floralwhite;--ibo-color-orange-200: #feebc8;--ibo-color-orange-300: #fbd38d;--ibo-color-orange-400: #f6ae55;--ibo-color-orange-500: #ea7d1e;--ibo-color-orange-600: #dd6c20;--ibo-color-orange-700: #c05621;--ibo-color-orange-800: #9c4221;--ibo-color-orange-900: #7b341e;--ibo-color-orange-950: #572819;--ibo-color-red-100: #fce8e8;--ibo-color-red-200: #fed7d7;--ibo-color-red-300: #feb2b2;--ibo-color-red-400: #fc8181;--ibo-color-red-500: #f56565;--ibo-color-red-600: #e53e3e;--ibo-color-red-700: #c53030;--ibo-color-red-800: #9b2c2c;--ibo-color-red-900: #742a2a;--ibo-color-red-950: #491d1d;--ibo-color-pink-100: #fff5f7;--ibo-color-pink-200: #fed7e2;--ibo-color-pink-300: #fbb6ce;--ibo-color-pink-400: #f688b4;--ibo-color-pink-500: #ed64a6;--ibo-color-pink-600: #d53f8c;--ibo-color-pink-700: #b83280;--ibo-color-pink-800: #97266d;--ibo-color-pink-900: #702459;--ibo-color-pink-950: #511a40;--ibo-color-yellow-100: ivory;--ibo-color-yellow-200: #fefcbf;--ibo-color-yellow-300: #faf089;--ibo-color-yellow-400: #f6e05e;--ibo-color-yellow-500: #ecc94b;--ibo-color-yellow-600: #d69e2e;--ibo-color-yellow-700: #b7791f;--ibo-color-yellow-800: #975a16;--ibo-color-yellow-900: #744210;--ibo-color-yellow-950: #4e2a09;--ibo-color-purple-100: #ede9fe;--ibo-color-purple-200: #ddd6fe;--ibo-color-purple-300: #c4b5fd;--ibo-color-purple-400: #a78bfa;--ibo-color-purple-500: #8b5cf6;--ibo-color-purple-600: #7c3aed;--ibo-color-purple-700: #6d28d9;--ibo-color-purple-800: #5b21b6;--ibo-color-purple-900: #4c1d95;--ibo-color-purple-950: #371371}:root{--ibo-color-primary-100: floralwhite;--ibo-color-primary-200: #feebc8;--ibo-color-primary-300: #fbd38d;--ibo-color-primary-400: #f6ae55;--ibo-color-primary-500: #ea7d1e;--ibo-color-primary-600: #dd6c20;--ibo-color-primary-700: #c05621;--ibo-color-primary-800: #9c4221;--ibo-color-primary-900: #7b341e;--ibo-color-primary-950: #572819;--ibo-color-secondary-100: #f8f9fa;--ibo-color-secondary-200: #e1e7ec;--ibo-color-secondary-300: #d5dde5;--ibo-color-secondary-400: #ccd4db;--ibo-color-secondary-500: #aebecd;--ibo-color-secondary-600: #929fb1;--ibo-color-secondary-700: #6e7a8a;--ibo-color-secondary-800: #404b5a;--ibo-color-secondary-900: #212934;--ibo-color-secondary-950: #141a22;--ibo-color-information-100: #ebf8ff;--ibo-color-information-200: #bee3f8;--ibo-color-information-300: #90cef4;--ibo-color-information-400: #63b4ed;--ibo-color-information-500: #429ae1;--ibo-color-information-600: #3182ce;--ibo-color-information-700: #2b6bb0;--ibo-color-information-800: #2c5382;--ibo-color-information-900: #2a4265;--ibo-color-information-950: #253750;--ibo-color-success-100: #dcedc8;--ibo-color-success-200: #c5e1a5;--ibo-color-success-300: #aed581;--ibo-color-success-400: #9ccc65;--ibo-color-success-500: #8ac34a;--ibo-color-success-600: #7cb342;--ibo-color-success-700: #689f38;--ibo-color-success-800: #558b2f;--ibo-color-success-900: #33691e;--ibo-color-success-950: #235816;--ibo-color-warning-100: floralwhite;--ibo-color-warning-200: #feebc8;--ibo-color-warning-300: #fbd38d;--ibo-color-warning-400: #f6ae55;--ibo-color-warning-500: #ea7d1e;--ibo-color-warning-600: #dd6c20;--ibo-color-warning-700: #c05621;--ibo-color-warning-800: #9c4221;--ibo-color-warning-900: #7b341e;--ibo-color-warning-950: #572819;--ibo-color-danger-100: #fce8e8;--ibo-color-danger-200: #fed7d7;--ibo-color-danger-300: #feb2b2;--ibo-color-danger-400: #fc8181;--ibo-color-danger-500: #f56565;--ibo-color-danger-600: #e53e3e;--ibo-color-danger-700: #c53030;--ibo-color-danger-800: #9b2c2c;--ibo-color-danger-900: #742a2a;--ibo-color-danger-950: #491d1d;--ibo-color-error-100: #fce8e8;--ibo-color-error-200: #fed7d7;--ibo-color-error-300: #feb2b2;--ibo-color-error-400: #fc8181;--ibo-color-error-500: #f56565;--ibo-color-error-600: #e53e3e;--ibo-color-error-700: #c53030;--ibo-color-error-800: #9b2c2c;--ibo-color-error-900: #742a2a;--ibo-color-error-950: #491d1d;--ibo-caselog-color-highlight-1: #689f38;--ibo-caselog-color-highlight-2: #b83280;--ibo-caselog-color-highlight-3: #f6ae55;--ibo-caselog-color-highlight-4: #3182ce;--ibo-caselog-color-highlight-5: #80deea}:root{--ibo-lifecycle-new-state-primary-color: #2c5382;--ibo-lifecycle-new-state-secondary-color: white;--ibo-lifecycle-neutral-state-primary-color: #2c5382;--ibo-lifecycle-neutral-state-secondary-color: white;--ibo-lifecycle-waiting-state-primary-color: #f6ae55;--ibo-lifecycle-waiting-state-secondary-color: white;--ibo-lifecycle-success-state-primary-color: #689f38;--ibo-lifecycle-success-state-secondary-color: white;--ibo-lifecycle-failure-state-primary-color: #b83280;--ibo-lifecycle-failure-state-secondary-color: white;--ibo-lifecycle-frozen-state-primary-color: #e1e7ec;--ibo-lifecycle-frozen-state-secondary-color: #6e7a8a;--ibo-lifecycle-active-state-primary-color: #689f38;--ibo-lifecycle-active-state-secondary-color: white;--ibo-lifecycle-inactive-state-primary-color: #f6ae55;--ibo-lifecycle-inactive-state-secondary-color: white}:root{--skeleton-start-color: #e1e7ec;--skeleton-stop-color: #cfd8dc}:root{--ibo-border-radius-100: 1px;--ibo-border-radius-300: 3px;--ibo-border-radius-500: 5px;--ibo-border-radius-700: 10px;--ibo-border-radius-900: 16px;--ibo-border-radius-full: 100%}:root{--ibo-depression-100: inset 0 1px 1px 0 rgba(0, 0, 0, 0.15)}:root{--ibo-elevation-100: 0 1px 2px rgba(0, 0, 0, 0.25), 0 1px 3px rgba(0, 0, 0, 0.12);--ibo-elevation-200: 0 2px 4px rgba(0, 0, 0, 0.12), 0 3px 6px rgba(0, 0, 0, 0.15);--ibo-elevation-300: 0 3px 6px rgba(0, 0, 0, 0.1), 0 10px 20px rgba(0, 0, 0, 0.15);--ibo-elevation-400: 0 5px 10px rgba(0, 0, 0, 0.05), 0 15px 25px rgba(0, 0, 0, 0.15);--ibo-elevation-500: 0 20px 40px rgba(0, 0, 0, 0.2)}:root{--ibo-size-0: 0;--ibo-size-50: 2px;--ibo-size-100: 4px;--ibo-size-150: 8px;--ibo-size-200: 12px;--ibo-size-250: 16px;--ibo-size-300: 24px;--ibo-size-350: 32px;--ibo-size-400: 48px;--ibo-size-450: 64px;--ibo-size-500: 96px;--ibo-size-550: 128px;--ibo-size-600: 192px;--ibo-size-650: 256px;--ibo-size-700: 384px;--ibo-size-750: 512px;--ibo-size-800: 640px;--ibo-size-850: 768px;--ibo-size-900: 896px}:root{--ibo-spacing-0: 0;--ibo-spacing-100: 2px;--ibo-spacing-200: 4px;--ibo-spacing-300: 8px;--ibo-spacing-400: 12px;--ibo-spacing-500: 16px;--ibo-spacing-600: 24px;--ibo-spacing-700: 32px;--ibo-spacing-800: 48px;--ibo-spacing-900: 64px;--ibo-spacing-950: 96px}:root{--ibo-font-size-50: 0.83rem;--ibo-font-size-100: 1rem;--ibo-font-size-150: 1.17rem;--ibo-font-size-200: 1.33rem;--ibo-font-size-250: 1.5rem;--ibo-font-size-300: 1.67rem;--ibo-font-size-350: 1.83rem;--ibo-font-size-400: 2rem;--ibo-font-size-450: 2.5rem;--ibo-font-size-500: 3rem;--ibo-font-size-550: 4rem}:root{--ibo-font-weight-100: 100;--ibo-font-weight-200: 200;--ibo-font-weight-300: 300;--ibo-font-weight-400: 400;--ibo-font-weight-500: 500;--ibo-font-weight-600: 600;--ibo-font-weight-700: 700;--ibo-font-weight-800: 800;--ibo-font-weight-900: 900;--ibo-font-weight-950: 950}:root{--ibo-font-family-base: Raleway;--ibo-font-family-monospace: monospace;--ibo-font-family-code: monospace}#ibo-setup-licenses--components-list{border-radius:3px}.ibo-welcome-popup--stack-item{border-radius:4px}.ibo-datatable .ibo-field-badge::before{border-radius:100%}.ibo-text.ibo-is-primary{color:#9c4221}.ibo-text.ibo-is-secondary,.ui-dialog .ibo-text.ui-button,.ibo-text.ui-datepicker-current,.ibo-text.ui-datepicker-close{color:#404b5a}.ibo-text.ibo-is-neutral,.ui-dialog .ibo-text.ui-button.ui-dialog-titlebar-close{color:#404b5a}.ibo-text.ibo-is-information{color:#2c5382}.ibo-text.ibo-is-success{color:#558b2f}.ibo-text.ibo-is-failure{color:#9b2c2c}.ibo-text.ibo-is-warning{color:#9c4221}.ibo-text.ibo-is-danger{color:#9b2c2c}.ibo-text.ibo-is-grey{color:#404b5a}.ibo-text.ibo-is-blue-grey{color:#37474f}.ibo-text.ibo-is-blue{color:#2c5382}.ibo-text.ibo-is-cyan{color:#00838f}.ibo-text.ibo-is-green{color:#558b2f}.ibo-text.ibo-is-orange{color:#9c4221}.ibo-text.ibo-is-red{color:#9b2c2c}.ibo-text.ibo-is-pink{color:#97266d}.ibo-class-icon.ibo-is-small{width:32px;min-width:32px;max-height:32px}.ibo-class-icon.ibo-is-medium{width:48px;min-width:48px;max-height:48px}.ibo-class-icon.ibo-is-large{width:64px;min-width:64px;max-height:64px}.ibo-activity-panel--tab-title-decoration{box-shadow:inset 0 1px 1px 0 rgba(0, 0, 0, 0.15)}.ibo-top-bar,.ibo-tab-container--extra-tabs-list{box-shadow:0 1px 2px rgba(0, 0, 0, 0.25), 0 1px 3px rgba(0, 0, 0, 0.12)}.ibo-breadcrumbs--previous-items-list,.ibo-quick-create--input.selectize-control.single .selectize-dropdown,.ibo-popover-menu,.ui-menu,.ui-multiselect-menu,.ibo-input-select-icon--menu,.graph_config .toolkit_menu.graph>ul>li ul,.ibo-activity-panel--filter-options{box-shadow:0 3px 6px rgba(0, 0, 0, 0.1), 0 10px 20px rgba(0, 0, 0, 0.15)}html.ibo-has-fullscreen-descendant{position:fixed !important;width:0 !important;height:0 !important}body.ibo-has-fullscreen-descendant{width:0 !important;height:0 !important;overflow:hidden !important}.ibo-has-fullscreen-descendant{position:static !important;overflow:visible !important;z-index:1050 !important}.ibo-is-fullscreen{position:absolute;top:0 !important;left:0 !important;margin:0 !important;padding:0 !important;width:100vw;height:100vh;overflow:auto;z-index:1050}.ibo-sticky-sentinel{position:absolute;left:0;right:0;visibility:hidden}.ibo-sticky-sentinel-top{top:0;height:0}.ibo-sticky-sentinel-bottom{bottom:0;height:0}:root{--ibo-hyperlink-color: #c05621;--ibo-hyperlink-text-decoration: none;--ibo-hyperlink-color--on-hover: #9c4221;--ibo-hyperlink-text-decoration--on-hover: none;--ibo-hyperlink-color--on-active: #7b341e;--ibo-hyperlink-text-decoration--on-active: none}.ibo-text-truncated-with-ellipsis,.ui-dialog .ui-dialog-title,.ibo-button--label,.ibo-breadcrumbs--item-label,.ibo-quick-create--compartment-element,.ibo-quick-create--compartment-results--element>.option,.ibo-global-search--compartment-element,.ibo-dashlet-badge--action-list-label,.ibo-input-select--autocomplete-item-txt,.attribute-set .attribute-set-item,.selectize-control.multi .selectize-input.ibo-input-set .attribute-set-item,.selectize-control.multi .ibo-quick-create--input.selectize-control.single .ibo-input-set.selectize-input.input-active .attribute-set-item,.ibo-quick-create--input.selectize-control.single .selectize-control.multi .ibo-input-set.selectize-input.input-active .attribute-set-item,.attribute-set .attribute-set-item>*,.selectize-control.multi .selectize-input.ibo-input-set .attribute-set-item>*,.selectize-control.multi .ibo-quick-create--input.selectize-control.single .ibo-input-set.selectize-input.input-active .attribute-set-item>*,.ibo-quick-create--input.selectize-control.single .selectize-control.multi .ibo-input-set.selectize-input.input-active .attribute-set-item>*,.ibo-navigation-menu--menu-group-title,.ibo-top-bar--toolbar-dashboard-title,.ibo-tab-container--tab-toggler,.ibo-tab-container--extra-tabs-list-toggler,.ibo-tab-container--tab-toggler-label,.ibo-tab-container--extra-tab-toggler,.ibo-object-details>.ibo-panel--header .ibo-panel--subtitle,.ibo-object-details>.ibo-object-summary--header .ibo-panel--subtitle,.ibo-activity-panel--tab-title-text,.ibo-activity-panel--filter-option,.ibo-welcome-popup--stack-item-title{white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis}.dataTables_paginate a.paginate_button,.dataTables_paginate .ibo-quick-create--compartment-results--element>.paginate_button.option:hover,.ibo-dashlet-badge--action-list:hover,.ibo-dashlet-badge--action-list:active,.ibo-field--fullscreen-toggler,.ibo-input-select--action-buttons a,.ibo-input-select--action-buttons .ibo-quick-create--compartment-results--element>.option:hover,.search_form_handler a,.search_form_handler .ibo-quick-create--compartment-results--element>.option:hover,.ibo-navigation-menu--menu-filter-clear,.ibo-navigation-menu--menu-filter-hint-close,.ibo-tab-container--tab-toggler,.ibo-tab-container--extra-tabs-list-toggler,.ibo-activity-panel--load-entries-button,.ibo-welcome-popup--stack-item-title{color:inherit}.dataTables_paginate a.paginate_button:hover,.dataTables_paginate .ibo-quick-create--compartment-results--element>.paginate_button.option:hover,.ibo-dashlet-badge--action-list:hover,.ibo-dashlet-badge--action-list:active:hover,.ibo-field--fullscreen-toggler:hover,.ibo-input-select--action-buttons a:hover,.ibo-input-select--action-buttons .ibo-quick-create--compartment-results--element>.option:hover,.search_form_handler a:hover,.search_form_handler .ibo-quick-create--compartment-results--element>.option:hover,.ibo-navigation-menu--menu-filter-clear:hover,.ibo-navigation-menu--menu-filter-hint-close:hover,.ibo-tab-container--tab-toggler:hover,.ibo-tab-container--extra-tabs-list-toggler:hover,.ibo-activity-panel--load-entries-button:hover,.ibo-welcome-popup--stack-item-title:hover,.dataTables_paginate a.paginate_button:active,.dataTables_paginate .ibo-quick-create--compartment-results--element>.paginate_button.option:hover:active,.ibo-dashlet-badge--action-list:hover:active,.ibo-dashlet-badge--action-list:active,.ibo-field--fullscreen-toggler:active,.ibo-input-select--action-buttons a:active,.ibo-input-select--action-buttons .ibo-quick-create--compartment-results--element>.option:hover:active,.search_form_handler a:active,.search_form_handler .ibo-quick-create--compartment-results--element>.option:hover:active,.ibo-navigation-menu--menu-filter-clear:active,.ibo-navigation-menu--menu-filter-hint-close:active,.ibo-tab-container--tab-toggler:active,.ibo-tab-container--extra-tabs-list-toggler:active,.ibo-activity-panel--load-entries-button:active,.ibo-welcome-popup--stack-item-title:active{color:inherit}.ibo-navigation-menu--notifications-item .ibo-navigation-menu--notifications--item--content a,.ibo-navigation-menu--notifications-item .ibo-navigation-menu--notifications--item--content .ibo-quick-create--compartment-results--element>.option:hover{color:#c05621;text-decoration:none}.ibo-navigation-menu--notifications-item .ibo-navigation-menu--notifications--item--content a:hover,.ibo-navigation-menu--notifications-item .ibo-navigation-menu--notifications--item--content .ibo-quick-create--compartment-results--element>.option:hover{color:#9c4221;text-decoration:none}.ibo-navigation-menu--notifications-item .ibo-navigation-menu--notifications--item--content a:active,.ibo-navigation-menu--notifications-item .ibo-navigation-menu--notifications--item--content .ibo-quick-create--compartment-results--element>.option:hover:active{color:#7b341e;text-decoration:none}.ibo-is-broken-hyperlink{text-decoration:line-through;cursor:help}.ibo-is-disabled{cursor:not-allowed !important}.ibo-has-description::after{content:"🛈";padding-left:4px;vertical-align:top;cursor:pointer;color:#929fb1;font-size:0.7em}.ibo-is-code{background-color:#f2f2f2;padding:1.25rem 1.5rem}.ibo-is-html-content{}.ibo-is-html-content table{border-collapse:separate;border-spacing:2px}.ibo-is-html-content>code,.ibo-is-html-content code:not(.hljs){color:inherit}.ibo-is-html-content p{margin-top:0.25em;margin-bottom:0.25em}.ibo-is-html-content figure{display:inline-block;margin-left:2em !important;margin-right:2em !important}.ibo-is-html-content figure:not(:last-child){margin-bottom:2em !important}.ibo-is-html-content figure:not(:first-child){margin-top:2em !important}.ibo-is-fullwidth{width:100%}.ibo-welcome-popup--stack-item-icon,.ibo-panel--header-left,.ibo-panel--icon,.ibo-dashlet-header-static--icon-container,.ibo-input-image--image-view,.ibo-input-select--autocomplete-item-image,.ibo-pill,.ibo-title--icon,.ibo-datatable--toolbar-left,.ibo-datatable--toolbar-right,.ibo-field--fullscreen-toggler,.ibo-navigation-menu--bottom-part,.ibo-navigation-menu--user-info,.ibo-navigation-menu--user-info .ibo-navigation-menu--user-picture,.ibo-tab-container--tab-toggler,.ibo-tab-container--extra-tabs-list-toggler,.ibo-object-details--status-dot,.ibo-activity-panel--tab-title,.ibo-activity-panel--tab-toolbar-actions,.ibo-activity-panel--tab-toolbar-action,.ibo-activity-panel--body--placeholder-image,.ibo-activity-panel--body--placeholder-hint,.ibo-activity-panel--closed-cover,.ibo-caselog-entry-form--lock-icon,.ibo-activity-entry--medallion,.ibo-activity-panel--load-more-entries-container,.ibo-activity-panel--load-entries-button,.ibo-notifications--view-all--empty{display:flex;justify-content:center;align-items:center}.dataTables_paginate,.ibo-dashlet-badge--action-list,.ibo-input,.ui-autocomplete-input,.ui-multiselect,.dataTables_length select,.ui_tpicker_hour_slider>select,.ui_tpicker_minute_slider>select,.ui_tpicker_second_slider>select,select.ibo-input-select-placeholder,.ibo-datatableconfig--attributes-panel--per-page--input,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.ibo-toolbar.ibo-toolbar--button,.ibo-activity-panel--tab-toolbar-left-actions,.ibo-activity-panel--tab-toolbar-middle-actions,.ibo-activity-panel--tab-toolbar-right-actions,.ibo-activity-panel--filter-option,.ibo-activity-panel--entry-forms-confirmation-preference,.ibo-caselog-entry-form--lock-indicator,.ibo-caselog-entry-form--action-buttons--main-actions,.ibo-welcome-popup--stack-item,#ibo_setup_container .ibo-title,#ibo_setup_container .ibo-setup--body .ibo-setup--button-bar,.ibo-setup--button-bar{display:flex;align-items:center}.ibo-dashlet-badge--action-create,.ibo-title,.ibo-title--subtitle,.ibo-object-details--status,.ibo-activity-panel--add-caselog-entry-button{display:flex;align-items:baseline}.ibo-breadcrumbs,.ibo-quick-create,.ibo-quick-create--head,.ibo-global-search,.ibo-global-search--head,.ibo-top-bar,.ibo-top-bar--quick-actions,.ibo-top-bar--toolbar,.ibo-top-bar--toolbar-dashboard-menu-toggler,.ibo-tab-container--tabs-list,.ibo-tab-container--tab-header,.ibo-tab-container--extra-tabs-container,.ibo-dashboard--top-bar,.ibo-welcome-popup--dialog{display:flex;align-items:stretch}.ibo-font-size-50,.ibo-field--fullscreen-toggler,.ibo-activity-panel--tab-title-draft-indicator,.ibo-activity-entry--sub-information{font-size:0.83rem}.ibo-font-size-100,.dataTables_paginate a.paginate_button,.dataTables_paginate .ibo-quick-create--compartment-results--element>.paginate_button.option:hover,.selectize-add-option,.ibo-quick-create--drawer,.ibo-global-search--drawer,.ibo-dashlet-header-dynamic--label,.ibo-datatable--toolbar,.object-ref-icon.text_decoration,.object-ref-icon-disabled.text_decoration,.ibo-criterion-area,.ibo-dashboard-editor--properties table td .ibo-field,.ibo-dashboard-editor--properties table th .ibo-field,.ibo-dashboard--available-dashlets table td .ibo-field,.ibo-dashboard--available-dashlets table th .ibo-field,.ibo-dashlet--properties table td .ibo-field,.ibo-dashlet--properties table th .ibo-field,.ibo-caselog-list .ibo-collapsible-section .ibo-collapsible-section--header .ibo-collapsible-section--title,.ibo-caselog-list .ibo-collapsible-section .ibo-collapsible-section--body{font-size:1rem}.ibo-font-size-150,.ibo-alert,.ibo-breadcrumbs--item-icon,.ibo-panel--subtitle,.ibo-panel--body,.ibo-dashlet-badge--action-create,.ibo-spinner.ibo-is-small>.ibo-spinner--description,.ibo-prop-header,.ibo-field,.sf_results_placeholder,.ibo-input-file-select--container .ibo-input-file-select .ibo-input-file-select--file-name,.ibo-tab-container--tabs-list,.ibo-dashboard-editor--properties-subtitle,.ibo-dashboard--available-dashlet--title,.ibo-dashlet--properties--title,.ibo-activity-entry--medallion,.ibo-alert--body .ibo-collapsible-section .ibo-collapsible-section--header .ibo-collapsible-section--title,.ibo-alert--body .ibo-collapsible-section .ibo-collapsible-section--body{font-size:1.17rem}.ibo-font-size-200,.dataTables_paginate a.paginate_button.previous,.dataTables_paginate .ibo-quick-create--compartment-results--element>.paginate_button.previous.option:hover,.dataTables_paginate a.paginate_button.next,.dataTables_paginate .ibo-quick-create--compartment-results--element>.paginate_button.next.option:hover{font-size:1.33rem}.ibo-font-size-250,.ibo-collapsible-section .ibo-collapsible-section--header .ibo-collapsible-section--title,.ibo-spinner.ibo-is-small>.ibo-spinner--icon,.ibo-spinner.ibo-is-medium>.ibo-spinner--description,.ibo-fieldset-legend,.ibo-dashboard-editor--properties-subtitle,.ibo-dashboard--available-dashlet--title,.ibo-dashlet--properties--title,legend,.ibo-top-bar--toolbar-dashboard-title,.ibo-tab-container--tab-container--label>span,.ibo-dashboard-editor--properties-title{font-size:1.5rem}.ibo-font-size-300,.ibo-title--for-object-details,.ibo-tab--temporary-remote-content--button{font-size:1.67rem}.ibo-font-size-350,.ibo-panel--title,.ibo-dashlet-header-static--body,.ibo-title-for-dashlet--title{font-size:1.83rem}.ibo-font-size-400,.ibo-spinner.ibo-is-large>.ibo-spinner--description{font-size:2rem}.ibo-font-size-450{font-size:2.5rem}.ibo-font-size-500,.ibo-spinner.ibo-is-medium>.ibo-spinner--icon{font-size:3rem}.ibo-font-size-550,.ibo-spinner.ibo-is-large>.ibo-spinner--icon{font-size:4rem}.ibo-font-weight-100{font-weight:100}.ibo-font-weight-200{font-weight:200}.ibo-font-weight-300{font-weight:300}.ibo-font-weight-400{font-weight:400}.ibo-font-weight-500{font-weight:500}.ibo-font-weight-600,.ibo-navigation-menu--notifications-show-all-multiple~.ibo-popover-menu .ibo-navigation-menu--notifications-show-all-multiple--counter,.ibo-navigation-menu--notifications-show-all-multiple~.ui-menu .ibo-navigation-menu--notifications-show-all-multiple--counter,.ibo-navigation-menu--notifications-show-all-multiple~.ui-multiselect-menu .ibo-navigation-menu--notifications-show-all-multiple--counter,.ibo-navigation-menu--notifications-show-all-multiple~.ibo-input-select-icon--menu .ibo-navigation-menu--notifications-show-all-multiple--counter,.graph_config .toolkit_menu.graph>ul>li .ibo-navigation-menu--notifications-show-all-multiple~ul .ibo-navigation-menu--notifications-show-all-multiple--counter,.ibo-dashlet-badge--body--tooltip-title,.ibo-field--label,.ibo-tab-container--extra-tab-toggler--tooltip-title{font-weight:600}.ibo-has-description::after,.ibo-font-weight-700,.ibo-alert .ibo-alert--title,.ibo-tab-container--tab-header.ui-tabs-active,.ui-tabs-active.ibo-tab-container--extra-tabs-container{font-weight:700}.ibo-font-weight-800{font-weight:800}.ibo-font-weight-900{font-weight:900}.ibo-font-weight-950{font-weight:950}.ibo-font-ral-nor-50,.ibo-navigation-menu--menu-filter-hotkey{font-size:0.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-100,.ui-datepicker .ui-datepicker-title select,.ui-multiselect-checkboxes label,.ibo-input-select--autocomplete-item-txt,.ibo-datatableconfig--attributes-panel .ibo-panel--body,.ibo-navigation-menu--user-info .ibo-navigation-menu--user-organization,.ibo-linked-set--bulk-tooltip-info,.dataModelSchema text,.tooltipD3{font-size:1rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-150,.ibo-input,.ui-autocomplete-input,.ui-multiselect,.dataTables_length select,.ui_tpicker_hour_slider>select,.ui_tpicker_minute_slider>select,.ui_tpicker_second_slider>select,select.ibo-input-select-placeholder,.ibo-datatableconfig--attributes-panel--per-page--input,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.ibo-input-select.ibo-input-selectize input,.ibo-input-selectize.ui-multiselect input,.ui_tpicker_hour_slider>select.ibo-input-selectize input,.ui_tpicker_minute_slider>select.ibo-input-selectize input,.ui_tpicker_second_slider>select.ibo-input-selectize input,select.ibo-input-selectize.ibo-input-select-placeholder input,.ibo-title--subtitle,.ibo-navigation-menu--menu-nodes ul li>a,.ibo-navigation-menu--menu-nodes ul .ibo-quick-create--compartment-results--elementli>.option:hover,.ibo-navigation-menu--menu-nodes ul .ibo-quick-create--compartment-results--element>li>.option:hover,.ibo-navigation-menu--menu-nodes ul li>span,.ibo-navigation-menu--user-info .ibo-navigation-menu--user-notifications,.ibo-datamodel-viewer--details .ibo-panel--subtitle,.ibo-global-search--result--title{font-size:1.17rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-200,.ibo-collapsible-section .ibo-collapsible-section--body,.ibo-navigation-menu--menu-group{font-size:1.33rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-250,.ui-dialog-title,.ibo-navigation-menu--user-info .ibo-navigation-menu--user-welcome-message,#ibo_setup_container .ibo-setup--body .setup-content-title,#ibo_setup_container .ibo-setup--body h2,.setup-end-placeholder a,.setup-end-placeholder .ibo-quick-create--compartment-results--element>.option:hover{font-size:1.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-300,.ibo-quick-create--input.selectize-control.single .selectize-input>input,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active>input,.ibo-quick-create--input.selectize-control.single .selectize-input>.item,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active>.item,.ibo-global-search--input,.ibo-global-search--input:hover,.ibo-global-search--input:focus,.ibo-global-search--input:active{font-size:1.67rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-350,.ibo-navigation-menu--menu-nodes-title{font-size:1.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-400,.ibo-quick-create--icon,.ibo-global-search--icon{font-size:2rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-450{font-size:2.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-500{font-size:3rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-550{font-size:4rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-50,.ibo-badge{font-size:0.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-100,.dataTable th,.dataTable td,.ibo-breadcrumbs--item,.ibo-breadcrumbs--previous-items-list-toggler,.ibo-breadcrumbs--previous-item,.ibo-datatable[data-status="loading"] td,.ibo-extension-details--information--metadata,.ibo-extension-details--information--description,body{font-size:1rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-150,.ui-multiselect-checkboxes li,.ibo-extension-details--information--label,.ibo-welcome-popup--stack-item-title,.ibo-welcome-popup--message-description{font-size:1.17rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-200{font-size:1.33rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-250,.ibo-dashlet-badge--action-list{font-size:1.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-300,.ibo-title--text{font-size:1.67rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-350{font-size:1.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-400{font-size:2rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-450{font-size:2.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-500{font-size:3rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-550{font-size:4rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-50,.ibo-navigation-menu--menu-filter-clear{font-size:0.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-100,.ui-multiselect-header ul,.ui-multiselect-checkboxes li.ui-multiselect-optgroup-label,.ibo-navigation-menu--menu-node-counter,#tooltipD3_top{font-size:1rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-150,.ibo-object-summary--content--attributes--code,.ibo-alert.ibo-is-primary a,.ibo-alert.ibo-is-primary .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-secondary a,.ui-dialog .ibo-alert.ui-button a,.ui-dialog .ibo-alert.ui-button .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ui-datepicker-current a,.ibo-alert.ui-datepicker-current .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ui-datepicker-close a,.ibo-alert.ui-datepicker-close .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-secondary .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-neutral a,.ui-dialog .ibo-alert.ui-button.ui-dialog-titlebar-close a,.ibo-alert.ibo-is-neutral .ibo-quick-create--compartment-results--element>.option:hover,.ui-dialog .ibo-alert.ui-button.ui-dialog-titlebar-close .ibo-quick-create--compartment-results--element>.option:hover,.ibo-toast.ibo-is-information a,.ibo-toast.ibo-is-information .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-information a,.ibo-alert.ibo-is-information .ibo-quick-create--compartment-results--element>.option:hover,.ibo-toast.ibo-is-success a,.ibo-toast.ibo-is-success .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-success a,.ibo-alert.ibo-is-success .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-failure a,.ibo-alert.ibo-is-failure .ibo-quick-create--compartment-results--element>.option:hover,.ibo-toast.ibo-is-warning a,.ibo-toast.ibo-is-warning .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-warning a,.ibo-alert.ibo-is-warning .ibo-quick-create--compartment-results--element>.option:hover,.ibo-toast.ibo-is-error a,.ibo-toast.ibo-is-error .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-danger a,.ibo-alert.ibo-is-danger .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-grey a,.ibo-alert.ibo-is-grey .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-blue-grey a,.ibo-alert.ibo-is-blue-grey .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-blue a,.ibo-alert.ibo-is-blue .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-cyan a,.ibo-alert.ibo-is-cyan .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-green a,.ibo-alert.ibo-is-green .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-orange a,.ibo-alert.ibo-is-orange .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-red a,.ibo-alert.ibo-is-red .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-pink a,.ibo-alert.ibo-is-pink .ibo-quick-create--compartment-results--element>.option:hover,.ibo-welcome-popup--message-title{font-size:1.17rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-200,.ibo-dashlet-header-dynamic--count{font-size:1.33rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-250,.ibo-dashboard--top-bar .ibo-dashboard--top-bar-title{font-size:1.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-300{font-size:1.67rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-350{font-size:1.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-400{font-size:2rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-450,.ibo-dashlet-badge--action-list-count{font-size:2.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-500{font-size:3rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-550{font-size:4rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-50{font-size:0.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-100,.dataTables_paginate a.paginate_button.current,.dataTables_paginate .ibo-quick-create--compartment-results--element>.paginate_button.current.option:hover,.dataTables_scrollHead thead tr th,.ibo-button,.ui-dialog .ui-button,.ui-datepicker-current,.ui-datepicker-close,.ibo-datatable[data-status="loading"] th{font-size:1rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-150{font-size:1.17rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-200{font-size:1.33rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-250{font-size:1.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-300{font-size:1.67rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-350{font-size:1.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-400{font-size:2rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-450{font-size:2.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-500{font-size:3rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-550{font-size:4rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-50,.ibo-navigation-menu--menu-filter-hint{font-size:0.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-100,.ibo-quick-create--compartment--placeholder-hint,.ibo-global-search--compartment--placeholder-hint,.ibo-navigation-menu--menu--placeholder-hint,.ibo-activity-panel--body--placeholder-hint{font-size:1rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-150{font-size:1.17rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-200{font-size:1.33rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-250{font-size:1.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-300{font-size:1.67rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-350{font-size:1.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-400{font-size:2rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-450{font-size:2.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-500{font-size:3rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-550{font-size:4rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-code-50{font-size:0.83rem;font-family:monospace;font-weight:400}.ibo-font-code-100{font-size:1rem;font-family:monospace;font-weight:400}.ibo-is-code,.ibo-font-code-150,.ibo-input-text.ibo-is-code,textarea.ibo-is-code{font-size:1.17rem;font-family:monospace;font-weight:400}.ibo-font-code-200{font-size:1.33rem;font-family:monospace;font-weight:400}.ibo-font-code-250{font-size:1.5rem;font-family:monospace;font-weight:400}.ibo-font-code-300{font-size:1.67rem;font-family:monospace;font-weight:400}.ibo-font-code-350{font-size:1.83rem;font-family:monospace;font-weight:400}.ibo-font-code-400{font-size:2rem;font-family:monospace;font-weight:400}.ibo-font-code-450{font-size:2.5rem;font-family:monospace;font-weight:400}.ibo-font-code-500{font-size:3rem;font-family:monospace;font-weight:400}.ibo-font-code-550{font-size:4rem;font-family:monospace;font-weight:400}.ibo-add-margin-top-250{margin-top:12px}.ibo-welcome-popup--stack-item-icon{position:relative;border-radius:var(--ibo-border-radius-full);border:2px solid var(--ibo-color-grey-300);overflow:hidden}.ibo-welcome-popup--stack-item-icon>*{position:absolute;top:0;left:0;width:100%;height:100%;background-position:center;background-size:contain;background-color:var(--ibo-color-grey-500)}.ibo-is-visible{display:inherit !important;visibility:visible !important}.ibo-is-hidden{display:none !important}.ibo-is-transparent{opacity:0 !important}.ibo-is-opaque{opacity:1 !important}.content:not(:last-child),.ibo-is-html-content:not(:last-child){margin-bottom:1.5rem}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}html{background-color:white;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:hidden;overflow-y:auto;text-rendering:optimizeLegibility;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,optgroup,select,textarea{font-family:"Raleway", "sans-serif", "system-ui"}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:monospace}body{color:#212934;font-size:1rem;font-weight:500;line-height:1.5}a,.ibo-quick-create--compartment-results--element>.option:hover{color:#485fc7;cursor:pointer;text-decoration:none}a strong,.ibo-quick-create--compartment-results--element>.option:hover strong{color:currentColor}a:hover,.ibo-quick-create--compartment-results--element>.option:hover{color:#363636}code{background-color:whitesmoke;color:#da1039;font-size:0.875em;font-weight:normal;padding:0.25em 0.5em 0.25em}hr{background-color:whitesmoke;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type="checkbox"],input[type="radio"]{vertical-align:baseline}small{font-size:0.875em}span{font-style:inherit;font-weight:inherit}strong{color:inherit;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:whitesmoke;color:#4a4a4a;font-size:0.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:inherit}table th{color:inherit}@keyframes spinAround{from{transform:rotate(0deg)}to{transform:rotate(359deg)}}.content li+li,.ibo-is-html-content li+li{margin-top:0.25em}.content p:not(:last-child),.ibo-is-html-content p:not(:last-child),.content dl:not(:last-child),.ibo-is-html-content dl:not(:last-child),.content ol:not(:last-child),.ibo-is-html-content ol:not(:last-child),.content ul:not(:last-child),.ibo-is-html-content ul:not(:last-child),.content blockquote:not(:last-child),.ibo-is-html-content blockquote:not(:last-child),.content pre:not(:last-child),.ibo-is-html-content pre:not(:last-child),.content table:not(:last-child),.ibo-is-html-content table:not(:last-child){margin-bottom:0}.content h1,.ibo-is-html-content h1,.content h2,.ibo-is-html-content h2,.content h3,.ibo-is-html-content h3,.content h4,.ibo-is-html-content h4,.content h5,.ibo-is-html-content h5,.content h6,.ibo-is-html-content h6{color:inherit;font-weight:600;line-height:1.125}.content h1,.ibo-is-html-content h1{font-size:2em;margin-bottom:0.5em}.content h1:not(:first-child),.ibo-is-html-content h1:not(:first-child){margin-top:1em}.content h2,.ibo-is-html-content h2{font-size:1.75em;margin-bottom:0.5714em}.content h2:not(:first-child),.ibo-is-html-content h2:not(:first-child){margin-top:1.1428em}.content h3,.ibo-is-html-content h3{font-size:1.5em;margin-bottom:0.6666em}.content h3:not(:first-child),.ibo-is-html-content h3:not(:first-child){margin-top:1.3333em}.content h4,.ibo-is-html-content h4{font-size:1.25em;margin-bottom:0.8em}.content h5,.ibo-is-html-content h5{font-size:1.125em;margin-bottom:0.8888em}.content h6,.ibo-is-html-content h6{font-size:1em;margin-bottom:1em}.content blockquote,.ibo-is-html-content blockquote{background-color:whitesmoke;border-left:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol,.ibo-is-html-content ol{list-style-position:outside;margin-left:2em;margin-top:1em}.content ol:not([type]),.ibo-is-html-content ol:not([type]){list-style-type:decimal}.content ol:not([type]).is-lower-alpha,.ibo-is-html-content ol:not([type]).is-lower-alpha{list-style-type:lower-alpha}.content ol:not([type]).is-lower-roman,.ibo-is-html-content ol:not([type]).is-lower-roman{list-style-type:lower-roman}.content ol:not([type]).is-upper-alpha,.ibo-is-html-content ol:not([type]).is-upper-alpha{list-style-type:upper-alpha}.content ol:not([type]).is-upper-roman,.ibo-is-html-content ol:not([type]).is-upper-roman{list-style-type:upper-roman}.content ul,.ibo-is-html-content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul,.ibo-is-html-content ul ul{list-style-type:circle;margin-top:0.5em}.content ul ul ul,.ibo-is-html-content ul ul ul{list-style-type:square}.content dd,.ibo-is-html-content dd{margin-left:2em}.content figure,.ibo-is-html-content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child),.ibo-is-html-content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child),.ibo-is-html-content figure:not(:last-child){margin-bottom:2em}.content figure img,.ibo-is-html-content figure img{display:inline-block}.content figure figcaption,.ibo-is-html-content figure figcaption{font-style:italic}.content pre,.ibo-is-html-content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:1.25em 1.5em;white-space:pre;word-wrap:normal}.content sup,.ibo-is-html-content sup,.content sub,.ibo-is-html-content sub{font-size:75%}.content table,.ibo-is-html-content table{width:100%}.content table td,.ibo-is-html-content table td,.content table th,.ibo-is-html-content table th{border:"invalid on purpose";border-width:"invalid on purpose";padding:"invalid on purpose";vertical-align:top}.content table th,.ibo-is-html-content table th{color:"invalid on purpose"}.content table th:not([align]),.ibo-is-html-content table th:not([align]){text-align:inherit}.content table thead td,.ibo-is-html-content table thead td,.content table thead th,.ibo-is-html-content table thead th{border-width:"invalid on purpose";color:"invalid on purpose"}.content table tfoot td,.ibo-is-html-content table tfoot td,.content table tfoot th,.ibo-is-html-content table tfoot th{border-width:"invalid on purpose";color:"invalid on purpose"}.content table tbody tr:last-child td,.ibo-is-html-content table tbody tr:last-child td,.content table tbody tr:last-child th,.ibo-is-html-content table tbody tr:last-child th{border-bottom-width:1px}.content .tabs li+li,.ibo-is-html-content .tabs li+li{margin-top:0}.content.is-small,.is-small.ibo-is-html-content{font-size:0.75rem}.content.is-normal,.is-normal.ibo-is-html-content{font-size:1rem}.content.is-medium,.is-medium.ibo-is-html-content{font-size:1.25rem}.content.is-large,.is-large.ibo-is-html-content{font-size:1.5rem}.common-hljs-container{padding:0 !important;border:none !important}pre code.hljs{display:block;overflow-x:auto;padding:0.9rem !important}code.hljs{padding:4px 4px !important}.hljs{box-shadow:0 0px 3px 2px inset rgba(0, 0, 0, 0.4) !important;border-radius:3px !important;white-space:pre-wrap;border:none !important;color:#e0e2e4 !important;background:#282b2e !important}.hljs-keyword,.hljs-selector-tag,.hljs-literal,.hljs-selector-id{color:#93c763 !important}.hljs-number{color:#ffcd22 !important}.hljs-attribute{color:#668bb0}.hljs-regexp,.hljs-link{color:#d39745 !important}.hljs-meta{color:#557182 !important}.hljs-tag,.hljs-name,.hljs-bullet,.hljs-subst,.hljs-emphasis,.hljs-type,.hljs-built_in,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-addition,.hljs-variable,.hljs-template-tag,.hljs-template-variable{color:#8cbbad !important}.hljs-string,.hljs-symbol{color:#ec7600 !important}.hljs-comment,.hljs-quote,.hljs-deletion{color:#818e96 !important}.hljs-selector-class{color:#A082BD !important}.hljs-keyword,.hljs-selector-tag,.hljs-literal,.hljs-doctag,.hljs-title,.hljs-section,.hljs-type,.hljs-name,.hljs-strong{font-weight:bold}.hljs-code,.hljs-title.class_,.hljs-class .hljs-title,.hljs-section{color:white !important}/*! + */:root{--skeleton-start-color: #e1e7ec;--skeleton-stop-color: #cfd8dc}.ibo-panel.ibo-is-selectable:hover .ibo-panel--body::after{font-family:"Font Awesome 5 Free";font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.dataTables_scrollHead thead tr th.sorting::after,.selectize-input .attribute-set-item.item-add::before,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active .attribute-set-item.item-add::before,.selectize-input .attribute-set-item.item-remove::before,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active .attribute-set-item.item-remove::before,.ibo-breadcrumbs--item:not(:last-child)::after,.ibo-breadcrumbs--previous-items-list-toggler:not(:last-child)::after,.ibo-panel.ibo-is-selectable .ibo-panel--body::after,.ibo-panel.ibo-is-selected .ibo-panel--body::after,.ibo-prop--apply.ui-state-error:after,.ibo-sort-order::after,.ibo-dashboard--slider:before,.ibo-dashboard--slider:after,.ibo-bulk--bulk-modify--incompatible-attribute:before,.ibo-linked-set--bulk-tooltip-info:before,.ibo-tab-container--tab-header.ibo-drag-in>a::after,.ibo-drag-in.ibo-tab-container--extra-tabs-container>a::after,.ibo-quick-create--compartment-results--element.ibo-tab-container--tab-header>.option:hover::after,.ibo-quick-create--compartment-results--element.ibo-drag-in>.option:hover::after,.collapsable-options [data-role="setup-collapsable-options--toggler"]::before,#params_summary div.closed .title::before,#params_summary div:not(.closed) .title::before{font-family:"Font Awesome 5 Free";font-weight:900;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.common-is-fullwidth{width:100%}.common-font-size-50{font-size:0.83rem}.common-font-size-100{font-size:1rem}.common-font-size-150{font-size:1.17rem}.common-font-size-200{font-size:1.33rem}.common-font-size-250{font-size:1.5rem}.common-font-size-300{font-size:1.67rem}.common-font-size-350{font-size:1.83rem}.common-font-size-400{font-size:2rem}.common-font-size-450{font-size:2.5rem}.common-font-size-500{font-size:3rem}.common-font-size-550{font-size:4rem}.common-font-weight-100{font-weight:100}.common-font-weight-200{font-weight:200}.common-font-weight-300{font-weight:300}.common-font-weight-400{font-weight:400}.common-font-weight-500{font-weight:500}.common-font-weight-600{font-weight:600}.common-font-weight-700{font-weight:700}.common-font-weight-800{font-weight:800}.common-font-weight-900{font-weight:900}.common-font-weight-950{font-weight:950}.common-font-ral-nor-50{font-size:0.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-nor-100{font-size:1rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-nor-150{font-size:1.17rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-nor-200{font-size:1.33rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-nor-250{font-size:1.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-nor-300{font-size:1.67rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-nor-350{font-size:1.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-nor-400{font-size:2rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-nor-450{font-size:2.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-nor-500{font-size:3rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-nor-550{font-size:4rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-med-50{font-size:0.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-med-100{font-size:1rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-med-150{font-size:1.17rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-med-200{font-size:1.33rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-med-250{font-size:1.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-med-300{font-size:1.67rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-med-350{font-size:1.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-med-400{font-size:2rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-med-450{font-size:2.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-med-500{font-size:3rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-med-550{font-size:4rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-bol-50{font-size:0.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-bol-100{font-size:1rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-bol-150{font-size:1.17rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-bol-200{font-size:1.33rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-bol-250{font-size:1.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-bol-300{font-size:1.67rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-bol-350{font-size:1.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-bol-400{font-size:2rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-bol-450{font-size:2.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-bol-500{font-size:3rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-bol-550{font-size:4rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-sembol-50{font-size:0.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-sembol-100{font-size:1rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-sembol-150{font-size:1.17rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-sembol-200{font-size:1.33rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-sembol-250{font-size:1.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-sembol-300{font-size:1.67rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-sembol-350{font-size:1.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-sembol-400{font-size:2rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-sembol-450{font-size:2.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-sembol-500{font-size:3rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-sembol-550{font-size:4rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-ita-50{font-size:0.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-ita-100{font-size:1rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-ita-150{font-size:1.17rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-ita-200{font-size:1.33rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-ita-250{font-size:1.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-ita-300{font-size:1.67rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-ita-350{font-size:1.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-ita-400{font-size:2rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-ita-450{font-size:2.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-ita-500{font-size:3rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-ral-ita-550{font-size:4rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.common-font-code-50{font-size:0.83rem;font-family:monospace;font-weight:400}.common-font-code-100{font-size:1rem;font-family:monospace;font-weight:400}.common-font-code-150{font-size:1.17rem;font-family:monospace;font-weight:400}.common-font-code-200{font-size:1.33rem;font-family:monospace;font-weight:400}.common-font-code-250{font-size:1.5rem;font-family:monospace;font-weight:400}.common-font-code-300{font-size:1.67rem;font-family:monospace;font-weight:400}.common-font-code-350{font-size:1.83rem;font-family:monospace;font-weight:400}.common-font-code-400{font-size:2rem;font-family:monospace;font-weight:400}.common-font-code-450{font-size:2.5rem;font-family:monospace;font-weight:400}.common-font-code-500{font-size:3rem;font-family:monospace;font-weight:400}.common-font-code-550{font-size:4rem;font-family:monospace;font-weight:400}@font-face{font-family:Raleway;font-weight:100;font-style:normal;font-display:swap;src:local("Raleway Thin"), url("../node_modules/@fontsource/raleway/files/raleway-all-100-normal.woff") format("woff")}@font-face{font-family:Raleway;font-weight:100;font-style:italic;font-display:swap;src:local("Raleway Thin"), url("../node_modules/@fontsource/raleway/files/raleway-all-100-italic.woff") format("woff")}@font-face{font-family:Raleway;font-weight:200;font-style:normal;font-display:swap;src:local("Raleway ExtraLight"), url("../node_modules/@fontsource/raleway/files/raleway-all-200-normal.woff") format("woff")}@font-face{font-family:Raleway;font-weight:200;font-style:italic;font-display:swap;src:local("Raleway ExtraLight"), url("../node_modules/@fontsource/raleway/files/raleway-all-200-italic.woff") format("woff")}@font-face{font-family:Raleway;font-weight:300;font-style:normal;font-display:swap;src:local("Raleway Light"), url("../node_modules/@fontsource/raleway/files/raleway-all-300-normal.woff") format("woff")}@font-face{font-family:Raleway;font-weight:300;font-style:italic;font-display:swap;src:local("Raleway Light"), url("../node_modules/@fontsource/raleway/files/raleway-all-300-italic.woff") format("woff")}@font-face{font-family:Raleway;font-weight:400;font-style:normal;font-display:swap;src:local("Raleway"), url("../node_modules/@fontsource/raleway/files/raleway-all-400-normal.woff") format("woff")}@font-face{font-family:Raleway;font-weight:400;font-style:italic;font-display:swap;src:local("Raleway"), url("../node_modules/@fontsource/raleway/files/raleway-all-400-italic.woff") format("woff")}@font-face{font-family:Raleway;font-weight:500;font-style:normal;font-display:swap;src:local("Raleway Medium"), url("../node_modules/@fontsource/raleway/files/raleway-all-500-normal.woff") format("woff")}@font-face{font-family:Raleway;font-weight:500;font-style:italic;font-display:swap;src:local("Raleway Medium"), url("../node_modules/@fontsource/raleway/files/raleway-all-500-italic.woff") format("woff")}@font-face{font-family:Raleway;font-weight:600;font-style:normal;font-display:swap;src:local("Raleway SemiBold"), url("../node_modules/@fontsource/raleway/files/raleway-all-600-normal.woff") format("woff")}@font-face{font-family:Raleway;font-weight:600;font-style:italic;font-display:swap;src:local("Raleway SemiBold"), url("../node_modules/@fontsource/raleway/files/raleway-all-600-italic.woff") format("woff")}@font-face{font-family:Raleway;font-weight:700;font-style:normal;font-display:swap;src:local("Raleway"), url("../node_modules/@fontsource/raleway/files/raleway-all-700-normal.woff") format("woff")}@font-face{font-family:Raleway;font-weight:700;font-style:italic;font-display:swap;src:local("Raleway"), url("../node_modules/@fontsource/raleway/files/raleway-all-700-italic.woff") format("woff")}@font-face{font-family:Raleway;font-weight:800;font-style:normal;font-display:swap;src:local("Raleway ExtraBold"), url("../node_modules/@fontsource/raleway/files/raleway-all-800-normal.woff") format("woff")}@font-face{font-family:Raleway;font-weight:800;font-style:italic;font-display:swap;src:local("Raleway ExtraBold"), url("../node_modules/@fontsource/raleway/files/raleway-all-800-italic.woff") format("woff")}@font-face{font-family:Raleway;font-weight:900;font-style:normal;font-display:swap;src:local("Raleway Black"), url("../node_modules/@fontsource/raleway/files/raleway-all-900-normal.woff") format("woff")}@font-face{font-family:Raleway;font-weight:900;font-style:italic;font-display:swap;src:local("Raleway Black"), url("../node_modules/@fontsource/raleway/files/raleway-all-900-italic.woff") format("woff")}:root{--ibo-color-white-100: white;--ibo-color-white-200: #f2f2f2;--ibo-color-transparent: rgba(255, 255, 255, 0);--ibo-color-grey-50: #fcfcfd;--ibo-color-grey-100: #f8f9fa;--ibo-color-grey-200: #e1e7ec;--ibo-color-grey-300: #d5dde5;--ibo-color-grey-400: #ccd4db;--ibo-color-grey-500: #aebecd;--ibo-color-grey-600: #929fb1;--ibo-color-grey-700: #6e7a8a;--ibo-color-grey-800: #404b5a;--ibo-color-grey-900: #212934;--ibo-color-grey-950: #141a22;--ibo-color-blue-grey-50: #f1f5f8;--ibo-color-blue-grey-100: #cfd8dc;--ibo-color-blue-grey-200: #b0bec5;--ibo-color-blue-grey-300: #90a4ae;--ibo-color-blue-grey-400: #78909c;--ibo-color-blue-grey-500: #607d8b;--ibo-color-blue-grey-600: #546e7a;--ibo-color-blue-grey-700: #455a64;--ibo-color-blue-grey-800: #37474f;--ibo-color-blue-grey-900: #263238;--ibo-color-blue-grey-950: #1b2428;--ibo-color-blue-100: #ebf8ff;--ibo-color-blue-200: #bee3f8;--ibo-color-blue-300: #90cef4;--ibo-color-blue-400: #63b4ed;--ibo-color-blue-500: #429ae1;--ibo-color-blue-600: #3182ce;--ibo-color-blue-700: #2b6bb0;--ibo-color-blue-800: #2c5382;--ibo-color-blue-900: #2a4265;--ibo-color-blue-950: #253750;--ibo-color-cyan-100: #c9eef2;--ibo-color-cyan-200: #80deea;--ibo-color-cyan-300: #4dd0e1;--ibo-color-cyan-400: #26c5da;--ibo-color-cyan-500: #00bbd4;--ibo-color-cyan-600: #00aac1;--ibo-color-cyan-700: #0096a7;--ibo-color-cyan-800: #00838f;--ibo-color-cyan-900: #006164;--ibo-color-cyan-950: #003636;--ibo-color-green-100: #dcedc8;--ibo-color-green-200: #c5e1a5;--ibo-color-green-300: #aed581;--ibo-color-green-400: #9ccc65;--ibo-color-green-500: #8ac34a;--ibo-color-green-600: #7cb342;--ibo-color-green-700: #689f38;--ibo-color-green-800: #558b2f;--ibo-color-green-900: #33691e;--ibo-color-green-950: #235816;--ibo-color-orange-100: floralwhite;--ibo-color-orange-200: #feebc8;--ibo-color-orange-300: #fbd38d;--ibo-color-orange-400: #f6ae55;--ibo-color-orange-500: #ea7d1e;--ibo-color-orange-600: #dd6c20;--ibo-color-orange-700: #c05621;--ibo-color-orange-800: #9c4221;--ibo-color-orange-900: #7b341e;--ibo-color-orange-950: #572819;--ibo-color-red-100: #fce8e8;--ibo-color-red-200: #fed7d7;--ibo-color-red-300: #feb2b2;--ibo-color-red-400: #fc8181;--ibo-color-red-500: #f56565;--ibo-color-red-600: #e53e3e;--ibo-color-red-700: #c53030;--ibo-color-red-800: #9b2c2c;--ibo-color-red-900: #742a2a;--ibo-color-red-950: #491d1d;--ibo-color-pink-100: #fff5f7;--ibo-color-pink-200: #fed7e2;--ibo-color-pink-300: #fbb6ce;--ibo-color-pink-400: #f688b4;--ibo-color-pink-500: #ed64a6;--ibo-color-pink-600: #d53f8c;--ibo-color-pink-700: #b83280;--ibo-color-pink-800: #97266d;--ibo-color-pink-900: #702459;--ibo-color-pink-950: #511a40;--ibo-color-yellow-100: ivory;--ibo-color-yellow-200: #fefcbf;--ibo-color-yellow-300: #faf089;--ibo-color-yellow-400: #f6e05e;--ibo-color-yellow-500: #ecc94b;--ibo-color-yellow-600: #d69e2e;--ibo-color-yellow-700: #b7791f;--ibo-color-yellow-800: #975a16;--ibo-color-yellow-900: #744210;--ibo-color-yellow-950: #4e2a09;--ibo-color-purple-100: #ede9fe;--ibo-color-purple-200: #ddd6fe;--ibo-color-purple-300: #c4b5fd;--ibo-color-purple-400: #a78bfa;--ibo-color-purple-500: #8b5cf6;--ibo-color-purple-600: #7c3aed;--ibo-color-purple-700: #6d28d9;--ibo-color-purple-800: #5b21b6;--ibo-color-purple-900: #4c1d95;--ibo-color-purple-950: #371371}:root{--ibo-color-primary-100: floralwhite;--ibo-color-primary-200: #feebc8;--ibo-color-primary-300: #fbd38d;--ibo-color-primary-400: #f6ae55;--ibo-color-primary-500: #ea7d1e;--ibo-color-primary-600: #dd6c20;--ibo-color-primary-700: #c05621;--ibo-color-primary-800: #9c4221;--ibo-color-primary-900: #7b341e;--ibo-color-primary-950: #572819;--ibo-color-secondary-100: #f8f9fa;--ibo-color-secondary-200: #e1e7ec;--ibo-color-secondary-300: #d5dde5;--ibo-color-secondary-400: #ccd4db;--ibo-color-secondary-500: #aebecd;--ibo-color-secondary-600: #929fb1;--ibo-color-secondary-700: #6e7a8a;--ibo-color-secondary-800: #404b5a;--ibo-color-secondary-900: #212934;--ibo-color-secondary-950: #141a22;--ibo-color-information-100: #ebf8ff;--ibo-color-information-200: #bee3f8;--ibo-color-information-300: #90cef4;--ibo-color-information-400: #63b4ed;--ibo-color-information-500: #429ae1;--ibo-color-information-600: #3182ce;--ibo-color-information-700: #2b6bb0;--ibo-color-information-800: #2c5382;--ibo-color-information-900: #2a4265;--ibo-color-information-950: #253750;--ibo-color-success-100: #dcedc8;--ibo-color-success-200: #c5e1a5;--ibo-color-success-300: #aed581;--ibo-color-success-400: #9ccc65;--ibo-color-success-500: #8ac34a;--ibo-color-success-600: #7cb342;--ibo-color-success-700: #689f38;--ibo-color-success-800: #558b2f;--ibo-color-success-900: #33691e;--ibo-color-success-950: #235816;--ibo-color-warning-100: floralwhite;--ibo-color-warning-200: #feebc8;--ibo-color-warning-300: #fbd38d;--ibo-color-warning-400: #f6ae55;--ibo-color-warning-500: #ea7d1e;--ibo-color-warning-600: #dd6c20;--ibo-color-warning-700: #c05621;--ibo-color-warning-800: #9c4221;--ibo-color-warning-900: #7b341e;--ibo-color-warning-950: #572819;--ibo-color-danger-100: #fce8e8;--ibo-color-danger-200: #fed7d7;--ibo-color-danger-300: #feb2b2;--ibo-color-danger-400: #fc8181;--ibo-color-danger-500: #f56565;--ibo-color-danger-600: #e53e3e;--ibo-color-danger-700: #c53030;--ibo-color-danger-800: #9b2c2c;--ibo-color-danger-900: #742a2a;--ibo-color-danger-950: #491d1d;--ibo-color-error-100: #fce8e8;--ibo-color-error-200: #fed7d7;--ibo-color-error-300: #feb2b2;--ibo-color-error-400: #fc8181;--ibo-color-error-500: #f56565;--ibo-color-error-600: #e53e3e;--ibo-color-error-700: #c53030;--ibo-color-error-800: #9b2c2c;--ibo-color-error-900: #742a2a;--ibo-color-error-950: #491d1d;--ibo-caselog-color-highlight-1: #689f38;--ibo-caselog-color-highlight-2: #b83280;--ibo-caselog-color-highlight-3: #f6ae55;--ibo-caselog-color-highlight-4: #3182ce;--ibo-caselog-color-highlight-5: #80deea}:root{--ibo-lifecycle-new-state-primary-color: #2c5382;--ibo-lifecycle-new-state-secondary-color: white;--ibo-lifecycle-neutral-state-primary-color: #2c5382;--ibo-lifecycle-neutral-state-secondary-color: white;--ibo-lifecycle-waiting-state-primary-color: #f6ae55;--ibo-lifecycle-waiting-state-secondary-color: white;--ibo-lifecycle-success-state-primary-color: #689f38;--ibo-lifecycle-success-state-secondary-color: white;--ibo-lifecycle-failure-state-primary-color: #b83280;--ibo-lifecycle-failure-state-secondary-color: white;--ibo-lifecycle-frozen-state-primary-color: #e1e7ec;--ibo-lifecycle-frozen-state-secondary-color: #6e7a8a;--ibo-lifecycle-active-state-primary-color: #689f38;--ibo-lifecycle-active-state-secondary-color: white;--ibo-lifecycle-inactive-state-primary-color: #f6ae55;--ibo-lifecycle-inactive-state-secondary-color: white}:root{--skeleton-start-color: #e1e7ec;--skeleton-stop-color: #cfd8dc}:root{--ibo-border-radius-100: 1px;--ibo-border-radius-300: 3px;--ibo-border-radius-500: 5px;--ibo-border-radius-700: 10px;--ibo-border-radius-900: 16px;--ibo-border-radius-full: 100%}:root{--ibo-depression-100: inset 0 1px 1px 0 rgba(0, 0, 0, 0.15)}:root{--ibo-elevation-100: 0 1px 2px rgba(0, 0, 0, 0.25), 0 1px 3px rgba(0, 0, 0, 0.12);--ibo-elevation-200: 0 2px 4px rgba(0, 0, 0, 0.12), 0 3px 6px rgba(0, 0, 0, 0.15);--ibo-elevation-300: 0 3px 6px rgba(0, 0, 0, 0.1), 0 10px 20px rgba(0, 0, 0, 0.15);--ibo-elevation-400: 0 5px 10px rgba(0, 0, 0, 0.05), 0 15px 25px rgba(0, 0, 0, 0.15);--ibo-elevation-500: 0 20px 40px rgba(0, 0, 0, 0.2)}:root{--ibo-size-0: 0;--ibo-size-50: 2px;--ibo-size-100: 4px;--ibo-size-150: 8px;--ibo-size-200: 12px;--ibo-size-250: 16px;--ibo-size-300: 24px;--ibo-size-350: 32px;--ibo-size-400: 48px;--ibo-size-450: 64px;--ibo-size-500: 96px;--ibo-size-550: 128px;--ibo-size-600: 192px;--ibo-size-650: 256px;--ibo-size-700: 384px;--ibo-size-750: 512px;--ibo-size-800: 640px;--ibo-size-850: 768px;--ibo-size-900: 896px}:root{--ibo-spacing-0: 0;--ibo-spacing-100: 2px;--ibo-spacing-200: 4px;--ibo-spacing-300: 8px;--ibo-spacing-400: 12px;--ibo-spacing-500: 16px;--ibo-spacing-600: 24px;--ibo-spacing-700: 32px;--ibo-spacing-800: 48px;--ibo-spacing-900: 64px;--ibo-spacing-950: 96px}:root{--ibo-font-size-50: 0.83rem;--ibo-font-size-100: 1rem;--ibo-font-size-150: 1.17rem;--ibo-font-size-200: 1.33rem;--ibo-font-size-250: 1.5rem;--ibo-font-size-300: 1.67rem;--ibo-font-size-350: 1.83rem;--ibo-font-size-400: 2rem;--ibo-font-size-450: 2.5rem;--ibo-font-size-500: 3rem;--ibo-font-size-550: 4rem}:root{--ibo-font-weight-100: 100;--ibo-font-weight-200: 200;--ibo-font-weight-300: 300;--ibo-font-weight-400: 400;--ibo-font-weight-500: 500;--ibo-font-weight-600: 600;--ibo-font-weight-700: 700;--ibo-font-weight-800: 800;--ibo-font-weight-900: 900;--ibo-font-weight-950: 950}:root{--ibo-font-family-base: Raleway;--ibo-font-family-monospace: monospace;--ibo-font-family-code: monospace}#ibo-setup-licenses--components-list{border-radius:3px}.ibo-welcome-popup--stack-item{border-radius:4px}.ibo-datatable .ibo-field-badge::before{border-radius:100%}.ibo-text.ibo-is-primary{color:#9c4221}.ibo-text.ibo-is-secondary,.ui-dialog .ibo-text.ui-button,.ibo-text.ui-datepicker-current,.ibo-text.ui-datepicker-close{color:#404b5a}.ibo-text.ibo-is-neutral,.ui-dialog .ibo-text.ui-button.ui-dialog-titlebar-close{color:#404b5a}.ibo-text.ibo-is-information{color:#2c5382}.ibo-text.ibo-is-success{color:#558b2f}.ibo-text.ibo-is-failure{color:#9b2c2c}.ibo-text.ibo-is-warning{color:#9c4221}.ibo-text.ibo-is-danger{color:#9b2c2c}.ibo-text.ibo-is-grey{color:#404b5a}.ibo-text.ibo-is-blue-grey{color:#37474f}.ibo-text.ibo-is-blue{color:#2c5382}.ibo-text.ibo-is-cyan{color:#00838f}.ibo-text.ibo-is-green{color:#558b2f}.ibo-text.ibo-is-orange{color:#9c4221}.ibo-text.ibo-is-red{color:#9b2c2c}.ibo-text.ibo-is-pink{color:#97266d}.ibo-class-icon.ibo-is-small{width:32px;min-width:32px;max-height:32px}.ibo-class-icon.ibo-is-medium{width:48px;min-width:48px;max-height:48px}.ibo-class-icon.ibo-is-large{width:64px;min-width:64px;max-height:64px}.ibo-activity-panel--tab-title-decoration{box-shadow:inset 0 1px 1px 0 rgba(0, 0, 0, 0.15)}.ibo-top-bar,.ibo-tab-container--extra-tabs-list{box-shadow:0 1px 2px rgba(0, 0, 0, 0.25), 0 1px 3px rgba(0, 0, 0, 0.12)}.ibo-breadcrumbs--previous-items-list,.ibo-quick-create--input.selectize-control.single .selectize-dropdown,.ibo-popover-menu,.ui-menu,.ui-multiselect-menu,.ibo-input-select-icon--menu,.graph_config .toolkit_menu.graph>ul>li ul,.ibo-activity-panel--filter-options{box-shadow:0 3px 6px rgba(0, 0, 0, 0.1), 0 10px 20px rgba(0, 0, 0, 0.15)}html.ibo-has-fullscreen-descendant{position:fixed !important;width:0 !important;height:0 !important}body.ibo-has-fullscreen-descendant{width:0 !important;height:0 !important;overflow:hidden !important}.ibo-has-fullscreen-descendant{position:static !important;overflow:visible !important;z-index:1050 !important}.ibo-is-fullscreen{position:absolute;top:0 !important;left:0 !important;margin:0 !important;padding:0 !important;width:100vw;height:100vh;overflow:auto;z-index:1050}.ibo-sticky-sentinel{position:absolute;left:0;right:0;visibility:hidden}.ibo-sticky-sentinel-top{top:0;height:0}.ibo-sticky-sentinel-bottom{bottom:0;height:0}:root{--ibo-hyperlink-color: #c05621;--ibo-hyperlink-text-decoration: none;--ibo-hyperlink-color--on-hover: #9c4221;--ibo-hyperlink-text-decoration--on-hover: none;--ibo-hyperlink-color--on-active: #7b341e;--ibo-hyperlink-text-decoration--on-active: none}.ibo-text-truncated-with-ellipsis,.ui-dialog .ui-dialog-title,.ibo-button--label,.ibo-breadcrumbs--item-label,.ibo-quick-create--compartment-element,.ibo-quick-create--compartment-results--element>.option,.ibo-global-search--compartment-element,.ibo-dashlet-badge--action-list-label,.ibo-input-select--autocomplete-item-txt,.attribute-set .attribute-set-item,.selectize-control.multi .selectize-input.ibo-input-set .attribute-set-item,.selectize-control.multi .ibo-quick-create--input.selectize-control.single .ibo-input-set.selectize-input.input-active .attribute-set-item,.ibo-quick-create--input.selectize-control.single .selectize-control.multi .ibo-input-set.selectize-input.input-active .attribute-set-item,.attribute-set .attribute-set-item>*,.selectize-control.multi .selectize-input.ibo-input-set .attribute-set-item>*,.selectize-control.multi .ibo-quick-create--input.selectize-control.single .ibo-input-set.selectize-input.input-active .attribute-set-item>*,.ibo-quick-create--input.selectize-control.single .selectize-control.multi .ibo-input-set.selectize-input.input-active .attribute-set-item>*,.ibo-navigation-menu--menu-group-title,.ibo-top-bar--toolbar-dashboard-title,.ibo-tab-container--tab-toggler,.ibo-tab-container--extra-tabs-list-toggler,.ibo-tab-container--tab-toggler-label,.ibo-tab-container--extra-tab-toggler,.ibo-object-details>.ibo-panel--header .ibo-panel--subtitle,.ibo-object-details>.ibo-object-summary--header .ibo-panel--subtitle,.ibo-activity-panel--tab-title-text,.ibo-activity-panel--filter-option,.ibo-welcome-popup--stack-item-title{white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis}.dataTables_paginate a.paginate_button,.dataTables_paginate .ibo-quick-create--compartment-results--element>.paginate_button.option:hover,.ibo-dashlet-badge--action-list:hover,.ibo-dashlet-badge--action-list:active,.ibo-field--fullscreen-toggler,.ibo-input-select--action-buttons a,.ibo-input-select--action-buttons .ibo-quick-create--compartment-results--element>.option:hover,.search_form_handler a,.search_form_handler .ibo-quick-create--compartment-results--element>.option:hover,.ibo-navigation-menu--menu-filter-clear,.ibo-navigation-menu--menu-filter-hint-close,.ibo-tab-container--tab-toggler,.ibo-tab-container--extra-tabs-list-toggler,.ibo-activity-panel--load-entries-button,.ibo-welcome-popup--stack-item-title{color:inherit}.dataTables_paginate a.paginate_button:hover,.dataTables_paginate .ibo-quick-create--compartment-results--element>.paginate_button.option:hover,.ibo-dashlet-badge--action-list:hover,.ibo-dashlet-badge--action-list:active:hover,.ibo-field--fullscreen-toggler:hover,.ibo-input-select--action-buttons a:hover,.ibo-input-select--action-buttons .ibo-quick-create--compartment-results--element>.option:hover,.search_form_handler a:hover,.search_form_handler .ibo-quick-create--compartment-results--element>.option:hover,.ibo-navigation-menu--menu-filter-clear:hover,.ibo-navigation-menu--menu-filter-hint-close:hover,.ibo-tab-container--tab-toggler:hover,.ibo-tab-container--extra-tabs-list-toggler:hover,.ibo-activity-panel--load-entries-button:hover,.ibo-welcome-popup--stack-item-title:hover,.dataTables_paginate a.paginate_button:active,.dataTables_paginate .ibo-quick-create--compartment-results--element>.paginate_button.option:hover:active,.ibo-dashlet-badge--action-list:hover:active,.ibo-dashlet-badge--action-list:active,.ibo-field--fullscreen-toggler:active,.ibo-input-select--action-buttons a:active,.ibo-input-select--action-buttons .ibo-quick-create--compartment-results--element>.option:hover:active,.search_form_handler a:active,.search_form_handler .ibo-quick-create--compartment-results--element>.option:hover:active,.ibo-navigation-menu--menu-filter-clear:active,.ibo-navigation-menu--menu-filter-hint-close:active,.ibo-tab-container--tab-toggler:active,.ibo-tab-container--extra-tabs-list-toggler:active,.ibo-activity-panel--load-entries-button:active,.ibo-welcome-popup--stack-item-title:active{color:inherit}.ibo-navigation-menu--notifications-item .ibo-navigation-menu--notifications--item--content a,.ibo-navigation-menu--notifications-item .ibo-navigation-menu--notifications--item--content .ibo-quick-create--compartment-results--element>.option:hover{color:#c05621;text-decoration:none}.ibo-navigation-menu--notifications-item .ibo-navigation-menu--notifications--item--content a:hover,.ibo-navigation-menu--notifications-item .ibo-navigation-menu--notifications--item--content .ibo-quick-create--compartment-results--element>.option:hover{color:#9c4221;text-decoration:none}.ibo-navigation-menu--notifications-item .ibo-navigation-menu--notifications--item--content a:active,.ibo-navigation-menu--notifications-item .ibo-navigation-menu--notifications--item--content .ibo-quick-create--compartment-results--element>.option:hover:active{color:#7b341e;text-decoration:none}.ibo-is-broken-hyperlink{text-decoration:line-through;cursor:help}.ibo-is-disabled{cursor:not-allowed !important}.ibo-has-description::after{content:"🛈";padding-left:4px;vertical-align:top;cursor:pointer;color:#929fb1;font-size:0.7em}.ibo-is-code{background-color:#f2f2f2;padding:1.25rem 1.5rem}.ibo-is-html-content{}.ibo-is-html-content table{border-collapse:separate;border-spacing:2px}.ibo-is-html-content>code,.ibo-is-html-content code:not(.hljs){color:inherit}.ibo-is-html-content p{margin-top:0.25em;margin-bottom:0.25em}.ibo-is-html-content figure{display:inline-block;margin-left:2em !important;margin-right:2em !important}.ibo-is-html-content figure:not(:last-child){margin-bottom:2em !important}.ibo-is-html-content figure:not(:first-child){margin-top:2em !important}.ibo-is-fullwidth{width:100%}.ibo-welcome-popup--stack-item-icon,.ibo-panel--header-left,.ibo-panel--icon,.ibo-dashlet-header-static--icon-container,.ibo-input-image--image-view,.ibo-input-select--autocomplete-item-image,.ibo-pill,.ibo-title--icon,.ibo-datatable--toolbar-left,.ibo-datatable--toolbar-right,.ibo-field--fullscreen-toggler,.ibo-navigation-menu--bottom-part,.ibo-navigation-menu--user-info,.ibo-navigation-menu--user-info .ibo-navigation-menu--user-picture,.ibo-tab-container--tab-toggler,.ibo-tab-container--extra-tabs-list-toggler,.ibo-object-details--status-dot,.ibo-activity-panel--tab-title,.ibo-activity-panel--tab-toolbar-actions,.ibo-activity-panel--tab-toolbar-action,.ibo-activity-panel--body--placeholder-image,.ibo-activity-panel--body--placeholder-hint,.ibo-activity-panel--closed-cover,.ibo-caselog-entry-form--lock-icon,.ibo-activity-entry--medallion,.ibo-activity-panel--load-more-entries-container,.ibo-activity-panel--load-entries-button,.ibo-notifications--view-all--empty{display:flex;justify-content:center;align-items:center}.dataTables_paginate,.ibo-dashlet-badge--action-list,.ibo-input,.ui-autocomplete-input,.ui-multiselect,.dataTables_length select,.ui_tpicker_hour_slider>select,.ui_tpicker_minute_slider>select,.ui_tpicker_second_slider>select,select.ibo-input-select-placeholder,.ibo-datatableconfig--attributes-panel--per-page--input,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.ibo-toolbar.ibo-toolbar--button,.ibo-activity-panel--tab-toolbar-left-actions,.ibo-activity-panel--tab-toolbar-middle-actions,.ibo-activity-panel--tab-toolbar-right-actions,.ibo-activity-panel--filter-option,.ibo-activity-panel--entry-forms-confirmation-preference,.ibo-caselog-entry-form--lock-indicator,.ibo-caselog-entry-form--action-buttons--main-actions,.ibo-welcome-popup--stack-item,#ibo_setup_container .ibo-title,#ibo_setup_container .ibo-setup--body .ibo-setup--button-bar,.ibo-setup--button-bar{display:flex;align-items:center}.ibo-dashlet-badge--action-create,.ibo-title,.ibo-title--subtitle,.ibo-object-details--status,.ibo-activity-panel--add-caselog-entry-button{display:flex;align-items:baseline}.ibo-breadcrumbs,.ibo-quick-create,.ibo-quick-create--head,.ibo-global-search,.ibo-global-search--head,.ibo-top-bar,.ibo-top-bar--quick-actions,.ibo-top-bar--toolbar,.ibo-top-bar--toolbar-dashboard-menu-toggler,.ibo-tab-container--tabs-list,.ibo-tab-container--tab-header,.ibo-tab-container--extra-tabs-container,.ibo-dashboard--top-bar,.ibo-welcome-popup--dialog{display:flex;align-items:stretch}.ibo-font-size-50,.ibo-field--fullscreen-toggler,.ibo-activity-panel--tab-title-draft-indicator,.ibo-activity-entry--sub-information{font-size:0.83rem}.ibo-font-size-100,.dataTables_paginate a.paginate_button,.dataTables_paginate .ibo-quick-create--compartment-results--element>.paginate_button.option:hover,.selectize-add-option,.ibo-quick-create--drawer,.ibo-global-search--drawer,.ibo-dashlet-header-dynamic--label,.ibo-datatable--toolbar,.object-ref-icon.text_decoration,.object-ref-icon-disabled.text_decoration,.ibo-criterion-area,.ibo-dashboard-editor--properties table td .ibo-field,.ibo-dashboard-editor--properties table th .ibo-field,.ibo-dashboard--available-dashlets table td .ibo-field,.ibo-dashboard--available-dashlets table th .ibo-field,.ibo-dashlet--properties table td .ibo-field,.ibo-dashlet--properties table th .ibo-field,.ibo-caselog-list .ibo-collapsible-section .ibo-collapsible-section--header .ibo-collapsible-section--title,.ibo-caselog-list .ibo-collapsible-section .ibo-collapsible-section--body{font-size:1rem}.ibo-font-size-150,.ibo-alert,.ibo-breadcrumbs--item-icon,.ibo-panel--subtitle,.ibo-panel--body,.ibo-dashlet-badge--action-create,.ibo-spinner.ibo-is-small>.ibo-spinner--description,.ibo-prop-header,.ibo-field,.sf_results_placeholder,.ibo-input-file-select--container .ibo-input-file-select .ibo-input-file-select--file-name,.ibo-tab-container--tabs-list,.ibo-dashboard-editor--properties-subtitle,.ibo-dashboard--available-dashlet--title,.ibo-dashlet--properties--title,.ibo-activity-entry--medallion,.ibo-alert--body .ibo-collapsible-section .ibo-collapsible-section--header .ibo-collapsible-section--title,.ibo-alert--body .ibo-collapsible-section .ibo-collapsible-section--body{font-size:1.17rem}.ibo-font-size-200,.dataTables_paginate a.paginate_button.previous,.dataTables_paginate .ibo-quick-create--compartment-results--element>.paginate_button.previous.option:hover,.dataTables_paginate a.paginate_button.next,.dataTables_paginate .ibo-quick-create--compartment-results--element>.paginate_button.next.option:hover{font-size:1.33rem}.ibo-font-size-250,.ibo-collapsible-section .ibo-collapsible-section--header .ibo-collapsible-section--title,.ibo-spinner.ibo-is-small>.ibo-spinner--icon,.ibo-spinner.ibo-is-medium>.ibo-spinner--description,.ibo-fieldset-legend,.ibo-dashboard-editor--properties-subtitle,.ibo-dashboard--available-dashlet--title,.ibo-dashlet--properties--title,legend,.ibo-top-bar--toolbar-dashboard-title,.ibo-tab-container--tab-container--label>span,.ibo-dashboard-editor--properties-title{font-size:1.5rem}.ibo-font-size-300,.ibo-title--for-object-details,.ibo-tab--temporary-remote-content--button{font-size:1.67rem}.ibo-font-size-350,.ibo-panel--title,.ibo-dashlet-header-static--body,.ibo-title-for-dashlet--title{font-size:1.83rem}.ibo-font-size-400,.ibo-spinner.ibo-is-large>.ibo-spinner--description{font-size:2rem}.ibo-font-size-450{font-size:2.5rem}.ibo-font-size-500,.ibo-spinner.ibo-is-medium>.ibo-spinner--icon{font-size:3rem}.ibo-font-size-550,.ibo-spinner.ibo-is-large>.ibo-spinner--icon{font-size:4rem}.ibo-font-weight-100{font-weight:100}.ibo-font-weight-200{font-weight:200}.ibo-font-weight-300{font-weight:300}.ibo-font-weight-400{font-weight:400}.ibo-font-weight-500{font-weight:500}.ibo-font-weight-600,.ibo-navigation-menu--notifications-show-all-multiple~.ibo-popover-menu .ibo-navigation-menu--notifications-show-all-multiple--counter,.ibo-navigation-menu--notifications-show-all-multiple~.ui-menu .ibo-navigation-menu--notifications-show-all-multiple--counter,.ibo-navigation-menu--notifications-show-all-multiple~.ui-multiselect-menu .ibo-navigation-menu--notifications-show-all-multiple--counter,.ibo-navigation-menu--notifications-show-all-multiple~.ibo-input-select-icon--menu .ibo-navigation-menu--notifications-show-all-multiple--counter,.graph_config .toolkit_menu.graph>ul>li .ibo-navigation-menu--notifications-show-all-multiple~ul .ibo-navigation-menu--notifications-show-all-multiple--counter,.ibo-dashlet-badge--body--tooltip-title,.ibo-field--label,.ibo-tab-container--extra-tab-toggler--tooltip-title{font-weight:600}.ibo-has-description::after,.ibo-font-weight-700,.ibo-alert .ibo-alert--title,.ibo-tab-container--tab-header.ui-tabs-active,.ui-tabs-active.ibo-tab-container--extra-tabs-container{font-weight:700}.ibo-font-weight-800{font-weight:800}.ibo-font-weight-900{font-weight:900}.ibo-font-weight-950{font-weight:950}.ibo-font-ral-nor-50,.ibo-navigation-menu--menu-filter-hotkey{font-size:0.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-100,.ui-datepicker .ui-datepicker-title select,.ui-multiselect-checkboxes label,.ibo-input-select--autocomplete-item-txt,.ibo-datatableconfig--attributes-panel .ibo-panel--body,.ibo-navigation-menu--user-info .ibo-navigation-menu--user-organization,.ibo-linked-set--bulk-tooltip-info,.dataModelSchema text,.tooltipD3{font-size:1rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-150,.ibo-input,.ui-autocomplete-input,.ui-multiselect,.dataTables_length select,.ui_tpicker_hour_slider>select,.ui_tpicker_minute_slider>select,.ui_tpicker_second_slider>select,select.ibo-input-select-placeholder,.ibo-datatableconfig--attributes-panel--per-page--input,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.ibo-input-select.ibo-input-selectize input,.ibo-input-selectize.ui-multiselect input,.ui_tpicker_hour_slider>select.ibo-input-selectize input,.ui_tpicker_minute_slider>select.ibo-input-selectize input,.ui_tpicker_second_slider>select.ibo-input-selectize input,select.ibo-input-selectize.ibo-input-select-placeholder input,.ibo-title--subtitle,.ibo-navigation-menu--menu-nodes ul li>a,.ibo-navigation-menu--menu-nodes ul .ibo-quick-create--compartment-results--elementli>.option:hover,.ibo-navigation-menu--menu-nodes ul .ibo-quick-create--compartment-results--element>li>.option:hover,.ibo-navigation-menu--menu-nodes ul li>span,.ibo-navigation-menu--user-info .ibo-navigation-menu--user-notifications,.ibo-datamodel-viewer--details .ibo-panel--subtitle,.ibo-global-search--result--title{font-size:1.17rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-200,.ibo-collapsible-section .ibo-collapsible-section--body,.ibo-navigation-menu--menu-group{font-size:1.33rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-250,.ui-dialog-title,.ibo-navigation-menu--user-info .ibo-navigation-menu--user-welcome-message,#ibo_setup_container .ibo-setup--body .setup-content-title,#ibo_setup_container .ibo-setup--body h2,.setup-end-placeholder a,.setup-end-placeholder .ibo-quick-create--compartment-results--element>.option:hover{font-size:1.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-300,.ibo-quick-create--input.selectize-control.single .selectize-input>input,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active>input,.ibo-quick-create--input.selectize-control.single .selectize-input>.item,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active>.item,.ibo-global-search--input,.ibo-global-search--input:hover,.ibo-global-search--input:focus,.ibo-global-search--input:active{font-size:1.67rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-350,.ibo-navigation-menu--menu-nodes-title{font-size:1.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-400,.ibo-quick-create--icon,.ibo-global-search--icon{font-size:2rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-450{font-size:2.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-500{font-size:3rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-550{font-size:4rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-50{font-size:0.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-100,.dataTable th,.dataTable td,.ibo-breadcrumbs--item,.ibo-breadcrumbs--previous-items-list-toggler,.ibo-breadcrumbs--previous-item,.ibo-datatable[data-status="loading"] td,body{font-size:1rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-150,.ui-multiselect-checkboxes li,.ibo-welcome-popup--stack-item-title,.ibo-welcome-popup--message-description{font-size:1.17rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-200{font-size:1.33rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-250,.ibo-dashlet-badge--action-list{font-size:1.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-300,.ibo-title--text{font-size:1.67rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-350{font-size:1.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-400{font-size:2rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-450{font-size:2.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-500{font-size:3rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-550{font-size:4rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-50,.ibo-navigation-menu--menu-filter-clear{font-size:0.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-100,.ui-multiselect-header ul,.ui-multiselect-checkboxes li.ui-multiselect-optgroup-label,.ibo-navigation-menu--menu-node-counter,#tooltipD3_top{font-size:1rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-150,.ibo-object-summary--content--attributes--code,.ibo-alert.ibo-is-primary a,.ibo-alert.ibo-is-primary .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-secondary a,.ui-dialog .ibo-alert.ui-button a,.ui-dialog .ibo-alert.ui-button .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ui-datepicker-current a,.ibo-alert.ui-datepicker-current .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ui-datepicker-close a,.ibo-alert.ui-datepicker-close .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-secondary .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-neutral a,.ui-dialog .ibo-alert.ui-button.ui-dialog-titlebar-close a,.ibo-alert.ibo-is-neutral .ibo-quick-create--compartment-results--element>.option:hover,.ui-dialog .ibo-alert.ui-button.ui-dialog-titlebar-close .ibo-quick-create--compartment-results--element>.option:hover,.ibo-toast.ibo-is-information a,.ibo-toast.ibo-is-information .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-information a,.ibo-alert.ibo-is-information .ibo-quick-create--compartment-results--element>.option:hover,.ibo-toast.ibo-is-success a,.ibo-toast.ibo-is-success .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-success a,.ibo-alert.ibo-is-success .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-failure a,.ibo-alert.ibo-is-failure .ibo-quick-create--compartment-results--element>.option:hover,.ibo-toast.ibo-is-warning a,.ibo-toast.ibo-is-warning .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-warning a,.ibo-alert.ibo-is-warning .ibo-quick-create--compartment-results--element>.option:hover,.ibo-toast.ibo-is-error a,.ibo-toast.ibo-is-error .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-danger a,.ibo-alert.ibo-is-danger .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-grey a,.ibo-alert.ibo-is-grey .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-blue-grey a,.ibo-alert.ibo-is-blue-grey .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-blue a,.ibo-alert.ibo-is-blue .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-cyan a,.ibo-alert.ibo-is-cyan .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-green a,.ibo-alert.ibo-is-green .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-orange a,.ibo-alert.ibo-is-orange .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-red a,.ibo-alert.ibo-is-red .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-pink a,.ibo-alert.ibo-is-pink .ibo-quick-create--compartment-results--element>.option:hover,.ibo-welcome-popup--message-title{font-size:1.17rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-200,.ibo-dashlet-header-dynamic--count{font-size:1.33rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-250,.ibo-dashboard--top-bar .ibo-dashboard--top-bar-title{font-size:1.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-300{font-size:1.67rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-350{font-size:1.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-400{font-size:2rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-450,.ibo-dashlet-badge--action-list-count{font-size:2.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-500{font-size:3rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-550{font-size:4rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-50{font-size:0.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-100,.dataTables_paginate a.paginate_button.current,.dataTables_paginate .ibo-quick-create--compartment-results--element>.paginate_button.current.option:hover,.dataTables_scrollHead thead tr th,.ibo-button,.ui-dialog .ui-button,.ui-datepicker-current,.ui-datepicker-close,.ibo-datatable[data-status="loading"] th{font-size:1rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-150{font-size:1.17rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-200{font-size:1.33rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-250{font-size:1.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-300{font-size:1.67rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-350{font-size:1.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-400{font-size:2rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-450{font-size:2.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-500{font-size:3rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-550{font-size:4rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-50,.ibo-navigation-menu--menu-filter-hint{font-size:0.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-100,.ibo-quick-create--compartment--placeholder-hint,.ibo-global-search--compartment--placeholder-hint,.ibo-navigation-menu--menu--placeholder-hint,.ibo-activity-panel--body--placeholder-hint{font-size:1rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-150{font-size:1.17rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-200{font-size:1.33rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-250{font-size:1.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-300{font-size:1.67rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-350{font-size:1.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-400{font-size:2rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-450{font-size:2.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-500{font-size:3rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-550{font-size:4rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-code-50{font-size:0.83rem;font-family:monospace;font-weight:400}.ibo-font-code-100{font-size:1rem;font-family:monospace;font-weight:400}.ibo-is-code,.ibo-font-code-150,.ibo-input-text.ibo-is-code,textarea.ibo-is-code{font-size:1.17rem;font-family:monospace;font-weight:400}.ibo-font-code-200{font-size:1.33rem;font-family:monospace;font-weight:400}.ibo-font-code-250{font-size:1.5rem;font-family:monospace;font-weight:400}.ibo-font-code-300{font-size:1.67rem;font-family:monospace;font-weight:400}.ibo-font-code-350{font-size:1.83rem;font-family:monospace;font-weight:400}.ibo-font-code-400{font-size:2rem;font-family:monospace;font-weight:400}.ibo-font-code-450{font-size:2.5rem;font-family:monospace;font-weight:400}.ibo-font-code-500{font-size:3rem;font-family:monospace;font-weight:400}.ibo-font-code-550{font-size:4rem;font-family:monospace;font-weight:400}.ibo-add-margin-top-250{margin-top:12px}.ibo-welcome-popup--stack-item-icon{position:relative;border-radius:var(--ibo-border-radius-full);border:2px solid var(--ibo-color-grey-300);overflow:hidden}.ibo-welcome-popup--stack-item-icon>*{position:absolute;top:0;left:0;width:100%;height:100%;background-position:center;background-size:contain;background-color:var(--ibo-color-grey-500)}.ibo-is-visible{display:inherit !important;visibility:visible !important}.ibo-is-hidden{display:none !important}.ibo-is-transparent{opacity:0 !important}.ibo-is-opaque{opacity:1 !important}.content:not(:last-child),.ibo-is-html-content:not(:last-child){margin-bottom:1.5rem}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}html{background-color:white;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:hidden;overflow-y:auto;text-rendering:optimizeLegibility;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,optgroup,select,textarea{font-family:"Raleway", "sans-serif", "system-ui"}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:monospace}body{color:#212934;font-size:1rem;font-weight:500;line-height:1.5}a,.ibo-quick-create--compartment-results--element>.option:hover{color:#485fc7;cursor:pointer;text-decoration:none}a strong,.ibo-quick-create--compartment-results--element>.option:hover strong{color:currentColor}a:hover,.ibo-quick-create--compartment-results--element>.option:hover{color:#363636}code{background-color:whitesmoke;color:#da1039;font-size:0.875em;font-weight:normal;padding:0.25em 0.5em 0.25em}hr{background-color:whitesmoke;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type="checkbox"],input[type="radio"]{vertical-align:baseline}small{font-size:0.875em}span{font-style:inherit;font-weight:inherit}strong{color:inherit;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:whitesmoke;color:#4a4a4a;font-size:0.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:inherit}table th{color:inherit}@keyframes spinAround{from{transform:rotate(0deg)}to{transform:rotate(359deg)}}.content li+li,.ibo-is-html-content li+li{margin-top:0.25em}.content p:not(:last-child),.ibo-is-html-content p:not(:last-child),.content dl:not(:last-child),.ibo-is-html-content dl:not(:last-child),.content ol:not(:last-child),.ibo-is-html-content ol:not(:last-child),.content ul:not(:last-child),.ibo-is-html-content ul:not(:last-child),.content blockquote:not(:last-child),.ibo-is-html-content blockquote:not(:last-child),.content pre:not(:last-child),.ibo-is-html-content pre:not(:last-child),.content table:not(:last-child),.ibo-is-html-content table:not(:last-child){margin-bottom:0}.content h1,.ibo-is-html-content h1,.content h2,.ibo-is-html-content h2,.content h3,.ibo-is-html-content h3,.content h4,.ibo-is-html-content h4,.content h5,.ibo-is-html-content h5,.content h6,.ibo-is-html-content h6{color:inherit;font-weight:600;line-height:1.125}.content h1,.ibo-is-html-content h1{font-size:2em;margin-bottom:0.5em}.content h1:not(:first-child),.ibo-is-html-content h1:not(:first-child){margin-top:1em}.content h2,.ibo-is-html-content h2{font-size:1.75em;margin-bottom:0.5714em}.content h2:not(:first-child),.ibo-is-html-content h2:not(:first-child){margin-top:1.1428em}.content h3,.ibo-is-html-content h3{font-size:1.5em;margin-bottom:0.6666em}.content h3:not(:first-child),.ibo-is-html-content h3:not(:first-child){margin-top:1.3333em}.content h4,.ibo-is-html-content h4{font-size:1.25em;margin-bottom:0.8em}.content h5,.ibo-is-html-content h5{font-size:1.125em;margin-bottom:0.8888em}.content h6,.ibo-is-html-content h6{font-size:1em;margin-bottom:1em}.content blockquote,.ibo-is-html-content blockquote{background-color:#e1e7ec;border-left:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol,.ibo-is-html-content ol{list-style-position:outside;margin-left:2em;margin-top:1em}.content ol:not([type]),.ibo-is-html-content ol:not([type]){list-style-type:decimal}.content ol:not([type]).is-lower-alpha,.ibo-is-html-content ol:not([type]).is-lower-alpha{list-style-type:lower-alpha}.content ol:not([type]).is-lower-roman,.ibo-is-html-content ol:not([type]).is-lower-roman{list-style-type:lower-roman}.content ol:not([type]).is-upper-alpha,.ibo-is-html-content ol:not([type]).is-upper-alpha{list-style-type:upper-alpha}.content ol:not([type]).is-upper-roman,.ibo-is-html-content ol:not([type]).is-upper-roman{list-style-type:upper-roman}.content ul,.ibo-is-html-content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul,.ibo-is-html-content ul ul{list-style-type:circle;margin-top:0.5em}.content ul ul ul,.ibo-is-html-content ul ul ul{list-style-type:square}.content dd,.ibo-is-html-content dd{margin-left:2em}.content figure,.ibo-is-html-content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child),.ibo-is-html-content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child),.ibo-is-html-content figure:not(:last-child){margin-bottom:2em}.content figure img,.ibo-is-html-content figure img{display:inline-block}.content figure figcaption,.ibo-is-html-content figure figcaption{font-style:italic}.content pre,.ibo-is-html-content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:1.25em 1.5em;white-space:pre;word-wrap:normal}.content sup,.ibo-is-html-content sup,.content sub,.ibo-is-html-content sub{font-size:75%}.content table,.ibo-is-html-content table{width:100%}.content table td,.ibo-is-html-content table td,.content table th,.ibo-is-html-content table th{border:"invalid on purpose";border-width:"invalid on purpose";padding:"invalid on purpose";vertical-align:top}.content table th,.ibo-is-html-content table th{color:"invalid on purpose"}.content table th:not([align]),.ibo-is-html-content table th:not([align]){text-align:inherit}.content table thead td,.ibo-is-html-content table thead td,.content table thead th,.ibo-is-html-content table thead th{border-width:"invalid on purpose";color:"invalid on purpose"}.content table tfoot td,.ibo-is-html-content table tfoot td,.content table tfoot th,.ibo-is-html-content table tfoot th{border-width:"invalid on purpose";color:"invalid on purpose"}.content table tbody tr:last-child td,.ibo-is-html-content table tbody tr:last-child td,.content table tbody tr:last-child th,.ibo-is-html-content table tbody tr:last-child th{border-bottom-width:1px}.content .tabs li+li,.ibo-is-html-content .tabs li+li{margin-top:0}.content.is-small,.is-small.ibo-is-html-content{font-size:0.75rem}.content.is-normal,.is-normal.ibo-is-html-content{font-size:1rem}.content.is-medium,.is-medium.ibo-is-html-content{font-size:1.25rem}.content.is-large,.is-large.ibo-is-html-content{font-size:1.5rem}.common-hljs-container{padding:0 !important;border:none !important}pre code.hljs{display:block;overflow-x:auto;padding:0.9rem !important}code.hljs{padding:4px 4px !important}.hljs{box-shadow:0 0px 3px 2px inset rgba(0, 0, 0, 0.4) !important;border-radius:3px !important;white-space:pre-wrap;border:none !important;color:#e0e2e4 !important;background:#282b2e !important}.hljs-keyword,.hljs-selector-tag,.hljs-literal,.hljs-selector-id{color:#93c763 !important}.hljs-number{color:#ffcd22 !important}.hljs-attribute{color:#668bb0}.hljs-regexp,.hljs-link{color:#d39745 !important}.hljs-meta{color:#557182 !important}.hljs-tag,.hljs-name,.hljs-bullet,.hljs-subst,.hljs-emphasis,.hljs-type,.hljs-built_in,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-addition,.hljs-variable,.hljs-template-tag,.hljs-template-variable{color:#8cbbad !important}.hljs-string,.hljs-symbol{color:#ec7600 !important}.hljs-comment,.hljs-quote,.hljs-deletion{color:#818e96 !important}.hljs-selector-class{color:#A082BD !important}.hljs-keyword,.hljs-selector-tag,.hljs-literal,.hljs-doctag,.hljs-title,.hljs-section,.hljs-type,.hljs-name,.hljs-strong{font-weight:bold}.hljs-code,.hljs-title.class_,.hljs-class .hljs-title,.hljs-section{color:white !important}/*! * @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md. */.ck-hidden{display:none !important}:root{--ck-z-default:1;--ck-z-panel:calc(var(--ck-z-default) + 999);--ck-z-dialog:9999}.ck-transitions-disabled,.ck-transitions-disabled *{transition:none!important}:root{--ck-powered-by-line-height:10px;--ck-powered-by-padding-vertical:2px;--ck-powered-by-padding-horizontal:4px;--ck-powered-by-text-color:#4f4f4f;--ck-powered-by-border-radius:var(--ck-border-radius);--ck-powered-by-background:#fff;--ck-powered-by-border-color:var(--ck-color-focus-border)}.ck.ck-balloon-panel.ck-powered-by-balloon{--ck-border-radius:var(--ck-powered-by-border-radius);background:var(--ck-powered-by-background);box-shadow:none;min-height:unset;z-index:calc(var(--ck-z-panel) - 1)}.ck.ck-balloon-panel.ck-powered-by-balloon .ck.ck-powered-by{line-height:var(--ck-powered-by-line-height)}.ck.ck-balloon-panel.ck-powered-by-balloon .ck.ck-powered-by a,.ck.ck-balloon-panel.ck-powered-by-balloon .ck.ck-powered-by .ibo-quick-create--compartment-results--element>.option:hover{align-items:center;cursor:pointer;display:flex;filter:grayscale(80%);line-height:var(--ck-powered-by-line-height);opacity:0.66;padding:var(--ck-powered-by-padding-vertical) var(--ck-powered-by-padding-horizontal)}.ck.ck-balloon-panel.ck-powered-by-balloon .ck.ck-powered-by .ck-powered-by__label{color:var(--ck-powered-by-text-color);cursor:pointer;font-size:7.5px;font-weight:700;letter-spacing:-0.2px;line-height:normal;margin-right:4px;padding-left:2px;text-transform:uppercase}.ck.ck-balloon-panel.ck-powered-by-balloon .ck.ck-powered-by .ck-icon{cursor:pointer;display:block}.ck.ck-balloon-panel.ck-powered-by-balloon .ck.ck-powered-by:hover a,.ck.ck-balloon-panel.ck-powered-by-balloon .ck.ck-powered-by:hover .ibo-quick-create--compartment-results--element>.option:hover{filter:grayscale(0);opacity:1}.ck.ck-balloon-panel.ck-powered-by-balloon[class*=position_inside]{border-color:transparent}.ck.ck-balloon-panel.ck-powered-by-balloon[class*=position_border]{border:var(--ck-focus-ring);border-color:var(--ck-powered-by-border-color)}:root{--ck-color-base-foreground:#fafafa;--ck-color-base-background:#fff;--ck-color-base-border:#ccced1;--ck-color-base-action:#53a336;--ck-color-base-focus:#6cb5f9;--ck-color-base-text:#333;--ck-color-base-active:#2977ff;--ck-color-base-active-focus:#0d65ff;--ck-color-base-error:#db3700;--ck-color-focus-border-coordinates:218,81.8%,56.9%;--ck-color-focus-border:hsl(var(--ck-color-focus-border-coordinates));--ck-color-focus-outer-shadow:#cae1fc;--ck-color-focus-disabled-shadow:rgba(119,186,248,.3);--ck-color-focus-error-shadow:rgba(255,64,31,.3);--ck-color-text:var(--ck-color-base-text);--ck-color-shadow-drop:rgba(0,0,0,.15);--ck-color-shadow-drop-active:rgba(0,0,0,.2);--ck-color-shadow-inner:rgba(0,0,0,.1);--ck-color-button-default-background:transparent;--ck-color-button-default-hover-background:#f0f0f0;--ck-color-button-default-active-background:#f0f0f0;--ck-color-button-default-disabled-background:transparent;--ck-color-button-on-background:#f0f7ff;--ck-color-button-on-hover-background:#dbecff;--ck-color-button-on-active-background:#dbecff;--ck-color-button-on-disabled-background:#f0f2f4;--ck-color-button-on-color:#2977ff;--ck-color-button-action-background:var(--ck-color-base-action);--ck-color-button-action-hover-background:#4d9d30;--ck-color-button-action-active-background:#4d9d30;--ck-color-button-action-disabled-background:#7ec365;--ck-color-button-action-text:var(--ck-color-base-background);--ck-color-button-save:#008a00;--ck-color-button-cancel:#db3700;--ck-color-switch-button-off-background:#939393;--ck-color-switch-button-off-hover-background:#7d7d7d;--ck-color-switch-button-on-background:var(--ck-color-button-action-background);--ck-color-switch-button-on-hover-background:#4d9d30;--ck-color-switch-button-inner-background:var(--ck-color-base-background);--ck-color-switch-button-inner-shadow:rgba(0,0,0,.1);--ck-color-dropdown-panel-background:var(--ck-color-base-background);--ck-color-dropdown-panel-border:var(--ck-color-base-border);--ck-color-dialog-background:var(--ck-custom-background);--ck-color-dialog-form-header-border:var(--ck-custom-border);--ck-color-input-background:var(--ck-color-base-background);--ck-color-input-border:var(--ck-color-base-border);--ck-color-input-error-border:var(--ck-color-base-error);--ck-color-input-text:var(--ck-color-base-text);--ck-color-input-disabled-background:#f2f2f2;--ck-color-input-disabled-border:var(--ck-color-base-border);--ck-color-input-disabled-text:#757575;--ck-color-list-background:var(--ck-color-base-background);--ck-color-list-button-hover-background:var(--ck-color-button-default-hover-background);--ck-color-list-button-on-background:var(--ck-color-button-on-color);--ck-color-list-button-on-background-focus:var(--ck-color-button-on-color);--ck-color-list-button-on-text:var(--ck-color-base-background);--ck-color-panel-background:var(--ck-color-base-background);--ck-color-panel-border:var(--ck-color-base-border);--ck-color-toolbar-background:var(--ck-color-base-background);--ck-color-toolbar-border:var(--ck-color-base-border);--ck-color-tooltip-background:var(--ck-color-base-text);--ck-color-tooltip-text:var(--ck-color-base-background);--ck-color-engine-placeholder-text:#707070;--ck-color-upload-bar-background:#6cb5f9;--ck-color-link-default:#0000f0;--ck-color-link-selected-background:rgba(31,176,255,.1);--ck-color-link-fake-selection:rgba(31,176,255,.3);--ck-color-highlight-background:#ff0;--ck-color-light-red:#fcc;--ck-disabled-opacity:.5;--ck-focus-outer-shadow-geometry:0 0 0 3px;--ck-focus-outer-shadow:var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-outer-shadow);--ck-focus-disabled-outer-shadow:var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-disabled-shadow);--ck-focus-error-outer-shadow:var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-error-shadow);--ck-focus-ring:1px solid var(--ck-color-focus-border);--ck-font-size-base:13px;--ck-line-height-base:1.84615;--ck-font-face:Helvetica,Arial,Tahoma,Verdana,Sans-Serif;--ck-font-size-tiny:0.7em;--ck-font-size-small:0.75em;--ck-font-size-normal:1em;--ck-font-size-big:1.4em;--ck-font-size-large:1.8em;--ck-ui-component-min-height:2.3em}.ck-reset_all :not(.ck-reset_all-excluded *),.ck.ck-reset,.ck.ck-reset_all{word-wrap:break-word;background:transparent;border:0;box-sizing:border-box;height:auto;margin:0;padding:0;position:static;text-decoration:none;transition:none;vertical-align:middle;width:auto}.ck-reset_all :not(.ck-reset_all-excluded *),.ck.ck-reset_all{border-collapse:collapse;color:var(--ck-color-text);cursor:auto;float:none;font:normal normal normal var(--ck-font-size-base)/var(--ck-line-height-base) var(--ck-font-face);text-align:left;white-space:nowrap}.ck-reset_all .ck-rtl :not(.ck-reset_all-excluded *){text-align:right}.ck-reset_all iframe:not(.ck-reset_all-excluded *){vertical-align:inherit}.ck-reset_all textarea:not(.ck-reset_all-excluded *){white-space:pre-wrap}.ck-reset_all input[type=password]:not(.ck-reset_all-excluded *),.ck-reset_all input[type=text]:not(.ck-reset_all-excluded *),.ck-reset_all textarea:not(.ck-reset_all-excluded *){cursor:text}.ck-reset_all input[type=password][disabled]:not(.ck-reset_all-excluded *),.ck-reset_all input[type=text][disabled]:not(.ck-reset_all-excluded *),.ck-reset_all textarea[disabled]:not(.ck-reset_all-excluded *){cursor:default}.ck-reset_all fieldset:not(.ck-reset_all-excluded *){border:2px groove #dfdee3;padding:10px}.ck-reset_all button:not(.ck-reset_all-excluded *)::-moz-focus-inner{border:0;padding:0}.ck[dir=rtl],.ck[dir=rtl] .ck{text-align:right}:root{--ck-border-radius:2px;--ck-inner-shadow:2px 2px 3px var(--ck-color-shadow-inner) inset;--ck-drop-shadow:0 1px 2px 1px var(--ck-color-shadow-drop);--ck-drop-shadow-active:0 3px 6px 1px var(--ck-color-shadow-drop-active);--ck-spacing-unit:0.6em;--ck-spacing-large:calc(var(--ck-spacing-unit)*1.5);--ck-spacing-standard:var(--ck-spacing-unit);--ck-spacing-medium:calc(var(--ck-spacing-unit)*0.8);--ck-spacing-small:calc(var(--ck-spacing-unit)*0.5);--ck-spacing-tiny:calc(var(--ck-spacing-unit)*0.3);--ck-spacing-extra-tiny:calc(var(--ck-spacing-unit)*0.16)} @@ -23,4 +23,4 @@ :root{--ck-toolbar-dropdown-max-width:60vw}.ck.ck-toolbar-dropdown>.ck-dropdown__panel{max-width:var(--ck-toolbar-dropdown-max-width);width:max-content}.ck.ck-toolbar-dropdown>.ck-dropdown__panel .ck-button:focus{z-index:calc(var(--ck-z-default) + 1)}.ck.ck-toolbar-dropdown .ck-toolbar{border:0}.ck.ck-dropdown>.ck-dropdown__panel>.ck-list{border-radius:0}.ck-rounded-corners .ck.ck-dropdown>.ck-dropdown__panel>.ck-list,.ck.ck-dropdown>.ck-dropdown__panel>.ck-list.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0}.ck.ck-dropdown>.ck-dropdown__panel>.ck-list .ck-list__item:first-child>.ck-button{border-radius:0}.ck-rounded-corners .ck.ck-dropdown>.ck-dropdown__panel>.ck-list .ck-list__item:first-child>.ck-button,.ck.ck-dropdown>.ck-dropdown__panel>.ck-list .ck-list__item:first-child>.ck-button.ck-rounded-corners{border-radius:var(--ck-border-radius);border-bottom-left-radius:0;border-bottom-right-radius:0;border-top-left-radius:0}.ck.ck-dropdown>.ck-dropdown__panel>.ck-list .ck-list__item:last-child>.ck-button{border-radius:0}.ck-rounded-corners .ck.ck-dropdown>.ck-dropdown__panel>.ck-list .ck-list__item:last-child>.ck-button,.ck.ck-dropdown>.ck-dropdown__panel>.ck-list .ck-list__item:last-child>.ck-button.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0;border-top-right-radius:0}.color-picker-hex-input{width:max-content}.color-picker-hex-input .ck.ck-input{min-width:unset}.ck.ck-color-picker__row{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-between;margin:var(--ck-spacing-large) 0 0;width:unset}.ck.ck-color-picker__row .ck.ck-labeled-field-view{padding-top:unset}.ck.ck-color-picker__row .ck.ck-input-text{width:unset}.ck.ck-color-picker__row .ck-color-picker__hash-view{padding-right:var(--ck-spacing-medium);padding-top:var(--ck-spacing-tiny)}.ck.ck-color-selector .ck-color-grids-fragment .ck-button.ck-color-selector__color-picker,.ck.ck-color-selector .ck-color-grids-fragment .ck-button.ck-color-selector__remove-color{align-items:center;display:flex}[dir=rtl] .ck.ck-color-selector .ck-color-grids-fragment .ck-button.ck-color-selector__color-picker,[dir=rtl] .ck.ck-color-selector .ck-color-grids-fragment .ck-button.ck-color-selector__remove-color{justify-content:flex-start}.ck.ck-color-selector .ck-color-picker-fragment .ck.ck-color-selector_action-bar{display:flex;flex-direction:row;justify-content:space-around}.ck.ck-color-selector .ck-color-picker-fragment .ck.ck-color-selector_action-bar .ck-button-cancel,.ck.ck-color-selector .ck-color-picker-fragment .ck.ck-color-selector_action-bar .ck-button-save{flex:1}.ck.ck-color-selector .ck-color-grids-fragment .ck-button.ck-color-selector__color-picker,.ck.ck-color-selector .ck-color-grids-fragment .ck-button.ck-color-selector__remove-color{width:100%}.ck.ck-color-selector .ck-color-grids-fragment .ck-button.ck-color-selector__color-picker{border-bottom-left-radius:0;border-bottom-right-radius:0;padding:calc(var(--ck-spacing-standard)/2) var(--ck-spacing-standard)}.ck.ck-color-selector .ck-color-grids-fragment .ck-button.ck-color-selector__color-picker:not(:focus){border-top:1px solid var(--ck-color-base-border)}[dir=ltr] .ck.ck-color-selector .ck-color-grids-fragment .ck-button.ck-color-selector__color-picker .ck.ck-icon{margin-right:var(--ck-spacing-standard)}[dir=rtl] .ck.ck-color-selector .ck-color-grids-fragment .ck-button.ck-color-selector__color-picker .ck.ck-icon{margin-left:var(--ck-spacing-standard)}.ck.ck-color-selector .ck-color-grids-fragment label.ck.ck-color-grid__label{font-weight:unset}.ck.ck-color-selector .ck-color-picker-fragment .ck.ck-color-picker{padding:8px}.ck.ck-color-selector .ck-color-picker-fragment .ck.ck-color-picker .hex-color-picker{height:100px;min-width:180px}.ck.ck-color-selector .ck-color-picker-fragment .ck.ck-color-picker .hex-color-picker::part(saturation){border-radius:var(--ck-border-radius) var(--ck-border-radius) 0 0}.ck.ck-color-selector .ck-color-picker-fragment .ck.ck-color-picker .hex-color-picker::part(hue){border-radius:0 0 var(--ck-border-radius) var(--ck-border-radius)}.ck.ck-color-selector .ck-color-picker-fragment .ck.ck-color-picker .hex-color-picker::part(hue-pointer),.ck.ck-color-selector .ck-color-picker-fragment .ck.ck-color-picker .hex-color-picker::part(saturation-pointer){height:15px;width:15px}.ck.ck-color-selector .ck-color-picker-fragment .ck.ck-color-selector_action-bar{padding:0 8px 8px}.ck.ck-form__header{align-items:center;display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-between}.ck.ck-form__header h2.ck-form__header__label{flex-grow:1}:root{--ck-form-header-height:44px}.ck.ck-form__header{border-bottom:1px solid var(--ck-color-base-border);height:var(--ck-form-header-height);line-height:var(--ck-form-header-height);padding:var(--ck-spacing-small) var(--ck-spacing-large)}[dir=ltr] .ck.ck-form__header>.ck-icon{margin-right:var(--ck-spacing-medium)}[dir=rtl] .ck.ck-form__header>.ck-icon{margin-left:var(--ck-spacing-medium)}.ck.ck-form__header .ck-form__header__label{--ck-font-size-base:15px;font-weight:700}.ck.ck-dialog .ck.ck-dialog__actions{display:flex;justify-content:flex-end;padding:var(--ck-spacing-large)}.ck.ck-dialog .ck.ck-dialog__actions>*+*{margin-left:var(--ck-spacing-large)}.ck.ck-dialog-overlay{bottom:0;left:0;overscroll-behavior:none;position:fixed;right:0;top:0;user-select:none}.ck.ck-dialog-overlay.ck-dialog-overlay__transparent{animation:none;background:none;pointer-events:none}.ck.ck-dialog{overscroll-behavior:none;position:absolute;width:fit-content}.ck.ck-dialog .ck.ck-form__header{flex-shrink:0}.ck.ck-dialog .ck.ck-form__header .ck-form__header__label{cursor:grab}.ck.ck-dialog-overlay.ck-dialog-overlay__transparent .ck.ck-dialog{pointer-events:all}:root{--ck-dialog-overlay-background-color:rgba(0,0,0,.5);--ck-dialog-drop-shadow:0px 0px 6px 2px rgba(0,0,0,.15);--ck-dialog-max-width:100vw;--ck-dialog-max-height:90vh;--ck-color-dialog-background:var(--ck-color-base-background);--ck-color-dialog-form-header-border:var(--ck-color-base-border)}.ck.ck-dialog-overlay{animation:ck-dialog-fade-in .3s;background:var(--ck-dialog-overlay-background-color);z-index:var(--ck-z-dialog)}.ck.ck-dialog{border-radius:0}.ck-rounded-corners .ck.ck-dialog,.ck.ck-dialog.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-dialog{--ck-drop-shadow:var(--ck-dialog-drop-shadow);background:var(--ck-color-dialog-background);border:1px solid var(--ck-color-base-border);box-shadow:var(--ck-drop-shadow), 0 0;max-height:var(--ck-dialog-max-height);max-width:var(--ck-dialog-max-width)}.ck.ck-dialog .ck.ck-form__header{border-bottom:1px solid var(--ck-color-dialog-form-header-border)}@keyframes ck-dialog-fade-in{0%{background:transparent}to{background:var(--ck-dialog-overlay-background-color)}}:root{--ck-balloon-panel-arrow-z-index:calc(var(--ck-z-default) - 3)}.ck.ck-balloon-panel{display:none;position:absolute;z-index:var(--ck-z-panel)}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:after,.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:before{content:"";position:absolute}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:before{z-index:var(--ck-balloon-panel-arrow-z-index)}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:after{z-index:calc(var(--ck-balloon-panel-arrow-z-index) + 1)}.ck.ck-balloon-panel[class*=arrow_n]:before{z-index:var(--ck-balloon-panel-arrow-z-index)}.ck.ck-balloon-panel[class*=arrow_n]:after{z-index:calc(var(--ck-balloon-panel-arrow-z-index) + 1)}.ck.ck-balloon-panel[class*=arrow_s]:before{z-index:var(--ck-balloon-panel-arrow-z-index)}.ck.ck-balloon-panel[class*=arrow_s]:after{z-index:calc(var(--ck-balloon-panel-arrow-z-index) + 1)}.ck.ck-balloon-panel.ck-balloon-panel_visible{display:block}:root{--ck-balloon-border-width:1px;--ck-balloon-arrow-offset:2px;--ck-balloon-arrow-height:10px;--ck-balloon-arrow-half-width:8px;--ck-balloon-arrow-drop-shadow:0 2px 2px var(--ck-color-shadow-drop)}.ck.ck-balloon-panel{border-radius:0}.ck-rounded-corners .ck.ck-balloon-panel,.ck.ck-balloon-panel.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-balloon-panel{background:var(--ck-color-panel-background);border:var(--ck-balloon-border-width) solid var(--ck-color-panel-border);box-shadow:var(--ck-drop-shadow), 0 0;min-height:15px}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:after,.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:before{border-style:solid;height:0;width:0}.ck.ck-balloon-panel[class*=arrow_n]:after,.ck.ck-balloon-panel[class*=arrow_n]:before{border-width:0 var(--ck-balloon-arrow-half-width) var(--ck-balloon-arrow-height) var(--ck-balloon-arrow-half-width)}.ck.ck-balloon-panel[class*=arrow_n]:before{border-color:transparent transparent var(--ck-color-panel-border) transparent;margin-top:calc(var(--ck-balloon-border-width)*-1)}.ck.ck-balloon-panel[class*=arrow_n]:after{border-color:transparent transparent var(--ck-color-panel-background) transparent;margin-top:calc(var(--ck-balloon-arrow-offset) - var(--ck-balloon-border-width))}.ck.ck-balloon-panel[class*=arrow_s]:after,.ck.ck-balloon-panel[class*=arrow_s]:before{border-width:var(--ck-balloon-arrow-height) var(--ck-balloon-arrow-half-width) 0 var(--ck-balloon-arrow-half-width)}.ck.ck-balloon-panel[class*=arrow_s]:before{border-color:var(--ck-color-panel-border) transparent transparent;filter:drop-shadow(var(--ck-balloon-arrow-drop-shadow));margin-bottom:calc(var(--ck-balloon-border-width)*-1)}.ck.ck-balloon-panel[class*=arrow_s]:after{border-color:var(--ck-color-panel-background) transparent transparent transparent;margin-bottom:calc(var(--ck-balloon-arrow-offset) - var(--ck-balloon-border-width))}.ck.ck-balloon-panel[class*=arrow_e]:after,.ck.ck-balloon-panel[class*=arrow_e]:before{border-width:var(--ck-balloon-arrow-half-width) 0 var(--ck-balloon-arrow-half-width) var(--ck-balloon-arrow-height)}.ck.ck-balloon-panel[class*=arrow_e]:before{border-color:transparent transparent transparent var(--ck-color-panel-border);margin-right:calc(var(--ck-balloon-border-width)*-1)}.ck.ck-balloon-panel[class*=arrow_e]:after{border-color:transparent transparent transparent var(--ck-color-panel-background);margin-right:calc(var(--ck-balloon-arrow-offset) - var(--ck-balloon-border-width))}.ck.ck-balloon-panel[class*=arrow_w]:after,.ck.ck-balloon-panel[class*=arrow_w]:before{border-width:var(--ck-balloon-arrow-half-width) var(--ck-balloon-arrow-height) var(--ck-balloon-arrow-half-width) 0}.ck.ck-balloon-panel[class*=arrow_w]:before{border-color:transparent var(--ck-color-panel-border) transparent transparent;margin-left:calc(var(--ck-balloon-border-width)*-1)}.ck.ck-balloon-panel[class*=arrow_w]:after{border-color:transparent var(--ck-color-panel-background) transparent transparent;margin-left:calc(var(--ck-balloon-arrow-offset) - var(--ck-balloon-border-width))}.ck.ck-balloon-panel.ck-balloon-panel_arrow_n:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_n:before{left:50%;margin-left:calc(var(--ck-balloon-arrow-half-width)*-1);top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_nw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_nw:before{left:calc(var(--ck-balloon-arrow-half-width)*2);top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_ne:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_ne:before{right:calc(var(--ck-balloon-arrow-half-width)*2);top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_s:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_s:before{bottom:calc(var(--ck-balloon-arrow-height)*-1);left:50%;margin-left:calc(var(--ck-balloon-arrow-half-width)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_sw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_sw:before{bottom:calc(var(--ck-balloon-arrow-height)*-1);left:calc(var(--ck-balloon-arrow-half-width)*2)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_se:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_se:before{bottom:calc(var(--ck-balloon-arrow-height)*-1);right:calc(var(--ck-balloon-arrow-half-width)*2)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_sme:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_sme:before{bottom:calc(var(--ck-balloon-arrow-height)*-1);margin-right:calc(var(--ck-balloon-arrow-half-width)*2);right:25%}.ck.ck-balloon-panel.ck-balloon-panel_arrow_smw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_smw:before{bottom:calc(var(--ck-balloon-arrow-height)*-1);left:25%;margin-left:calc(var(--ck-balloon-arrow-half-width)*2)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_nme:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_nme:before{margin-right:calc(var(--ck-balloon-arrow-half-width)*2);right:25%;top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_nmw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_nmw:before{left:25%;margin-left:calc(var(--ck-balloon-arrow-half-width)*2);top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_e:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_e:before{margin-top:calc(var(--ck-balloon-arrow-half-width)*-1);right:calc(var(--ck-balloon-arrow-height)*-1);top:50%}.ck.ck-balloon-panel.ck-balloon-panel_arrow_w:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_w:before{left:calc(var(--ck-balloon-arrow-height)*-1);margin-top:calc(var(--ck-balloon-arrow-half-width)*-1);top:50%}.ck.ck-balloon-panel.ck-tooltip{--ck-balloon-border-width:0px;--ck-balloon-arrow-offset:0px;--ck-balloon-arrow-half-width:4px;--ck-balloon-arrow-height:4px;--ck-tooltip-text-padding:4px;--ck-color-panel-background:var(--ck-color-tooltip-background);padding:0 var(--ck-spacing-medium);-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;z-index:calc(var(--ck-z-dialog) + 100)}.ck.ck-balloon-panel.ck-tooltip .ck-tooltip__text{color:var(--ck-color-tooltip-text);font-size:0.9em;line-height:1.5}.ck.ck-balloon-panel.ck-tooltip.ck-tooltip_multi-line .ck-tooltip__text{display:inline-block;max-width:200px;padding:var(--ck-tooltip-text-padding) 0;white-space:break-spaces}.ck.ck-balloon-panel.ck-tooltip{box-shadow:none}.ck.ck-balloon-panel.ck-tooltip:before{display:none}.ck.ck-aria-live-announcer{left:-10000px;position:absolute;top:-10000px}.ck.ck-aria-live-region-list{list-style-type:none}:root{--ck-color-editable-blur-selection:#d9d9d9}.ck.ck-editor__editable:not(.ck-editor__nested-editable){border-radius:0}.ck-rounded-corners .ck.ck-editor__editable:not(.ck-editor__nested-editable),.ck.ck-editor__editable.ck-rounded-corners:not(.ck-editor__nested-editable){border-radius:var(--ck-border-radius)}.ck.ck-editor__editable.ck-focused:not(.ck-editor__nested-editable){border:var(--ck-focus-ring);box-shadow:var(--ck-inner-shadow), 0 0;outline:none}.ck.ck-editor__editable_inline{border:1px solid transparent;overflow:auto;padding:0 var(--ck-spacing-standard)}.ck.ck-editor__editable_inline[dir=ltr]{text-align:left}.ck.ck-editor__editable_inline[dir=rtl]{text-align:right}.ck.ck-editor__editable_inline>:first-child{margin-top:var(--ck-spacing-large)}.ck.ck-editor__editable_inline>:last-child{margin-bottom:var(--ck-spacing-large)}.ck.ck-editor__editable_inline.ck-blurred ::selection{background:var(--ck-color-editable-blur-selection)}.ck.ck-balloon-panel.ck-toolbar-container[class*=arrow_n]:after{border-bottom-color:var(--ck-color-panel-background)}.ck.ck-balloon-panel.ck-toolbar-container[class*=arrow_s]:after{border-top-color:var(--ck-color-panel-background)}.ck .ck-balloon-rotator__navigation{align-items:center;display:flex;justify-content:center}.ck .ck-balloon-rotator__content .ck-toolbar{justify-content:center}.ck .ck-balloon-rotator__navigation{background:var(--ck-color-toolbar-background);border-bottom:1px solid var(--ck-color-toolbar-border);padding:0 var(--ck-spacing-small)}.ck .ck-balloon-rotator__navigation>*{margin-bottom:var(--ck-spacing-small);margin-right:var(--ck-spacing-small);margin-top:var(--ck-spacing-small)}.ck .ck-balloon-rotator__navigation .ck-balloon-rotator__counter{margin-left:var(--ck-spacing-small);margin-right:var(--ck-spacing-standard)}.ck .ck-balloon-rotator__content .ck.ck-annotation-wrapper{box-shadow:none}.ck .ck-fake-panel{position:absolute;z-index:calc(var(--ck-z-panel) - 1)}.ck .ck-fake-panel div{position:absolute}.ck .ck-fake-panel div:first-child{z-index:2}.ck .ck-fake-panel div:nth-child(2){z-index:1}:root{--ck-balloon-fake-panel-offset-horizontal:6px;--ck-balloon-fake-panel-offset-vertical:6px}.ck .ck-fake-panel div{background:var(--ck-color-panel-background);border:1px solid var(--ck-color-panel-border);border-radius:var(--ck-border-radius);box-shadow:var(--ck-drop-shadow), 0 0;height:100%;min-height:15px;width:100%}.ck .ck-fake-panel div:first-child{margin-left:var(--ck-balloon-fake-panel-offset-horizontal);margin-top:var(--ck-balloon-fake-panel-offset-vertical)}.ck .ck-fake-panel div:nth-child(2){margin-left:calc(var(--ck-balloon-fake-panel-offset-horizontal)*2);margin-top:calc(var(--ck-balloon-fake-panel-offset-vertical)*2)}.ck .ck-fake-panel div:nth-child(3){margin-left:calc(var(--ck-balloon-fake-panel-offset-horizontal)*3);margin-top:calc(var(--ck-balloon-fake-panel-offset-vertical)*3)}.ck .ck-balloon-panel_arrow_s+.ck-fake-panel,.ck .ck-balloon-panel_arrow_se+.ck-fake-panel,.ck .ck-balloon-panel_arrow_sw+.ck-fake-panel{--ck-balloon-fake-panel-offset-vertical:-6px} .ck.ck-sticky-panel .ck-sticky-panel__content_sticky{position:fixed;top:0;z-index:var(--ck-z-panel)}.ck.ck-sticky-panel .ck-sticky-panel__content_sticky_bottom-limit{position:absolute;top:auto}.ck.ck-sticky-panel .ck-sticky-panel__content_sticky{border-top-left-radius:0;border-top-right-radius:0;border-width:0 1px 1px;box-shadow:var(--ck-drop-shadow), 0 0}.ck.ck-search>.ck-labeled-field-view>.ck-labeled-field-view__input-wrapper>.ck-icon{position:absolute;top:50%;transform:translateY(-50%)}[dir=ltr] .ck.ck-search>.ck-labeled-field-view>.ck-labeled-field-view__input-wrapper>.ck-icon{left:var(--ck-spacing-medium)}[dir=rtl] .ck.ck-search>.ck-labeled-field-view>.ck-labeled-field-view__input-wrapper>.ck-icon{right:var(--ck-spacing-medium)}.ck.ck-search>.ck-labeled-field-view .ck-search__reset{position:absolute;top:50%;transform:translateY(-50%)}.ck.ck-search>.ck-search__results>.ck-search__info>span:first-child{display:block}.ck.ck-search>.ck-search__results>.ck-search__info:not(.ck-hidden)~*{display:none}:root{--ck-search-field-view-horizontal-spacing:calc(var(--ck-icon-size) + var(--ck-spacing-medium))}.ck.ck-search>.ck-labeled-field-view .ck-input{width:100%}.ck.ck-search>.ck-labeled-field-view.ck-search__query_with-icon{--ck-labeled-field-label-default-position-x:var(--ck-search-field-view-horizontal-spacing)}.ck.ck-search>.ck-labeled-field-view.ck-search__query_with-icon>.ck-labeled-field-view__input-wrapper>.ck-icon{opacity:.5;pointer-events:none}.ck.ck-search>.ck-labeled-field-view.ck-search__query_with-icon .ck-input{width:100%}[dir=ltr] .ck.ck-search>.ck-labeled-field-view.ck-search__query_with-icon .ck-input,[dir=rtl] .ck.ck-search>.ck-labeled-field-view.ck-search__query_with-icon .ck-input:not(.ck-input-text_empty){padding-left:var(--ck-search-field-view-horizontal-spacing)}.ck.ck-search>.ck-labeled-field-view.ck-search__query_with-reset{--ck-labeled-field-empty-unfocused-max-width:100% - 2 * var(--ck-search-field-view-horizontal-spacing)}.ck.ck-search>.ck-labeled-field-view.ck-search__query_with-reset.ck-labeled-field-view_empty{--ck-labeled-field-empty-unfocused-max-width:100% - var(--ck-search-field-view-horizontal-spacing) - var(--ck-spacing-medium)}.ck.ck-search>.ck-labeled-field-view.ck-search__query_with-reset .ck-search__reset{background:none;min-height:auto;min-width:auto;opacity:0.5;padding:0}[dir=ltr] .ck.ck-search>.ck-labeled-field-view.ck-search__query_with-reset .ck-search__reset{right:var(--ck-spacing-medium)}[dir=rtl] .ck.ck-search>.ck-labeled-field-view.ck-search__query_with-reset .ck-search__reset{left:var(--ck-spacing-medium)}.ck.ck-search>.ck-labeled-field-view.ck-search__query_with-reset .ck-search__reset:hover{opacity:1}.ck.ck-search>.ck-labeled-field-view.ck-search__query_with-reset .ck-input{width:100%}[dir=ltr] .ck.ck-search>.ck-labeled-field-view.ck-search__query_with-reset .ck-input:not(.ck-input-text_empty),[dir=rtl] .ck.ck-search>.ck-labeled-field-view.ck-search__query_with-reset .ck-input{padding-right:var(--ck-search-field-view-horizontal-spacing)}.ck.ck-search>.ck-search__results{min-width:100%}.ck.ck-search>.ck-search__results>.ck-search__info{padding:var(--ck-spacing-medium) var(--ck-spacing-large);width:100%}.ck.ck-search>.ck-search__results>.ck-search__info *{white-space:normal}.ck.ck-search>.ck-search__results>.ck-search__info>span:first-child{font-weight:700}.ck.ck-search>.ck-search__results>.ck-search__info>span:last-child{margin-top:var(--ck-spacing-medium)}.ck.ck-autocomplete{position:relative}.ck.ck-autocomplete>.ck-search__results{position:absolute;z-index:var(--ck-z-panel)}.ck.ck-autocomplete>.ck-search__results.ck-search__results_n{bottom:100%}.ck.ck-autocomplete>.ck-search__results.ck-search__results_s{bottom:auto;top:100%}.ck.ck-autocomplete>.ck-search__results{border-radius:0}.ck-rounded-corners .ck.ck-autocomplete>.ck-search__results,.ck.ck-autocomplete>.ck-search__results.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-autocomplete>.ck-search__results{background:var(--ck-color-base-background);border:1px solid var(--ck-color-dropdown-panel-border);box-shadow:var(--ck-drop-shadow), 0 0;max-height:200px;min-width:auto;overflow-y:auto}.ck.ck-autocomplete>.ck-search__results.ck-search__results_n{border-bottom-left-radius:0;border-bottom-right-radius:0;margin-bottom:-1px}.ck.ck-autocomplete>.ck-search__results.ck-search__results_s{border-top-left-radius:0;border-top-right-radius:0;margin-top:-1px}.ck.ck-highlighted-text mark{background:var(--ck-color-highlight-background);font-size:inherit;font-weight:inherit;line-height:inherit;vertical-align:initial}.ck.ck-spinner-container{display:block;position:relative}.ck.ck-spinner{left:0;margin:0 auto;position:absolute;right:0;top:50%;transform:translateY(-50%);z-index:1}:root{--ck-toolbar-spinner-size:18px}.ck.ck-spinner-container{animation:rotate 1.5s linear infinite;height:var(--ck-toolbar-spinner-size);width:var(--ck-toolbar-spinner-size)}@media (prefers-reduced-motion:reduce){.ck.ck-spinner-container{animation-duration:3s}}.ck.ck-spinner{border:2px solid var(--ck-color-text);border-radius:50%;border-top:2px solid transparent;height:var(--ck-toolbar-spinner-size);width:var(--ck-toolbar-spinner-size)}@keyframes rotate{to{transform:rotate(1turn)}}.ck.ck-block-toolbar-button{position:absolute;z-index:var(--ck-z-default)}:root{--ck-color-block-toolbar-button:var(--ck-color-text);--ck-block-toolbar-button-size:var(--ck-font-size-normal)}.ck.ck-block-toolbar-button{color:var(--ck-color-block-toolbar-button);font-size:var(--ck-block-toolbar-size)}.ck.ck-menu-bar__menu>.ck-menu-bar__menu__button>.ck-menu-bar__menu__button__arrow{pointer-events:none;z-index:var(--ck-z-default)}.ck.ck-menu-bar__menu>.ck-menu-bar__menu__button{padding:var(--ck-list-button-padding);width:100%}.ck.ck-menu-bar__menu>.ck-menu-bar__menu__button>.ck-button__label{flex-grow:1;overflow:hidden;text-overflow:ellipsis}.ck.ck-menu-bar__menu>.ck-menu-bar__menu__button.ck-disabled>.ck-button__label{opacity:var(--ck-disabled-opacity)}[dir=ltr] .ck.ck-menu-bar__menu>.ck-menu-bar__menu__button:not(.ck-button_with-text){padding-left:var(--ck-spacing-small)}[dir=rtl] .ck.ck-menu-bar__menu>.ck-menu-bar__menu__button:not(.ck-button_with-text){padding-right:var(--ck-spacing-small)}.ck.ck-menu-bar__menu.ck-menu-bar__menu_top-level>.ck-menu-bar__menu__button{min-height:unset;padding:var(--ck-spacing-small) var(--ck-spacing-medium)}.ck.ck-menu-bar__menu.ck-menu-bar__menu_top-level>.ck-menu-bar__menu__button .ck-button__label{line-height:unset;width:unset}.ck.ck-menu-bar__menu.ck-menu-bar__menu_top-level>.ck-menu-bar__menu__button.ck-on{border-bottom-left-radius:0;border-bottom-right-radius:0}.ck.ck-menu-bar__menu.ck-menu-bar__menu_top-level>.ck-menu-bar__menu__button .ck-icon{display:none}.ck.ck-menu-bar__menu:not(.ck-menu-bar__menu_top-level) .ck-menu-bar__menu__button{border-radius:0}.ck.ck-menu-bar__menu:not(.ck-menu-bar__menu_top-level) .ck-menu-bar__menu__button:focus{border-color:transparent;box-shadow:none}.ck.ck-menu-bar__menu:not(.ck-menu-bar__menu_top-level) .ck-menu-bar__menu__button:focus:not(.ck-on){background:var(--ck-color-button-default-hover-background)}.ck.ck-menu-bar__menu:not(.ck-menu-bar__menu_top-level) .ck-menu-bar__menu__button:not(:has(.ck-button__icon))>.ck-button__label{margin-left:calc(var(--ck-icon-size) - var(--ck-spacing-small))}.ck.ck-menu-bar__menu:not(.ck-menu-bar__menu_top-level) .ck-menu-bar__menu__button>.ck-menu-bar__menu__button__arrow{width:var(--ck-dropdown-arrow-size)}[dir=ltr] .ck.ck-menu-bar__menu:not(.ck-menu-bar__menu_top-level) .ck-menu-bar__menu__button>.ck-menu-bar__menu__button__arrow{transform:rotate(-90deg)}[dir=rtl] .ck.ck-menu-bar__menu:not(.ck-menu-bar__menu_top-level) .ck-menu-bar__menu__button>.ck-menu-bar__menu__button__arrow{transform:rotate(90deg)}.ck.ck-menu-bar__menu:not(.ck-menu-bar__menu_top-level) .ck-menu-bar__menu__button.ck-disabled>.ck-menu-bar__menu__button__arrow{opacity:var(--ck-disabled-opacity)}[dir=ltr] .ck.ck-menu-bar__menu:not(.ck-menu-bar__menu_top-level) .ck-menu-bar__menu__button>.ck-menu-bar__menu__button__arrow{margin-left:var(--ck-spacing-standard);right:var(--ck-spacing-standard)}[dir=rtl] .ck.ck-menu-bar__menu:not(.ck-menu-bar__menu_top-level) .ck-menu-bar__menu__button>.ck-menu-bar__menu__button__arrow{left:var(--ck-spacing-standard);margin-right:var(--ck-spacing-small)}:root{--ck-menu-bar-menu-item-min-width:18em}.ck.ck-menu-bar__menu .ck.ck-menu-bar__menu__item{min-width:var(--ck-menu-bar-menu-item-min-width)} :root{--ck-menu-bar-menu-max-width:75vw;--ck-menu-bar-nested-menu-horizontal-offset:5px}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel{max-width:var(--ck-menu-bar-menu-max-width);position:absolute;z-index:var(--ck-z-panel)}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_ne,.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_nw{bottom:100%}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_se,.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_sw{bottom:auto;top:100%}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_ne,.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_se{left:0}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_nw,.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_sw{right:0}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_en,.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_es{left:calc(100% - var(--ck-menu-bar-nested-menu-horizontal-offset))}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_es{top:0}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_en{bottom:0}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_wn,.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_ws{right:calc(100% - var(--ck-menu-bar-nested-menu-horizontal-offset))}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_ws{top:0}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_wn{bottom:0}:root{--ck-menu-bar-menu-panel-max-width:75vw}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel{border-radius:0}.ck-rounded-corners .ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel,.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel{background:var(--ck-color-dropdown-panel-background);border:1px solid var(--ck-color-dropdown-panel-border);bottom:0;box-shadow:var(--ck-drop-shadow), 0 0;height:fit-content;max-width:var(--ck-menu-bar-menu-panel-max-width)}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_es,.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_se{border-top-left-radius:0}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_sw,.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_ws{border-top-right-radius:0}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_en,.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_ne{border-bottom-left-radius:0}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_nw,.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_wn{border-bottom-right-radius:0}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel:focus{outline:none}.ck.ck-menu-bar__menu{display:block;font-size:inherit;position:relative}.ck.ck-menu-bar__menu.ck-menu-bar__menu_top-level{max-width:100%}.ck.ck-menu-bar__menu .ck-button.ck-menu-bar__menu__item__button{border-radius:0}.ck.ck-menu-bar__menu .ck-button.ck-menu-bar__menu__item__button>.ck-spinner-container,.ck.ck-menu-bar__menu .ck-button.ck-menu-bar__menu__item__button>.ck-spinner-container .ck-spinner{--ck-toolbar-spinner-size:20px}.ck.ck-menu-bar__menu .ck-button.ck-menu-bar__menu__item__button>.ck-spinner-container{margin-left:calc(var(--ck-spacing-small)*-1);margin-right:var(--ck-spacing-small)}.ck.ck-menu-bar__menu .ck-button.ck-menu-bar__menu__item__button:focus{border-color:transparent;box-shadow:none}.ck.ck-menu-bar__menu .ck-button.ck-menu-bar__menu__item__button:focus:not(.ck-on){background:var(--ck-color-button-default-hover-background)}.ck.ck-menu-bar__menu.ck-menu-bar__menu_top-level>.ck-menu-bar__menu__panel>ul>.ck-menu-bar__menu__item>.ck-menu-bar__menu__item__button:not(:has(.ck-button__icon))>.ck-button__label{margin-left:calc(var(--ck-icon-size) - var(--ck-spacing-small))}.ck.ck-menu-bar{background:var(--ck-color-base-background);border:1px solid var(--ck-color-toolbar-border);display:flex;flex-wrap:wrap;gap:var(--ck-spacing-small);justify-content:flex-start;padding:var(--ck-spacing-small);width:100%}.ck.ck-editor{position:relative}.ck.ck-editor .ck-editor__top .ck-sticky-panel .ck-toolbar{z-index:var(--ck-z-panel)}.ck.ck-editor__top .ck-sticky-panel .ck-sticky-panel__content{border-radius:0}.ck-rounded-corners .ck.ck-editor__top .ck-sticky-panel .ck-sticky-panel__content,.ck.ck-editor__top .ck-sticky-panel .ck-sticky-panel__content.ck-rounded-corners{border-radius:var(--ck-border-radius);border-bottom-left-radius:0;border-bottom-right-radius:0}.ck.ck-editor__top .ck-sticky-panel .ck-sticky-panel__content{border:solid var(--ck-color-base-border);border-width:1px 1px 0}.ck.ck-editor__top .ck-sticky-panel .ck-sticky-panel__content.ck-sticky-panel__content_sticky{border-bottom-width:1px}.ck.ck-editor__top .ck-sticky-panel .ck-sticky-panel__content .ck-menu-bar,.ck.ck-editor__top .ck-sticky-panel .ck-sticky-panel__content .ck-toolbar{border:0}.ck.ck-editor__main>.ck-editor__editable{background:var(--ck-color-base-background);border-radius:0}.ck-rounded-corners .ck.ck-editor__main>.ck-editor__editable,.ck.ck-editor__main>.ck-editor__editable.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0;border-top-right-radius:0}.ck.ck-editor__main>.ck-editor__editable:not(.ck-focused){border-color:var(--ck-color-base-border)}.ck-content code,.ibo-is-html-content code{background-color:rgba(199, 199, 199, 0.3);border-radius:2px;padding:0.15em}.ck.ck-editor__editable .ck-code_selected{background-color:rgba(199, 199, 199, 0.5)}.ck-content blockquote,.ibo-is-html-content blockquote{border-left:5px solid #ccc;font-style:italic;margin-left:0;margin-right:0;overflow:hidden;padding-left:1.5em;padding-right:1.5em}.ck-content[dir=rtl] blockquote,.ibo-is-html-content[dir=rtl] blockquote{border-left:0;border-right:5px solid #ccc}.ck-content pre,.ibo-is-html-content pre{background:rgba(199, 199, 199, 0.3);border:1px solid #c4c4c4;border-radius:2px;color:#353535;direction:ltr;font-style:normal;min-width:200px;padding:1em;tab-size:4;text-align:left;white-space:pre-wrap}.ck-content pre code,.ibo-is-html-content pre code{background:unset;border-radius:0;padding:0}.ck.ck-editor__editable pre{position:relative}.ck.ck-editor__editable pre[data-language]:after{content:attr(data-language);position:absolute}:root{--ck-color-code-block-label-background:#757575}.ck.ck-editor__editable pre[data-language]:after{background:var(--ck-color-code-block-label-background);color:#fff;font-family:var(--ck-font-face);font-size:10px;line-height:16px;padding:var(--ck-spacing-tiny) var(--ck-spacing-medium);right:10px;top:-1px;white-space:nowrap}.ck.ck-code-block-dropdown .ck-dropdown__panel{max-height:250px;overflow-x:hidden;overflow-y:auto}.ck .ck-widget .ck-widget__type-around__button{display:block;overflow:hidden;position:absolute;z-index:var(--ck-z-default)}.ck .ck-widget .ck-widget__type-around__button svg{left:50%;position:absolute;top:50%;z-index:calc(var(--ck-z-default) + 2)}.ck .ck-widget .ck-widget__type-around__button.ck-widget__type-around__button_before{left:min(10%, 30px);top:calc(var(--ck-widget-outline-thickness)*-.5);transform:translateY(-50%)}.ck .ck-widget .ck-widget__type-around__button.ck-widget__type-around__button_after{bottom:calc(var(--ck-widget-outline-thickness)*-.5);right:min(10%, 30px);transform:translateY(50%)}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:after,.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__button:hover:after{content:"";display:block;left:1px;position:absolute;top:1px;z-index:calc(var(--ck-z-default) + 1)}.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__fake-caret{display:none;left:0;position:absolute;right:0}.ck .ck-widget:hover>.ck-widget__type-around>.ck-widget__type-around__fake-caret{left:calc(var(--ck-widget-outline-thickness)*-1);right:calc(var(--ck-widget-outline-thickness)*-1)}.ck .ck-widget.ck-widget_type-around_show-fake-caret_before>.ck-widget__type-around>.ck-widget__type-around__fake-caret{display:block;top:calc(var(--ck-widget-outline-thickness)*-1 - 1px)}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after>.ck-widget__type-around>.ck-widget__type-around__fake-caret{bottom:calc(var(--ck-widget-outline-thickness)*-1 - 1px);display:block}.ck.ck-editor__editable.ck-read-only .ck-widget__type-around,.ck.ck-editor__editable.ck-restricted-editing_mode_restricted .ck-widget__type-around,.ck.ck-editor__editable.ck-widget__type-around_disabled .ck-widget__type-around{display:none}:root{--ck-widget-type-around-button-size:20px;--ck-color-widget-type-around-button-active:var(--ck-color-focus-border);--ck-color-widget-type-around-button-hover:var(--ck-color-widget-hover-border);--ck-color-widget-type-around-button-blurred-editable:var(--ck-color-widget-blurred-border);--ck-color-widget-type-around-button-radar-start-alpha:0;--ck-color-widget-type-around-button-radar-end-alpha:.3;--ck-color-widget-type-around-button-icon:var(--ck-color-base-background)}.ck .ck-widget .ck-widget__type-around__button{background:var(--ck-color-widget-type-around-button);border-radius:100px;height:var(--ck-widget-type-around-button-size);opacity:0;pointer-events:none;transition:opacity var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve), background var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);width:var(--ck-widget-type-around-button-size)}@media (prefers-reduced-motion:reduce){.ck .ck-widget .ck-widget__type-around__button{transition:none}}.ck .ck-widget .ck-widget__type-around__button svg{height:8px;margin-top:1px;transform:translate(-50%, -50%);transition:transform 0.5s ease;width:10px}@media (prefers-reduced-motion:reduce){.ck .ck-widget .ck-widget__type-around__button svg{transition:none}}.ck .ck-widget .ck-widget__type-around__button svg *{stroke-dasharray:10;stroke-dashoffset:0;fill:none;stroke:var(--ck-color-widget-type-around-button-icon);stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round}.ck .ck-widget .ck-widget__type-around__button svg line{stroke-dasharray:7}.ck .ck-widget .ck-widget__type-around__button:hover{animation:ck-widget-type-around-button-sonar 1s ease infinite}.ck .ck-widget .ck-widget__type-around__button:hover svg polyline{animation:ck-widget-type-around-arrow-dash 2s linear}.ck .ck-widget .ck-widget__type-around__button:hover svg line{animation:ck-widget-type-around-arrow-tip-dash 2s linear}@media (prefers-reduced-motion:reduce){.ck .ck-widget .ck-widget__type-around__button:hover,.ck .ck-widget .ck-widget__type-around__button:hover svg line,.ck .ck-widget .ck-widget__type-around__button:hover svg polyline{animation:none}}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button,.ck .ck-widget:hover>.ck-widget__type-around>.ck-widget__type-around__button{opacity:1;pointer-events:auto}.ck .ck-widget:not(.ck-widget_selected)>.ck-widget__type-around>.ck-widget__type-around__button{background:var(--ck-color-widget-type-around-button-hover)}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button,.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__button:hover{background:var(--ck-color-widget-type-around-button-active)}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:after,.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__button:hover:after{background:linear-gradient(135deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.3));border-radius:100px;height:calc(var(--ck-widget-type-around-button-size) - 2px);width:calc(var(--ck-widget-type-around-button-size) - 2px)}.ck .ck-widget.ck-widget_with-selection-handle>.ck-widget__type-around>.ck-widget__type-around__button_before{margin-left:20px}.ck .ck-widget .ck-widget__type-around__fake-caret{animation:ck-widget-type-around-fake-caret-pulse 1s linear infinite normal forwards;background:var(--ck-color-base-text);height:1px;outline:1px solid rgba(255, 255, 255, 0.5);pointer-events:none}.ck .ck-widget.ck-widget_selected.ck-widget_type-around_show-fake-caret_after,.ck .ck-widget.ck-widget_selected.ck-widget_type-around_show-fake-caret_before{outline-color:transparent}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_selected:hover,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_selected:hover{outline-color:var(--ck-color-widget-hover-border)}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after>.ck-widget__type-around>.ck-widget__type-around__button,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before>.ck-widget__type-around>.ck-widget__type-around__button{opacity:0;pointer-events:none}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_selected.ck-widget_with-resizer>.ck-widget__resizer,.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_with-selection-handle.ck-widget_selected:hover>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_selected.ck-widget_with-resizer>.ck-widget__resizer,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_with-selection-handle.ck-widget_selected:hover>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle{opacity:0}.ck[dir=rtl] .ck-widget.ck-widget_with-selection-handle .ck-widget__type-around>.ck-widget__type-around__button_before{margin-left:0;margin-right:20px}.ck-editor__nested-editable.ck-editor__editable_selected .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button,.ck-editor__nested-editable.ck-editor__editable_selected .ck-widget:hover>.ck-widget__type-around>.ck-widget__type-around__button{opacity:0;pointer-events:none}.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:not(:hover){background:var(--ck-color-widget-type-around-button-blurred-editable)}.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:not(:hover) svg *{stroke:#999}@keyframes ck-widget-type-around-arrow-dash{0%{stroke-dashoffset:10}20%,to{stroke-dashoffset:0}}@keyframes ck-widget-type-around-arrow-tip-dash{0%,20%{stroke-dashoffset:7}40%,to{stroke-dashoffset:0}}@keyframes ck-widget-type-around-button-sonar{0%{box-shadow:0 0 0 0 hsla(var(--ck-color-focus-border-coordinates), var(--ck-color-widget-type-around-button-radar-start-alpha))}50%{box-shadow:0 0 0 5px hsla(var(--ck-color-focus-border-coordinates), var(--ck-color-widget-type-around-button-radar-end-alpha))}to{box-shadow:0 0 0 5px hsla(var(--ck-color-focus-border-coordinates), var(--ck-color-widget-type-around-button-radar-start-alpha))}}@keyframes ck-widget-type-around-fake-caret-pulse{0%{opacity:1}49%{opacity:1}50%{opacity:0}99%{opacity:0}to{opacity:1}}:root{--ck-color-resizer:var(--ck-color-focus-border);--ck-color-resizer-tooltip-background:#262626;--ck-color-resizer-tooltip-text:#f2f2f2;--ck-resizer-border-radius:var(--ck-border-radius);--ck-resizer-tooltip-offset:10px;--ck-resizer-tooltip-height:calc(var(--ck-spacing-small)*2 + 10px)}.ck .ck-widget,.ck .ck-widget.ck-widget_with-selection-handle{position:relative}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle{position:absolute}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle .ck-icon{display:block}.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_with-selection-handle:hover>.ck-widget__selection-handle{visibility:visible}.ck .ck-size-view{background:var(--ck-color-resizer-tooltip-background);border:1px solid var(--ck-color-resizer-tooltip-text);border-radius:var(--ck-resizer-border-radius);color:var(--ck-color-resizer-tooltip-text);display:block;font-size:var(--ck-font-size-tiny);height:var(--ck-resizer-tooltip-height);line-height:var(--ck-resizer-tooltip-height);padding:0 var(--ck-spacing-small)}.ck .ck-size-view.ck-orientation-above-center,.ck .ck-size-view.ck-orientation-bottom-left,.ck .ck-size-view.ck-orientation-bottom-right,.ck .ck-size-view.ck-orientation-top-left,.ck .ck-size-view.ck-orientation-top-right{position:absolute}.ck .ck-size-view.ck-orientation-top-left{left:var(--ck-resizer-tooltip-offset);top:var(--ck-resizer-tooltip-offset)}.ck .ck-size-view.ck-orientation-top-right{right:var(--ck-resizer-tooltip-offset);top:var(--ck-resizer-tooltip-offset)}.ck .ck-size-view.ck-orientation-bottom-right{bottom:var(--ck-resizer-tooltip-offset);right:var(--ck-resizer-tooltip-offset)}.ck .ck-size-view.ck-orientation-bottom-left{bottom:var(--ck-resizer-tooltip-offset);left:var(--ck-resizer-tooltip-offset)}.ck .ck-size-view.ck-orientation-above-center{left:50%;top:calc(var(--ck-resizer-tooltip-height)*-1);transform:translate(-50%)}:root{--ck-widget-outline-thickness:3px;--ck-widget-handler-icon-size:16px;--ck-widget-handler-animation-duration:200ms;--ck-widget-handler-animation-curve:ease;--ck-color-widget-blurred-border:#dedede;--ck-color-widget-hover-border:#ffc83d;--ck-color-widget-editable-focus-background:var(--ck-color-base-background);--ck-color-widget-drag-handler-icon-color:var(--ck-color-base-background)}.ck .ck-widget{outline-color:transparent;outline-style:solid;outline-width:var(--ck-widget-outline-thickness);transition:outline-color var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve)}@media (prefers-reduced-motion:reduce){.ck .ck-widget{transition:none}}.ck .ck-widget.ck-widget_selected,.ck .ck-widget.ck-widget_selected:hover{outline:var(--ck-widget-outline-thickness) solid var(--ck-color-focus-border)}.ck .ck-widget:hover{outline-color:var(--ck-color-widget-hover-border)}.ck .ck-editor__nested-editable{border:1px solid transparent}.ck .ck-editor__nested-editable.ck-editor__nested-editable_focused,.ck .ck-editor__nested-editable:focus{border:var(--ck-focus-ring);box-shadow:var(--ck-inner-shadow), 0 0;outline:none}@media (forced-colors:none){.ck .ck-editor__nested-editable.ck-editor__nested-editable_focused,.ck .ck-editor__nested-editable:focus{background-color:var(--ck-color-widget-editable-focus-background)}}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle{background-color:transparent;border-radius:var(--ck-border-radius) var(--ck-border-radius) 0 0;box-sizing:border-box;left:calc(0px - var(--ck-widget-outline-thickness));opacity:0;padding:4px;top:0;transform:translateY(-100%);transition:background-color var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve), visibility var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve), opacity var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve)}@media (prefers-reduced-motion:reduce){.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle{transition:none}}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle .ck-icon{color:var(--ck-color-widget-drag-handler-icon-color);height:var(--ck-widget-handler-icon-size);width:var(--ck-widget-handler-icon-size)}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle .ck-icon .ck-icon__selected-indicator{opacity:0;transition:opacity 0.3s var(--ck-widget-handler-animation-curve)}@media (prefers-reduced-motion:reduce){.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle .ck-icon .ck-icon__selected-indicator{transition:none}}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle:hover .ck-icon .ck-icon__selected-indicator{opacity:1}.ck .ck-widget.ck-widget_with-selection-handle:hover>.ck-widget__selection-handle{background-color:var(--ck-color-widget-hover-border);opacity:1}.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected:hover>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle{background-color:var(--ck-color-focus-border);opacity:1}.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected:hover>.ck-widget__selection-handle .ck-icon .ck-icon__selected-indicator,.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle .ck-icon .ck-icon__selected-indicator{opacity:1}.ck[dir=rtl] .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle{left:auto;right:calc(0px - var(--ck-widget-outline-thickness))}.ck.ck-editor__editable.ck-read-only .ck-widget{transition:none}.ck.ck-editor__editable.ck-read-only .ck-widget:not(.ck-widget_selected){--ck-widget-outline-thickness:0px}.ck.ck-editor__editable.ck-read-only .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle,.ck.ck-editor__editable.ck-read-only .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle:hover{background:var(--ck-color-widget-blurred-border)}.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected:hover{outline-color:var(--ck-color-widget-blurred-border)}.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected.ck-widget_with-selection-handle:hover>.ck-widget__selection-handle,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected.ck-widget_with-selection-handle:hover>.ck-widget__selection-handle:hover,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected.ck-widget_with-selection-handle>.ck-widget__selection-handle,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected.ck-widget_with-selection-handle>.ck-widget__selection-handle:hover{background:var(--ck-color-widget-blurred-border)}.ck.ck-editor__editable blockquote>.ck-widget.ck-widget_with-selection-handle:first-child,.ck.ck-editor__editable>.ck-widget.ck-widget_with-selection-handle:first-child{margin-top:calc(1em + var(--ck-widget-handler-icon-size))} -.ck .ck-widget_with-resizer{position:relative}.ck .ck-widget__resizer{display:none;left:0;pointer-events:none;position:absolute;top:0}.ck-focused .ck-widget_with-resizer.ck-widget_selected>.ck-widget__resizer{display:block}.ck .ck-widget__resizer__handle{pointer-events:all;position:absolute}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-right,.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-left{cursor:nwse-resize}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-left,.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-right{cursor:nesw-resize}:root{--ck-resizer-size:10px;--ck-resizer-offset:calc(var(--ck-resizer-size)/-2 - 2px);--ck-resizer-border-width:1px}.ck .ck-widget__resizer{outline:1px solid var(--ck-color-resizer)}.ck .ck-widget__resizer__handle{background:var(--ck-color-focus-border);border:var(--ck-resizer-border-width) solid #fff;border-radius:var(--ck-resizer-border-radius);height:var(--ck-resizer-size);width:var(--ck-resizer-size)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-left{left:var(--ck-resizer-offset);top:var(--ck-resizer-offset)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-right{right:var(--ck-resizer-offset);top:var(--ck-resizer-offset)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-right{bottom:var(--ck-resizer-offset);right:var(--ck-resizer-offset)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-left{bottom:var(--ck-resizer-offset);left:var(--ck-resizer-offset)}.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position{display:inline;pointer-events:none;position:relative}.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position span{position:absolute;width:0}.ck.ck-editor__editable .ck-widget:-webkit-drag>.ck-widget__selection-handle,.ck.ck-editor__editable .ck-widget:-webkit-drag>.ck-widget__type-around{display:none}.ck.ck-clipboard-drop-target-line{pointer-events:none;position:absolute}:root{--ck-clipboard-drop-target-dot-width:12px;--ck-clipboard-drop-target-dot-height:8px;--ck-clipboard-drop-target-color:var(--ck-color-focus-border)}.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position span{background:var(--ck-clipboard-drop-target-color);border:1px solid var(--ck-clipboard-drop-target-color);bottom:calc(var(--ck-clipboard-drop-target-dot-height)*-.5);margin-left:-1px;top:calc(var(--ck-clipboard-drop-target-dot-height)*-.5)}.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position span:after{border-color:var(--ck-clipboard-drop-target-color) transparent transparent transparent;border-style:solid;border-width:calc(var(--ck-clipboard-drop-target-dot-height)) calc(var(--ck-clipboard-drop-target-dot-width)*.5) 0 calc(var(--ck-clipboard-drop-target-dot-width)*.5);content:"";display:block;height:0;left:50%;position:absolute;top:calc(var(--ck-clipboard-drop-target-dot-height)*-.5);transform:translateX(-50%);width:0}.ck.ck-editor__editable .ck-widget.ck-clipboard-drop-target-range{outline:var(--ck-widget-outline-thickness) solid var(--ck-clipboard-drop-target-color) !important}.ck.ck-editor__editable .ck-widget:-webkit-drag{zoom:0.6;outline:none !important}.ck.ck-clipboard-drop-target-line{background:var(--ck-clipboard-drop-target-color);border:1px solid var(--ck-clipboard-drop-target-color);height:0;margin-top:-1px}.ck.ck-clipboard-drop-target-line:before{border-style:solid;content:"";height:0;position:absolute;top:calc(var(--ck-clipboard-drop-target-dot-width)*-.5);width:0}[dir=ltr] .ck.ck-clipboard-drop-target-line:before{border-color:transparent transparent transparent var(--ck-clipboard-drop-target-color);border-width:calc(var(--ck-clipboard-drop-target-dot-width)*.5) 0 calc(var(--ck-clipboard-drop-target-dot-width)*.5) var(--ck-clipboard-drop-target-dot-height);left:-1px}[dir=rtl] .ck.ck-clipboard-drop-target-line:before{border-color:transparent var(--ck-clipboard-drop-target-color) transparent transparent;border-width:calc(var(--ck-clipboard-drop-target-dot-width)*.5) var(--ck-clipboard-drop-target-dot-height) calc(var(--ck-clipboard-drop-target-dot-width)*.5) 0;right:-1px}.ck-content .text-tiny,.ibo-is-html-content .text-tiny{font-size:0.7em}.ck-content .text-small,.ibo-is-html-content .text-small{font-size:0.85em}.ck-content .text-big,.ibo-is-html-content .text-big{font-size:1.4em}.ck-content .text-huge,.ibo-is-html-content .text-huge{font-size:1.8em}.ck.ck-heading_heading1{font-size:20px}.ck.ck-heading_heading2{font-size:17px}.ck.ck-heading_heading3{font-size:14px}.ck[class*=ck-heading_heading]{font-weight:700}.ck.ck-dropdown.ck-heading-dropdown .ck-dropdown__button .ck-button__label{width:8em}.ck.ck-dropdown.ck-heading-dropdown .ck-dropdown__panel .ck-list__item{min-width:18em}:root{--ck-highlight-marker-yellow:#fdfd77;--ck-highlight-marker-green:#62f962;--ck-highlight-marker-pink:#fc7899;--ck-highlight-marker-blue:#72ccfd;--ck-highlight-pen-red:#e71313;--ck-highlight-pen-green:#128a00}.ck-content .marker-yellow{background-color:var(--ck-highlight-marker-yellow)}.ck-content .marker-green{background-color:var(--ck-highlight-marker-green)}.ck-content .marker-pink{background-color:var(--ck-highlight-marker-pink)}.ck-content .marker-blue{background-color:var(--ck-highlight-marker-blue)}.ck-content .pen-red{background-color:transparent;color:var(--ck-highlight-pen-red)}.ck-content .pen-green,.ibo-is-html-content .pen-green{background-color:transparent;color:var(--ck-highlight-pen-green)}.ck-editor__editable .ck-horizontal-line{display:flow-root}.ck-content hr,.ibo-is-html-content hr{background:#dedede;border:0;height:4px;margin:15px 0}:root{--ck-html-object-embed-unfocused-outline-width:1px}.ck-widget.html-object-embed{background-color:var(--ck-color-base-foreground);font-size:var(--ck-font-size-base);min-width:calc(76px + var(--ck-spacing-standard));padding:var(--ck-spacing-small);padding-top:calc(var(--ck-font-size-tiny) + var(--ck-spacing-large))}.ck-widget.html-object-embed:not(.ck-widget_selected):not(:hover){outline:var(--ck-html-object-embed-unfocused-outline-width) dashed var(--ck-color-widget-blurred-border)}.ck-widget.html-object-embed:before{background:#999;border-radius:0 0 var(--ck-border-radius) var(--ck-border-radius);color:var(--ck-color-base-background);content:attr(data-html-object-embed-label);font-family:var(--ck-font-face);font-size:var(--ck-font-size-tiny);font-style:normal;font-weight:400;left:var(--ck-spacing-standard);padding:calc(var(--ck-spacing-tiny) + var(--ck-html-object-embed-unfocused-outline-width)) var(--ck-spacing-small) var(--ck-spacing-tiny);position:absolute;top:0;transition:background var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve)}.ck-widget.html-object-embed .ck-widget__type-around .ck-widget__type-around__button.ck-widget__type-around__button_before{margin-left:50px}.ck-widget.html-object-embed .html-object-embed__content{pointer-events:none}div.ck-widget.html-object-embed{margin:1em auto}span.ck-widget.html-object-embed{display:inline-block}.ck.ck-text-alternative-form{display:flex;flex-direction:row;flex-wrap:nowrap}.ck.ck-text-alternative-form .ck-labeled-field-view{display:inline-block}.ck.ck-text-alternative-form .ck-label{display:none}@media screen and (max-width:600px){.ck.ck-text-alternative-form{flex-wrap:wrap}.ck.ck-text-alternative-form .ck-labeled-field-view{flex-basis:100%}.ck.ck-text-alternative-form .ck-button{flex-basis:50%}}.ck-vertical-form .ck-button:after{bottom:-1px;content:"";position:absolute;right:-1px;top:-1px;width:0;z-index:1}.ck-vertical-form .ck-button:focus:after{display:none}@media screen and (max-width:600px){.ck.ck-responsive-form .ck-button:after{bottom:-1px;content:"";position:absolute;right:-1px;top:-1px;width:0;z-index:1}.ck.ck-responsive-form .ck-button:focus:after{display:none}}.ck-vertical-form>.ck-button:nth-last-child(2):after{border-right:1px solid var(--ck-color-base-border)}.ck.ck-responsive-form{padding:var(--ck-spacing-large)}.ck.ck-responsive-form:focus{outline:none}[dir=ltr] .ck.ck-responsive-form>:not(:first-child),[dir=rtl] .ck.ck-responsive-form>:not(:last-child){margin-left:var(--ck-spacing-standard)}@media screen and (max-width:600px){.ck.ck-responsive-form{padding:0;width:calc(var(--ck-input-width)*.8)}.ck.ck-responsive-form .ck-labeled-field-view{margin:var(--ck-spacing-large) var(--ck-spacing-large) 0}.ck.ck-responsive-form .ck-labeled-field-view .ck-input-number,.ck.ck-responsive-form .ck-labeled-field-view .ck-input-text{min-width:0;width:100%}.ck.ck-responsive-form .ck-labeled-field-view .ck-labeled-field-view__error{white-space:normal}.ck.ck-responsive-form>.ck-button:nth-last-child(2):after{border-right:1px solid var(--ck-color-base-border)}.ck.ck-responsive-form>.ck-button:last-child,.ck.ck-responsive-form>.ck-button:nth-last-child(2){border-radius:0;margin-top:var(--ck-spacing-large);padding:var(--ck-spacing-standard)}.ck.ck-responsive-form>.ck-button:last-child:not(:focus),.ck.ck-responsive-form>.ck-button:nth-last-child(2):not(:focus){border-top:1px solid var(--ck-color-base-border)}[dir=ltr] .ck.ck-responsive-form>.ck-button:last-child,[dir=ltr] .ck.ck-responsive-form>.ck-button:nth-last-child(2),[dir=rtl] .ck.ck-responsive-form>.ck-button:last-child,[dir=rtl] .ck.ck-responsive-form>.ck-button:nth-last-child(2){margin-left:0}[dir=rtl] .ck.ck-responsive-form>.ck-button:last-child:last-of-type,[dir=rtl] .ck.ck-responsive-form>.ck-button:nth-last-child(2):last-of-type{border-right:1px solid var(--ck-color-base-border)}}.ck.ck-editor__editable img.image_placeholder{background-size:100% 100%}.ck.ck-image-insert-url .ck-image-insert-url__action-row{display:grid;grid-template-columns:repeat(2, 1fr)}:root{--ck-image-insert-insert-by-url-width:250px}.ck.ck-image-insert-url{--ck-input-width:100%}.ck.ck-image-insert-url .ck-image-insert-url__action-row{grid-column-gap:var(--ck-spacing-large);margin-top:var(--ck-spacing-large)}.ck.ck-image-insert-url .ck-image-insert-url__action-row .ck-button-cancel,.ck.ck-image-insert-url .ck-image-insert-url__action-row .ck-button-save{justify-content:center;min-width:auto}.ck.ck-image-insert-url .ck-image-insert-url__action-row .ck-button .ck-button__label{color:var(--ck-color-text)}.ck.ck-image-insert-form>.ck.ck-button{display:block;padding:var(--ck-list-button-padding);width:100%}[dir=ltr] .ck.ck-image-insert-form>.ck.ck-button{text-align:left}[dir=rtl] .ck.ck-image-insert-form>.ck.ck-button{text-align:right}.ck.ck-image-insert-form>.ck.ck-collapsible:not(:first-child){border-top:1px solid var(--ck-color-base-border)}.ck.ck-image-insert-form>.ck.ck-collapsible:not(:last-child){border-bottom:1px solid var(--ck-color-base-border)}.ck.ck-image-insert-form>.ck.ck-collapsible,.ck.ck-image-insert-form>.ck.ck-image-insert-url{min-width:var(--ck-image-insert-insert-by-url-width)}.ck.ck-image-insert-form>.ck.ck-image-insert-url{padding:var(--ck-spacing-large)}.ck.ck-image-insert-form:focus{outline:none}.ck-content .image,.ibo-is-html-content .image{clear:both;display:table;margin:0.9em auto;min-width:50px;text-align:center}.ck-content .image img,.ibo-is-html-content .image img{display:block;height:auto;margin:0 auto;max-width:100%;min-width:100%}.ck-content .image-inline,.ibo-is-html-content .image-inline{align-items:flex-start;display:inline-flex;max-width:100%}.ck-content .image-inline picture,.ibo-is-html-content .image-inline picture{display:flex}.ck-content .image-inline img,.ibo-is-html-content .image-inline img,.ck-content .image-inline picture,.ibo-is-html-content .image-inline picture{flex-grow:1;flex-shrink:1;max-width:100%}.ck.ck-editor__editable .image>figcaption.ck-placeholder:before{overflow:hidden;padding-left:inherit;padding-right:inherit;text-overflow:ellipsis;white-space:nowrap}.ck.ck-editor__editable .image{z-index:1}.ck.ck-editor__editable .image.ck-widget_selected{z-index:2}.ck.ck-editor__editable .image-inline{z-index:1}.ck.ck-editor__editable .image-inline.ck-widget_selected{z-index:2}.ck.ck-editor__editable .image-inline.ck-widget_selected ::selection{display:none}.ck.ck-editor__editable .image-inline img{height:auto}.ck.ck-editor__editable td .image-inline img,.ck.ck-editor__editable th .image-inline img{max-width:none}:root{--ck-color-image-caption-background:#f7f7f7;--ck-color-image-caption-text:#333;--ck-color-image-caption-highlighted-background:#fd0}.ck-content .image>figcaption{background-color:var(--ck-color-image-caption-background);caption-side:bottom;color:var(--ck-color-image-caption-text);display:table-caption;font-size:0.75em;outline-offset:-1px;padding:0.6em;word-break:break-word}@media (forced-colors:active){.ck-content .image>figcaption,.ibo-is-html-content .image>figcaption{background-color:unset;color:unset}}@media (forced-colors:none){.ck.ck-editor__editable .image>figcaption.image__caption_highlighted{animation:ck-image-caption-highlight 0.6s ease-out}}@media (prefers-reduced-motion:reduce){.ck.ck-editor__editable .image>figcaption.image__caption_highlighted{animation:none}}@keyframes ck-image-caption-highlight{0%{background-color:var(--ck-color-image-caption-highlighted-background)}to{background-color:var(--ck-color-image-caption-background)}}.ck.ck-editor__editable .image,.ck.ck-editor__editable .image-inline{position:relative}.ck.ck-editor__editable .image .ck-progress-bar,.ck.ck-editor__editable .image-inline .ck-progress-bar{left:0;position:absolute;top:0}.ck.ck-editor__editable .image-inline.ck-appear,.ck.ck-editor__editable .image.ck-appear{animation:fadeIn 0.7s}@media (prefers-reduced-motion:reduce){.ck.ck-editor__editable .image-inline.ck-appear,.ck.ck-editor__editable .image.ck-appear{animation:none;opacity:1}}.ck.ck-editor__editable .image .ck-progress-bar,.ck.ck-editor__editable .image-inline .ck-progress-bar{background:var(--ck-color-upload-bar-background);height:2px;transition:width 0.1s;width:0}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.ck-image-upload-complete-icon{border-radius:50%;display:block;position:absolute;right:min(var(--ck-spacing-medium), 6%);top:min(var(--ck-spacing-medium), 6%);z-index:1}.ck-image-upload-complete-icon:after{content:"";position:absolute}:root{--ck-color-image-upload-icon:#fff;--ck-color-image-upload-icon-background:#008a00;--ck-image-upload-icon-size:20;--ck-image-upload-icon-width:2px;--ck-image-upload-icon-is-visible:clamp(0px,100% - 50px,1px)}.ck-image-upload-complete-icon{animation-delay:0ms,3s;animation-duration:0.5s, 0.5s;animation-fill-mode:forwards, forwards;animation-name:ck-upload-complete-icon-show, ck-upload-complete-icon-hide;background:var(--ck-color-image-upload-icon-background);font-size:calc(1px*var(--ck-image-upload-icon-size));height:calc(var(--ck-image-upload-icon-is-visible)*var(--ck-image-upload-icon-size));opacity:0;overflow:hidden;width:calc(var(--ck-image-upload-icon-is-visible)*var(--ck-image-upload-icon-size))}.ck-image-upload-complete-icon:after{animation-delay:0.5s;animation-duration:0.5s;animation-fill-mode:forwards;animation-name:ck-upload-complete-icon-check;border-right:var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);border-top:var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);box-sizing:border-box;height:0;left:25%;opacity:0;top:50%;transform:scaleX(-1) rotate(135deg);transform-origin:left top;width:0}@media (prefers-reduced-motion:reduce){.ck-image-upload-complete-icon{animation-duration:0ms}.ck-image-upload-complete-icon:after{animation:none;height:0.45em;opacity:1;width:0.3em}}@keyframes ck-upload-complete-icon-show{0%{opacity:0}to{opacity:1}}@keyframes ck-upload-complete-icon-hide{0%{opacity:1}to{opacity:0}}@keyframes ck-upload-complete-icon-check{0%{height:0;opacity:1;width:0}33%{height:0;width:0.3em}to{height:0.45em;opacity:1;width:0.3em}}.ck .ck-upload-placeholder-loader{align-items:center;display:flex;justify-content:center;left:0;position:absolute;top:0}.ck .ck-upload-placeholder-loader:before{content:"";position:relative}:root{--ck-color-upload-placeholder-loader:#b3b3b3;--ck-upload-placeholder-loader-size:32px;--ck-upload-placeholder-image-aspect-ratio:2.8}.ck .ck-image-upload-placeholder{margin:0;width:100%}.ck .ck-image-upload-placeholder.image-inline{width:calc(var(--ck-upload-placeholder-loader-size)*2*var(--ck-upload-placeholder-image-aspect-ratio))}.ck .ck-image-upload-placeholder img{aspect-ratio:var(--ck-upload-placeholder-image-aspect-ratio)}.ck .ck-upload-placeholder-loader{height:100%;width:100%}.ck .ck-upload-placeholder-loader:before{animation:ck-upload-placeholder-loader 1s linear infinite;border-radius:50%;border-right:2px solid transparent;border-top:3px solid var(--ck-color-upload-placeholder-loader);height:var(--ck-upload-placeholder-loader-size);width:var(--ck-upload-placeholder-loader-size)}@keyframes ck-upload-placeholder-loader{to{transform:rotate(1turn)}}.ck.ck-image-custom-resize-form{align-items:flex-start;display:flex;flex-direction:row;flex-wrap:nowrap}.ck.ck-image-custom-resize-form .ck-labeled-field-view{display:inline-block}.ck.ck-image-custom-resize-form .ck-label{display:none}@media screen and (max-width:600px){.ck.ck-image-custom-resize-form{flex-wrap:wrap}.ck.ck-image-custom-resize-form .ck-labeled-field-view{flex-basis:100%}.ck.ck-image-custom-resize-form .ck-button{flex-basis:50%}}.ck-content img.image_resized,.ibo-is-html-content img.image_resized{height:auto}.ck-content .image.image_resized,.ibo-is-html-content .image.image_resized{box-sizing:border-box;display:block;max-width:100%}.ck-content .image.image_resized img,.ibo-is-html-content .image.image_resized img{width:100%}.ck-content .image.image_resized>figcaption,.ibo-is-html-content .image.image_resized>figcaption{display:block}.ck.ck-editor__editable td .image-inline.image_resized img,.ck.ck-editor__editable th .image-inline.image_resized img{max-width:100%}[dir=ltr] .ck.ck-button.ck-button_with-text.ck-resize-image-button .ck-button__icon{margin-right:var(--ck-spacing-standard)}[dir=rtl] .ck.ck-button.ck-button_with-text.ck-resize-image-button .ck-button__icon{margin-left:var(--ck-spacing-standard)}.ck.ck-dropdown .ck-button.ck-resize-image-button .ck-button__label{width:4em}:root{--ck-image-style-spacing:1.5em;--ck-inline-image-style-spacing:calc(var(--ck-image-style-spacing)/2)}.ck-content .image-style-block-align-left,.ck-content .image-style-block-align-right{max-width:calc(100% - var(--ck-image-style-spacing))}.ck-content .image-style-align-left,.ck-content .image-style-align-right{clear:none}.ck-content .image-style-side{float:right;margin-left:var(--ck-image-style-spacing);max-width:50%}.ck-content .image-style-align-left,.ibo-is-html-content .image-style-align-left{float:left;margin-right:var(--ck-image-style-spacing)}.ck-content .image-style-align-center,.ibo-is-html-content .image-style-align-center{margin-left:auto;margin-right:auto}.ck-content .image-style-align-right,.ibo-is-html-content .image-style-align-right{float:right;margin-left:var(--ck-image-style-spacing)}.ck-content .image-style-block-align-right,.ibo-is-html-content .image-style-block-align-right{margin-left:auto;margin-right:0}.ck-content .image-style-block-align-left,.ibo-is-html-content .image-style-block-align-left{margin-left:0;margin-right:auto}.ck-content p+.image-style-align-left,.ibo-is-html-content p+.image-style-align-left,.ck-content p+.image-style-align-right,.ibo-is-html-content p+.image-style-align-right,.ck-content p+.image-style-side,.ibo-is-html-content p+.image-style-side{margin-top:0}.ck-content .image-inline.image-style-align-left,.ibo-is-html-content .image-inline.image-style-align-left,.ck-content .image-inline.image-style-align-right,.ibo-is-html-content .image-inline.image-style-align-right{margin-bottom:var(--ck-inline-image-style-spacing);margin-top:var(--ck-inline-image-style-spacing)}.ck-content .image-inline.image-style-align-left,.ibo-is-html-content .image-inline.image-style-align-left{margin-right:var(--ck-inline-image-style-spacing)}.ck-content .image-inline.image-style-align-right,.ibo-is-html-content .image-inline.image-style-align-right{margin-left:var(--ck-inline-image-style-spacing)}.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__action:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover),.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__action:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover){background-color:var(--ck-color-button-on-background)}.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__action:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover):after,.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__action:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover):after{display:none}.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open:hover>.ck-splitbutton__action:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open:hover>.ck-splitbutton__arrow:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open:hover>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover){background-color:var(--ck-color-button-on-hover-background)}.ck .ck-link_selected{background:var(--ck-color-link-selected-background)}.ck .ck-link_selected span.image-inline{outline:var(--ck-widget-outline-thickness) solid var(--ck-color-link-selected-background)}.ck .ck-fake-link-selection{background:var(--ck-color-link-fake-selection)}.ck .ck-fake-link-selection_collapsed{border-right:1px solid var(--ck-color-base-text);height:100%;margin-right:-1px;outline:1px solid rgba(255, 255, 255, 0.5)}.ck.ck-link-form{align-items:flex-start;display:flex}.ck.ck-link-form .ck-label{display:none}@media screen and (max-width:600px){.ck.ck-link-form{flex-wrap:wrap}.ck.ck-link-form .ck-labeled-field-view{flex-basis:100%}.ck.ck-link-form .ck-button{flex-basis:50%}}.ck.ck-link-form_layout-vertical{display:block}.ck.ck-link-form_layout-vertical .ck-button.ck-button-cancel,.ck.ck-link-form_layout-vertical .ck-button.ck-button-save{margin-top:var(--ck-spacing-medium)}.ck.ck-link-form_layout-vertical{min-width:var(--ck-input-width);padding:0}.ck.ck-link-form_layout-vertical .ck-labeled-field-view{margin:var(--ck-spacing-large) var(--ck-spacing-large) var(--ck-spacing-small)}.ck.ck-link-form_layout-vertical .ck-labeled-field-view .ck-input-text{min-width:0;width:100%}.ck.ck-link-form_layout-vertical>.ck-button{border-radius:0;margin:0;padding:var(--ck-spacing-standard);width:50%}.ck.ck-link-form_layout-vertical>.ck-button:not(:focus){border-top:1px solid var(--ck-color-base-border)}[dir=ltr] .ck.ck-link-form_layout-vertical>.ck-button,[dir=rtl] .ck.ck-link-form_layout-vertical>.ck-button{margin-left:0}[dir=rtl] .ck.ck-link-form_layout-vertical>.ck-button:last-of-type{border-right:1px solid var(--ck-color-base-border)}.ck.ck-link-form_layout-vertical .ck.ck-list{margin:var(--ck-spacing-standard) var(--ck-spacing-large)}.ck.ck-link-form_layout-vertical .ck.ck-list .ck-button.ck-switchbutton{padding:0;width:100%}.ck.ck-link-form_layout-vertical .ck.ck-list .ck-button.ck-switchbutton:hover{background:none}.ck.ck-link-actions{display:flex;flex-direction:row;flex-wrap:nowrap}.ck.ck-link-actions .ck-link-actions__preview{display:inline-block}.ck.ck-link-actions .ck-link-actions__preview .ck-button__label{overflow:hidden}@media screen and (max-width:600px){.ck.ck-link-actions{flex-wrap:wrap}.ck.ck-link-actions .ck-link-actions__preview{flex-basis:100%}.ck.ck-link-actions .ck-button:not(.ck-link-actions__preview){flex-basis:50%}}.ck.ck-link-actions .ck-button.ck-link-actions__preview{padding-left:0;padding-right:0}.ck.ck-link-actions .ck-button.ck-link-actions__preview .ck-button__label{color:var(--ck-color-link-default);cursor:pointer;max-width:var(--ck-input-width);min-width:3em;padding:0 var(--ck-spacing-medium);text-align:center;text-overflow:ellipsis}.ck.ck-link-actions .ck-button.ck-link-actions__preview .ck-button__label:hover{text-decoration:underline}.ck.ck-link-actions .ck-button.ck-link-actions__preview,.ck.ck-link-actions .ck-button.ck-link-actions__preview:active,.ck.ck-link-actions .ck-button.ck-link-actions__preview:focus,.ck.ck-link-actions .ck-button.ck-link-actions__preview:hover{background:none}.ck.ck-link-actions .ck-button.ck-link-actions__preview:active{box-shadow:none}.ck.ck-link-actions .ck-button.ck-link-actions__preview:focus .ck-button__label{text-decoration:underline}[dir=ltr] .ck.ck-link-actions .ck-button:not(:first-child),[dir=rtl] .ck.ck-link-actions .ck-button:not(:last-child){margin-left:var(--ck-spacing-standard)}@media screen and (max-width:600px){.ck.ck-link-actions .ck-button.ck-link-actions__preview{margin:var(--ck-spacing-standard) var(--ck-spacing-standard) 0}.ck.ck-link-actions .ck-button.ck-link-actions__preview .ck-button__label{max-width:100%;min-width:0}[dir=ltr] .ck.ck-link-actions .ck-button:not(.ck-link-actions__preview),[dir=rtl] .ck.ck-link-actions .ck-button:not(.ck-link-actions__preview){margin-left:0}}.ck.ck-editor__editable a span.image-inline:after,.ck.ck-editor__editable .ibo-quick-create--compartment-results--element>.option:hover span.image-inline:after,.ck.ck-editor__editable figure.image>a:after,.ck.ck-editor__editable .ibo-quick-create--compartment-results--elementfigure>.option:hover:after,.ck.ck-editor__editable .ibo-quick-create--compartment-results--element>figure.image>.option:hover:after{display:block;position:absolute}:root{--ck-link-image-indicator-icon-size:20;--ck-link-image-indicator-icon-is-visible:clamp(0px,100% - 50px,1px)}.ck.ck-editor__editable a span.image-inline:after,.ck.ck-editor__editable figure.image>a:after{background-color:rgba(0,0,0,.4);background-image:url("data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjAgMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0iI2ZmZiIgZD0ibTExLjA3NyAxNSAuOTkxLTEuNDE2YS43NS43NSAwIDEgMSAxLjIyOS44NmwtMS4xNDggMS42NGEuNzQ4Ljc0OCAwIDAgMS0uMjE3LjIwNiA1LjI1MSA1LjI1MSAwIDAgMS04LjUwMy01Ljk1NS43NDEuNzQxIDAgMCAxIC4xMi0uMjc0bDEuMTQ3LTEuNjM5YS43NS43NSAwIDEgMSAxLjIyOC44Nkw0LjkzMyAxMC43bC4wMDYuMDAzYTMuNzUgMy43NSAwIDAgMCA2LjEzMiA0LjI5NGwuMDA2LjAwNHptNS40OTQtNS4zMzVhLjc0OC43NDggMCAwIDEtLjEyLjI3NGwtMS4xNDcgMS42MzlhLjc1Ljc1IDAgMSAxLTEuMjI4LS44NmwuODYtMS4yM2EzLjc1IDMuNzUgMCAwIDAtNi4xNDQtNC4zMDFsLS44NiAxLjIyOWEuNzUuNzUgMCAwIDEtMS4yMjktLjg2bDEuMTQ4LTEuNjRhLjc0OC43NDggMCAwIDEgLjIxNy0uMjA2IDUuMjUxIDUuMjUxIDAgMCAxIDguNTAzIDUuOTU1em0tNC41NjMtMi41MzJhLjc1Ljc1IDAgMCAxIC4xODQgMS4wNDVsLTMuMTU1IDQuNTA1YS43NS43NSAwIDEgMS0xLjIyOS0uODZsMy4xNTUtNC41MDZhLjc1Ljc1IDAgMCAxIDEuMDQ1LS4xODR6Ii8+PC9zdmc+");background-position:50%;background-repeat:no-repeat;background-size:14px;border-radius:100%;content:"";height:calc(var(--ck-link-image-indicator-icon-is-visible)*var(--ck-link-image-indicator-icon-size));overflow:hidden;right:min(var(--ck-spacing-medium), 6%);top:min(var(--ck-spacing-medium), 6%);width:calc(var(--ck-link-image-indicator-icon-is-visible)*var(--ck-link-image-indicator-icon-size))}.ck-editor__editable .ck-list-bogus-paragraph{display:block}.ck-content ol,.ibo-is-html-content ol{list-style-type:decimal}.ck-content ol ol,.ibo-is-html-content ol ol{list-style-type:lower-latin}.ck-content ol ol ol,.ibo-is-html-content ol ol ol{list-style-type:lower-roman}.ck-content ol ol ol ol,.ibo-is-html-content ol ol ol ol{list-style-type:upper-latin}.ck-content ol ol ol ol ol,.ibo-is-html-content ol ol ol ol ol{list-style-type:upper-roman}.ck-content ul,.ibo-is-html-content ul{list-style-type:disc}.ck-content ul ul,.ibo-is-html-content ul ul{list-style-type:circle}.ck-content ul ul ul,.ibo-is-html-content ul ul ul,.ck-content ul ul ul ul,.ibo-is-html-content ul ul ul ul{list-style-type:square}.ck.ck-list-properties.ck-list-properties_without-styles{padding:var(--ck-spacing-large)}.ck.ck-list-properties.ck-list-properties_without-styles>*{min-width:14em}.ck.ck-list-properties.ck-list-properties_without-styles>*+*{margin-top:var(--ck-spacing-standard)}.ck.ck-list-properties.ck-list-properties_with-numbered-properties>.ck-list-styles-list{grid-template-columns:repeat(4, auto)}.ck.ck-list-properties.ck-list-properties_with-numbered-properties>.ck-collapsible{border-top:1px solid var(--ck-color-base-border)}.ck.ck-list-properties.ck-list-properties_with-numbered-properties>.ck-collapsible>.ck-collapsible__children>*{width:100%}.ck.ck-list-properties.ck-list-properties_with-numbered-properties>.ck-collapsible>.ck-collapsible__children>*+*{margin-top:var(--ck-spacing-standard)}.ck.ck-list-properties .ck.ck-numbered-list-properties__start-index .ck-input{min-width:auto;width:100%}.ck.ck-list-properties .ck.ck-numbered-list-properties__reversed-order{background:transparent;margin-bottom:calc(var(--ck-spacing-tiny)*-1);padding-left:0;padding-right:0}.ck.ck-list-properties .ck.ck-numbered-list-properties__reversed-order:active,.ck.ck-list-properties .ck.ck-numbered-list-properties__reversed-order:hover{background:none;border-color:transparent;box-shadow:none}.ck.ck-list-styles-list{display:grid}:root{--ck-list-style-button-size:44px}.ck.ck-list-styles-list{column-gap:var(--ck-spacing-medium);grid-template-columns:repeat(3, auto);padding:var(--ck-spacing-large);row-gap:var(--ck-spacing-medium)}.ck.ck-list-styles-list .ck-button{box-sizing:content-box;margin:0;padding:0}.ck.ck-list-styles-list .ck-button,.ck.ck-list-styles-list .ck-button .ck-icon{height:var(--ck-list-style-button-size);width:var(--ck-list-style-button-size)}:root{--ck-todo-list-checkmark-size:16px}.ck-content .todo-list{list-style:none}.ck-content .todo-list li{margin-bottom:5px;position:relative}.ck-content .todo-list li .todo-list,.ibo-is-html-content .todo-list li .todo-list{margin-top:5px}.ck-content .todo-list .todo-list__label>input,.ibo-is-html-content .todo-list .todo-list__label>input{-webkit-appearance:none;border:0;display:inline-block;height:var(--ck-todo-list-checkmark-size);left:-25px;margin-left:0;margin-right:-15px;position:relative;right:0;vertical-align:middle;width:var(--ck-todo-list-checkmark-size)}.ck-content[dir=rtl] .todo-list .todo-list__label>input,.ibo-is-html-content[dir=rtl] .todo-list .todo-list__label>input{left:0;margin-left:-15px;margin-right:0;right:-25px}.ck-content .todo-list .todo-list__label>input:before,.ibo-is-html-content .todo-list .todo-list__label>input:before{border:1px solid #333;border-radius:2px;box-sizing:border-box;content:"";display:block;height:100%;position:absolute;transition:box-shadow 0.25s ease-in-out;width:100%}@media (prefers-reduced-motion:reduce){.ck-content .todo-list .todo-list__label>input:before,.ibo-is-html-content .todo-list .todo-list__label>input:before{transition:none}}.ck-content .todo-list .todo-list__label>input:after,.ibo-is-html-content .todo-list .todo-list__label>input:after{border-color:transparent;border-style:solid;border-width:0 calc(var(--ck-todo-list-checkmark-size)/8) calc(var(--ck-todo-list-checkmark-size)/8) 0;box-sizing:content-box;content:"";display:block;height:calc(var(--ck-todo-list-checkmark-size)/2.6);left:calc(var(--ck-todo-list-checkmark-size)/3);pointer-events:none;position:absolute;top:calc(var(--ck-todo-list-checkmark-size)/5.3);transform:rotate(45deg);width:calc(var(--ck-todo-list-checkmark-size)/5.3)}.ck-content .todo-list .todo-list__label>input[checked]:before,.ibo-is-html-content .todo-list .todo-list__label>input[checked]:before{background:#26ab33;border-color:#26ab33}.ck-content .todo-list .todo-list__label>input[checked]:after,.ibo-is-html-content .todo-list .todo-list__label>input[checked]:after{border-color:#fff}.ck-content .todo-list .todo-list__label .todo-list__label__description,.ibo-is-html-content .todo-list .todo-list__label .todo-list__label__description{vertical-align:middle}.ck-content .todo-list .todo-list__label.todo-list__label_without-description input[type=checkbox],.ibo-is-html-content .todo-list .todo-list__label.todo-list__label_without-description input[type=checkbox]{position:absolute}.ck-editor__editable.ck-content .todo-list .todo-list__label>input,.ck-editor__editable.ibo-is-html-content .todo-list .todo-list__label>input,.ck-editor__editable.ck-content .todo-list .todo-list__label>span[contenteditable=false]>input,.ck-editor__editable.ibo-is-html-content .todo-list .todo-list__label>span[contenteditable=false]>input{cursor:pointer}.ck-editor__editable.ck-content .todo-list .todo-list__label>input:hover:before,.ck-editor__editable.ibo-is-html-content .todo-list .todo-list__label>input:hover:before,.ck-editor__editable.ck-content .todo-list .todo-list__label>span[contenteditable=false]>input:hover:before,.ck-editor__editable.ibo-is-html-content .todo-list .todo-list__label>span[contenteditable=false]>input:hover:before{box-shadow:0 0 0 5px rgba(0, 0, 0, 0.1)}.ck-editor__editable.ck-content .todo-list .todo-list__label>span[contenteditable=false]>input,.ck-editor__editable.ibo-is-html-content .todo-list .todo-list__label>span[contenteditable=false]>input{-webkit-appearance:none;border:0;display:inline-block;height:var(--ck-todo-list-checkmark-size);left:-25px;margin-left:0;margin-right:-15px;position:relative;right:0;vertical-align:middle;width:var(--ck-todo-list-checkmark-size)}.ck-editor__editable.ck-content[dir=rtl] .todo-list .todo-list__label>span[contenteditable=false]>input,.ck-editor__editable.ibo-is-html-content[dir=rtl] .todo-list .todo-list__label>span[contenteditable=false]>input{left:0;margin-left:-15px;margin-right:0;right:-25px}.ck-editor__editable.ck-content .todo-list .todo-list__label>span[contenteditable=false]>input:before,.ck-editor__editable.ibo-is-html-content .todo-list .todo-list__label>span[contenteditable=false]>input:before{border:1px solid #333;border-radius:2px;box-sizing:border-box;content:"";display:block;height:100%;position:absolute;transition:box-shadow 0.25s ease-in-out;width:100%}@media (prefers-reduced-motion:reduce){.ck-editor__editable.ck-content .todo-list .todo-list__label>span[contenteditable=false]>input:before,.ck-editor__editable.ibo-is-html-content .todo-list .todo-list__label>span[contenteditable=false]>input:before{transition:none}}.ck-editor__editable.ck-content .todo-list .todo-list__label>span[contenteditable=false]>input:after,.ck-editor__editable.ibo-is-html-content .todo-list .todo-list__label>span[contenteditable=false]>input:after{border-color:transparent;border-style:solid;border-width:0 calc(var(--ck-todo-list-checkmark-size)/8) calc(var(--ck-todo-list-checkmark-size)/8) 0;box-sizing:content-box;content:"";display:block;height:calc(var(--ck-todo-list-checkmark-size)/2.6);left:calc(var(--ck-todo-list-checkmark-size)/3);pointer-events:none;position:absolute;top:calc(var(--ck-todo-list-checkmark-size)/5.3);transform:rotate(45deg);width:calc(var(--ck-todo-list-checkmark-size)/5.3)}.ck-editor__editable.ck-content .todo-list .todo-list__label>span[contenteditable=false]>input[checked]:before,.ck-editor__editable.ibo-is-html-content .todo-list .todo-list__label>span[contenteditable=false]>input[checked]:before{background:#26ab33;border-color:#26ab33}.ck-editor__editable.ck-content .todo-list .todo-list__label>span[contenteditable=false]>input[checked]:after,.ck-editor__editable.ibo-is-html-content .todo-list .todo-list__label>span[contenteditable=false]>input[checked]:after{border-color:#fff}.ck-editor__editable.ck-content .todo-list .todo-list__label.todo-list__label_without-description input[type=checkbox],.ck-editor__editable.ibo-is-html-content .todo-list .todo-list__label.todo-list__label_without-description input[type=checkbox]{position:absolute}:root{--ck-mention-list-max-height:300px}.ck.ck-mentions{max-height:var(--ck-mention-list-max-height);overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.ck.ck-mentions>.ck-list__item{flex-shrink:0;overflow:hidden}:root{--ck-color-mention-background:rgba(153,0,48,.1);--ck-color-mention-text:#990030}.ck-content .mention{background:var(--ck-color-mention-background);color:var(--ck-color-mention-text)}:root{--ck-color-selector-focused-cell-background:rgba(158,201,250,.3)}.ck-widget.table td.ck-editor__nested-editable.ck-editor__nested-editable_focused,.ck-widget.table td.ck-editor__nested-editable:focus,.ck-widget.table th.ck-editor__nested-editable.ck-editor__nested-editable_focused,.ck-widget.table th.ck-editor__nested-editable:focus{background:var(--ck-color-selector-focused-cell-background);border-style:none;outline:1px solid var(--ck-color-focus-border);outline-offset:-1px}.ck .ck-insert-table-dropdown__grid{display:flex;flex-direction:row;flex-wrap:wrap}:root{--ck-insert-table-dropdown-padding:10px;--ck-insert-table-dropdown-box-height:11px;--ck-insert-table-dropdown-box-width:12px;--ck-insert-table-dropdown-box-margin:1px}.ck .ck-insert-table-dropdown__grid{padding:var(--ck-insert-table-dropdown-padding) var(--ck-insert-table-dropdown-padding) 0;width:calc(var(--ck-insert-table-dropdown-box-width)*10 + var(--ck-insert-table-dropdown-box-margin)*20 + var(--ck-insert-table-dropdown-padding)*2)}.ck .ck-insert-table-dropdown__label,.ck[dir=rtl] .ck-insert-table-dropdown__label{text-align:center}.ck .ck-insert-table-dropdown-grid-box{border:1px solid var(--ck-color-base-border);border-radius:1px;margin:var(--ck-insert-table-dropdown-box-margin);min-height:var(--ck-insert-table-dropdown-box-height);min-width:var(--ck-insert-table-dropdown-box-width);outline:none;transition:none}@media (prefers-reduced-motion:reduce){.ck .ck-insert-table-dropdown-grid-box{transition:none}}.ck .ck-insert-table-dropdown-grid-box:focus{box-shadow:none}.ck .ck-insert-table-dropdown-grid-box.ck-on{background:var(--ck-color-focus-outer-shadow);border-color:var(--ck-color-focus-border)}:root{--ck-table-selected-cell-background:rgba(158,207,250,.3)}.ck.ck-editor__editable .table table td.ck-editor__editable_selected,.ck.ck-editor__editable .table table th.ck-editor__editable_selected{box-shadow:unset;caret-color:transparent;outline:unset;position:relative}.ck.ck-editor__editable .table table td.ck-editor__editable_selected:after,.ck.ck-editor__editable .table table th.ck-editor__editable_selected:after{background-color:var(--ck-table-selected-cell-background);bottom:0;content:"";left:0;pointer-events:none;position:absolute;right:0;top:0}.ck.ck-editor__editable .table table td.ck-editor__editable_selected ::selection,.ck.ck-editor__editable .table table td.ck-editor__editable_selected:focus,.ck.ck-editor__editable .table table th.ck-editor__editable_selected ::selection,.ck.ck-editor__editable .table table th.ck-editor__editable_selected:focus{background-color:transparent}.ck.ck-editor__editable .table table td.ck-editor__editable_selected .ck-widget,.ck.ck-editor__editable .table table th.ck-editor__editable_selected .ck-widget{outline:unset}.ck.ck-editor__editable .table table td.ck-editor__editable_selected .ck-widget>.ck-widget__selection-handle,.ck.ck-editor__editable .table table th.ck-editor__editable_selected .ck-widget>.ck-widget__selection-handle{display:none}.ck-content .table,.ibo-is-html-content .table{display:table;margin:0.9em auto}.ck-content .table table,.ibo-is-html-content .table table{border:1px double #b3b3b3;border-collapse:collapse;border-spacing:0;height:100%;width:100%}.ck-content .table table td,.ibo-is-html-content .table table td,.ck-content .table table th,.ibo-is-html-content .table table th{border:1px solid #bfbfbf;min-width:2em;padding:0.4em}.ck-content .table table th,.ibo-is-html-content .table table th{background:rgba(0, 0, 0, 0.05);font-weight:700}.ck-content[dir=rtl] .table th,.ibo-is-html-content[dir=rtl] .table th{text-align:right}.ck-content[dir=ltr] .table th,.ibo-is-html-content[dir=ltr] .table th{text-align:left}.ck-editor__editable .ck-table-bogus-paragraph{display:inline-block;width:100%}.ck.ck-input-color{display:flex;flex-direction:row-reverse;width:100%}.ck.ck-input-color>input.ck.ck-input-text{flex-grow:1;min-width:auto}.ck.ck-input-color>div.ck.ck-dropdown{min-width:auto}.ck.ck-input-color>div.ck.ck-dropdown>.ck-input-color__button .ck-dropdown__arrow{display:none}.ck.ck-input-color .ck.ck-input-color__button{display:flex}.ck.ck-input-color .ck.ck-input-color__button .ck.ck-input-color__button__preview{overflow:hidden;position:relative}.ck.ck-input-color .ck.ck-input-color__button .ck.ck-input-color__button__preview>.ck.ck-input-color__button__preview__no-color-indicator{display:block;position:absolute}[dir=ltr] .ck.ck-input-color>.ck.ck-input-text{border-bottom-right-radius:0;border-top-right-radius:0}[dir=rtl] .ck.ck-input-color>.ck.ck-input-text{border-bottom-left-radius:0;border-top-left-radius:0}.ck.ck-input-color>.ck.ck-input-text:focus{z-index:0}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button{padding:0}[dir=ltr] .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button{border-bottom-left-radius:0;border-top-left-radius:0}[dir=ltr] .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button:not(:focus){border-left:1px solid transparent}[dir=rtl] .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button{border-bottom-right-radius:0;border-top-right-radius:0}[dir=rtl] .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button:not(:focus){border-right:1px solid transparent}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button.ck-disabled{background:var(--ck-color-input-disabled-background)}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview{border-radius:0}.ck-rounded-corners .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview,.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview{border:1px solid var(--ck-color-input-border);height:20px;width:20px}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview>.ck.ck-input-color__button__preview__no-color-indicator{background:red;border-radius:2px;height:150%;left:50%;top:-30%;transform:rotate(45deg);transform-origin:50%;width:8%}.ck.ck-input-color .ck.ck-input-color__remove-color{border-bottom-left-radius:0;border-bottom-right-radius:0;padding:calc(var(--ck-spacing-standard)/2) var(--ck-spacing-standard);width:100%}.ck.ck-input-color .ck.ck-input-color__remove-color:not(:focus){border-bottom:1px solid var(--ck-color-input-border)}[dir=ltr] .ck.ck-input-color .ck.ck-input-color__remove-color{border-top-right-radius:0}[dir=rtl] .ck.ck-input-color .ck.ck-input-color__remove-color{border-top-left-radius:0}.ck.ck-input-color .ck.ck-input-color__remove-color .ck.ck-icon{margin-right:var(--ck-spacing-standard)}[dir=rtl] .ck.ck-input-color .ck.ck-input-color__remove-color .ck.ck-icon{margin-left:var(--ck-spacing-standard);margin-right:0}.ck.ck-form__row{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-between}.ck.ck-form__row>:not(.ck-label){flex-grow:1}.ck.ck-form__row.ck-table-form__action-row .ck-button-cancel,.ck.ck-form__row.ck-table-form__action-row .ck-button-save{justify-content:center}.ck.ck-form__row{padding:var(--ck-spacing-standard) var(--ck-spacing-large) 0}[dir=ltr] .ck.ck-form__row>:not(.ck-label)+*{margin-left:var(--ck-spacing-large)}[dir=rtl] .ck.ck-form__row>:not(.ck-label)+*{margin-right:var(--ck-spacing-large)}.ck.ck-form__row>.ck-label{min-width:100%;width:100%}.ck.ck-form__row.ck-table-form__action-row{margin-top:var(--ck-spacing-large)}.ck.ck-form__row.ck-table-form__action-row .ck-button .ck-button__label{color:var(--ck-color-text)}.ck.ck-form{padding:0 0 var(--ck-spacing-large)}.ck.ck-form:focus{outline:none}.ck.ck-form .ck.ck-input-text{min-width:100%;width:0}.ck.ck-form .ck.ck-dropdown{min-width:100%}.ck.ck-form .ck.ck-dropdown .ck-dropdown__button:not(:focus){border:1px solid var(--ck-color-base-border)}.ck.ck-form .ck.ck-dropdown .ck-dropdown__button .ck-button__label{width:100%}.ck.ck-table-form .ck-form__row.ck-table-form__background-row,.ck.ck-table-form .ck-form__row.ck-table-form__border-row{flex-wrap:wrap}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row{align-items:center;flex-wrap:wrap}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-labeled-field-view{align-items:center;display:flex;flex-direction:column-reverse}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-labeled-field-view .ck.ck-dropdown,.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimension-operator{flex-grow:0}.ck.ck-table-form .ck.ck-labeled-field-view{position:relative}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{bottom:calc(var(--ck-table-properties-error-arrow-size)*-1);left:50%;position:absolute;transform:translate(-50%, 100%);z-index:1}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status:after{content:"";left:50%;position:absolute;top:calc(var(--ck-table-properties-error-arrow-size)*-1);transform:translateX(-50%)}:root{--ck-table-properties-error-arrow-size:6px;--ck-table-properties-min-error-width:150px}.ck.ck-table-form .ck-form__row.ck-table-form__border-row .ck-labeled-field-view>.ck-label{font-size:var(--ck-font-size-tiny);text-align:center}.ck.ck-table-form .ck-form__row.ck-table-form__border-row .ck-table-form__border-style,.ck.ck-table-form .ck-form__row.ck-table-form__border-row .ck-table-form__border-width{max-width:80px;min-width:80px;width:80px}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row{padding:0}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimensions-row__height,.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimensions-row__width{margin:0}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimension-operator{align-self:flex-end;display:inline-block;height:var(--ck-ui-component-min-height);line-height:var(--ck-ui-component-min-height);margin:0 var(--ck-spacing-small)}.ck.ck-table-form .ck.ck-labeled-field-view{padding-top:var(--ck-spacing-standard)}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{border-radius:0}.ck-rounded-corners .ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status,.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{background:var(--ck-color-base-error);color:var(--ck-color-base-background);min-width:var(--ck-table-properties-min-error-width);padding:var(--ck-spacing-small) var(--ck-spacing-medium);text-align:center}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status:after{border-color:transparent transparent var(--ck-color-base-error) transparent;border-style:solid;border-width:0 var(--ck-table-properties-error-arrow-size) var(--ck-table-properties-error-arrow-size) var(--ck-table-properties-error-arrow-size)}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{animation:ck-table-form-labeled-view-status-appear 0.15s ease both}@media (prefers-reduced-motion:reduce){.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{animation:none}}.ck.ck-table-form .ck.ck-labeled-field-view .ck-input.ck-error:not(:focus)+.ck.ck-labeled-field-view__status{display:none}@keyframes ck-table-form-labeled-view-status-appear{0%{opacity:0}to{opacity:1}}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__alignment-row{flex-wrap:wrap}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__alignment-row .ck.ck-toolbar:first-of-type{flex-grow:0.57}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__alignment-row .ck.ck-toolbar:last-of-type{flex-grow:0.43}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__alignment-row .ck.ck-toolbar .ck-button{flex-grow:1}.ck.ck-table-cell-properties-form{width:320px}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__padding-row{align-self:flex-end;padding:0;width:25%}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__alignment-row .ck.ck-toolbar{background:none;margin-top:var(--ck-spacing-standard)}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row{align-content:baseline;flex-basis:0;flex-wrap:wrap}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row .ck.ck-toolbar .ck-toolbar__items{flex-wrap:nowrap}.ck.ck-table-properties-form{width:320px}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row{align-self:flex-end;padding:0}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row .ck.ck-toolbar{background:none;margin-top:var(--ck-spacing-standard)}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row .ck.ck-toolbar .ck-toolbar__items>*{width:40px}:root{--ck-color-selector-caption-background:#f7f7f7;--ck-color-selector-caption-text:#333;--ck-color-selector-caption-highlighted-background:#fd0}.ck-content .table>figcaption{background-color:var(--ck-color-selector-caption-background);caption-side:top;color:var(--ck-color-selector-caption-text);display:table-caption;font-size:0.75em;outline-offset:-1px;padding:0.6em;text-align:center;word-break:break-word}@media (forced-colors:active){.ck-content .table>figcaption,.ibo-is-html-content .table>figcaption{background-color:unset;color:unset}}@media (forced-colors:none){.ck.ck-editor__editable .table>figcaption.table__caption_highlighted{animation:ck-table-caption-highlight 0.6s ease-out}}.ck.ck-editor__editable .table>figcaption.ck-placeholder:before{overflow:hidden;padding-left:inherit;padding-right:inherit;text-overflow:ellipsis;white-space:nowrap}@keyframes ck-table-caption-highlight{0%{background-color:var(--ck-color-selector-caption-highlighted-background)}to{background-color:var(--ck-color-selector-caption-background)}}:root{--ck-color-selector-column-resizer-hover:var(--ck-color-base-active);--ck-table-column-resizer-width:7px;--ck-table-column-resizer-position-offset:calc(var(--ck-table-column-resizer-width)*-0.5 - 0.5px)}.ck-content .table .ck-table-resized{table-layout:fixed}.ck-content .table table{overflow:hidden}.ck-content .table td,.ck-content .table th{overflow-wrap:break-word;position:relative}.ck.ck-editor__editable .table .ck-table-column-resizer{bottom:0;cursor:col-resize;position:absolute;right:var(--ck-table-column-resizer-position-offset);top:0;user-select:none;width:var(--ck-table-column-resizer-width);z-index:var(--ck-z-default)}.ck.ck-editor__editable .table[draggable] .ck-table-column-resizer,.ck.ck-editor__editable.ck-column-resize_disabled .table .ck-table-column-resizer{display:none}.ck.ck-editor__editable .table .ck-table-column-resizer:hover,.ck.ck-editor__editable .table .ck-table-column-resizer__active{background-color:var(--ck-color-selector-column-resizer-hover);bottom:-999999px;opacity:0.25;top:-999999px}.ck.ck-editor__editable[dir=rtl] .table .ck-table-column-resizer{left:var(--ck-table-column-resizer-position-offset);right:unset}.ck-source-editing-area{overflow:hidden;position:relative}.ck-source-editing-area textarea,.ck-source-editing-area:after{border:1px solid transparent;font-family:monospace;font-size:var(--ck-font-size-normal);line-height:var(--ck-line-height-base);margin:0;padding:var(--ck-spacing-large);white-space:pre-wrap}.ck-source-editing-area:after{content:attr(data-value) " ";display:block;visibility:hidden}.ck-source-editing-area textarea{border-color:var(--ck-color-base-border);border-radius:0;box-sizing:border-box;height:100%;outline:none;overflow:hidden;position:absolute;resize:none;width:100%}.ck-rounded-corners .ck-source-editing-area textarea,.ck-source-editing-area textarea.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0;border-top-right-radius:0}.ck-source-editing-area textarea:not([readonly]):focus{border:var(--ck-focus-ring);box-shadow:var(--ck-inner-shadow), 0 0;outline:none}:root{--ck-color-list-button-on-background:#eff0ef;--ck-color-list-button-on-background-focus:#eff0ef;--ck-color-list-button-hover-background:#eff0ef;--ck-color-list-button-on-text:#000;--ck-color-image-caption-background:transparent;--ck-spacing-small:0.35rem;--ck-ui-component-min-height:1rem;--ck-icon-size:1.3rem;--ck-z-default:9999;--ck-z-panel:calc(var(--ck-z-default) + 999);--ck-z-dialog:calc(var(--ck-z-panel) + 9999);--ck-text-tiny-font-size:0.7rem;--ck-text-small-font-size:0.85rem;--ck-text-big-font-size:1.4rem;--ck-text-huge-font-size:1.8rem}.text-tiny{font-size:var(--ck-text-tiny-font-size)}.text-small{font-size:var(--ck-text-small-font-size)}.text-big{font-size:var(--ck-text-big-font-size)}.text-huge{font-size:var(--ck-text-huge-font-size)}.ck-editor{z-index:0}.ck-content .image img{margin-left:0;margin-right:0;min-width:inherit}.ck-content .image-style-align-left,.ibo-is-html-content .image-style-align-left,.ck-content .image-style-align-right,.ibo-is-html-content .image-style-align-right{display:block;float:unset}.ck-content .image-style-align-left,.ibo-is-html-content .image-style-align-left{margin-right:0;text-align:left}.ck-content .image-style-align-right,.ibo-is-html-content .image-style-align-right{margin-left:0;text-align:right}.ck-content figure,.ibo-is-html-content figure{margin-left:0;margin-right:0}.ck-content figure table,.ibo-is-html-content figure table{text-align:initial}.ck-content .table,.ibo-is-html-content .table{margin-left:0;margin-right:0}.ck-content .table table th,.ibo-is-html-content .table table th{background-color:#f4f4f4}.ck-content .marker-yellow,.ibo-is-html-content .marker-yellow{background-color:#fdfd77}.ck-content .marker-green,.ibo-is-html-content .marker-green{background-color:#62f962}.ck-content .marker-pink,.ibo-is-html-content .marker-pink{background-color:#fc7899}.ck-content .marker-blue,.ibo-is-html-content .marker-blue{background-color:#72ccfd}.ck{--ck-color-list-button-on-background: #e1e7ec;--ck-color-list-button-on-background-focus: #e1e7ec;--ck-color-list-button-hover-background: #e1e7ec;--ck-color-list-button-on-text: #212934;--ck-text-tiny-font-size: 0.67rem;--ck-text-small-font-size: 0.83rem;--ck-text-big-font-size: 1.33rem;--ck-text-huge-font-size: 1.83rem;--ck-color-image-caption-text: #212934}.ck-editor{width:100% !important;display:inline-grid;z-index:1}.ck-editor .ck-editor__main{overflow:auto}.ck.ck-content,.ck.ibo-is-html-content{color:#212934}.ck.ck-content .table table,.ck.ibo-is-html-content .table table{width:100% !important}.ck-editor__editable_inline:not(.ck-comment__input *){height:200px}.ck-content pre[data-language],.ibo-is-html-content pre[data-language]{padding:0 !important}.ck-content pre[data-language] code,.ibo-is-html-content pre[data-language] code{display:block;background:#212934 !important;padding:0.9rem !important;color:white !important}.ck-maximize_editor_main .ck-source-editing-area textarea{overflow:auto !important}.ck-mentions .ck-button{line-height:1.6rem;padding:4px 8px !important}.c3 path:not(.c3-legend-item-tile),.c3 line:not(.c3-legend-item-tile){stroke:#212934 !important}.c3-chart-arc path:not(.c3-legend-item-tile){stroke:white !important}.c3-axis{fill:#212934 !important}.c3-tooltip th{background-color:#aebecd !important;color:white !important}.c3-tooltip td{background-color:#929fb1 !important}.c3-legend-background{fill:white !important;stroke:#f2f2f2 !important}.c3-tooltip{background-color:#aebecd !important}.c3-tooltip tr{border:1px solid #CCC}.c3-legend-item{fill:#212934 !important}.tippy-content{white-space:pre-line}.ui-dialog{box-sizing:content-box;display:flex;flex-direction:column;position:absolute;top:0;left:0;background-color:white;border-radius:5px;overflow:hidden;outline:0;z-index:21}.ui-dialog .ui-dialog-titlebar{padding:0.4em 30px;position:relative;background-color:white;height:50px;border-bottom:solid 1px #e1e7ec;display:flex;flex-direction:row;align-items:center;justify-content:space-between}.ui-dialog .ui-dialog-title{float:left;margin:0.1em 0;width:100%;padding-right:24px}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:0;top:0.4em;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{box-sizing:content-box;position:relative;padding:16px 30px;overflow:auto}.ui-dialog .ui-dialog-buttonpane{margin-top:auto;text-align:left;border-width:1px 0 0 0;background-image:none;padding:0.4em 30px;position:relative;background-color:white;border-top:solid 1px #e1e7ec;height:50px}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:0.5em 0.4em 0.5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se{width:7px;height:7px;right:0;bottom:0}.ui-dialog .ui-resizable-sw{width:7px;height:7px;left:0;bottom:0}.ui-dialog .ui-resizable-ne{width:7px;height:7px;right:0;top:0}.ui-dialog .ui-resizable-nw{width:7px;height:7px;left:0;top:0}.ui-dialog .ui-button>.ui-icon{background-image:none;float:unset;margin:auto}.ui-dialog .ui-button>.ui-icon.ui-icon-closethick::after{content:"";font-family:"Font Awesome 5 Free";font-weight:600;text-indent:0;position:absolute;left:0px;width:100%;top:4px}.ui-button-icon-only{text-indent:-9999px;white-space:nowrap}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-widget-overlay.ui-front{position:fixed;top:0;left:0;width:100%;height:100%;opacity:0.6;filter:alpha(opacity=60);background-color:#37474f}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-layout-pane{overflow:auto}.ui-datepicker{display:none;background-color:white;border-radius:5px;box-shadow:0 1px 2px rgba(0, 0, 0, 0.25), 0 1px 3px rgba(0, 0, 0, 0.12);z-index:32 !important;padding:0 8px 5px 8px}.ui-datepicker .ui-datepicker-header{position:relative;margin:8px 8px 4px 8px;padding-top:24px}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:0}.ui-datepicker .ui-datepicker-prev{left:0}.ui-datepicker .ui-datepicker-next{right:0}.ui-datepicker .ui-datepicker-title{display:flex;justify-content:space-evenly}.ui-datepicker .ui-datepicker-title select{flex-grow:1}.ui-datepicker .ui-datepicker-year{margin-left:8px}.ui-datepicker .ui-datepicker-calendar{margin:0 8px 8px 8px}.ui-datepicker th{padding:0.7em 0.3em;text-align:center;font-weight:bold}.ui-datepicker td{padding:1px}.ui-datepicker td span,.ui-datepicker td a,.ui-datepicker td .ibo-quick-create--compartment-results--element>.option:hover{display:block;padding:0.2em 0;text-align:center;width:23px;border-radius:100%;color:#c05621}.ui-datepicker td span.ui-state-active,.ui-datepicker td a.ui-state-active,.ui-datepicker td .ibo-quick-create--compartment-results--element>.ui-state-active.option:hover{background-color:#c05621;color:floralwhite}.ui-datepicker td span.ui-state-highlight:not(.ui-state-active),.ui-datepicker td a.ui-state-highlight:not(.ui-state-active),.ui-datepicker td .ibo-quick-create--compartment-results--element>.ui-state-highlight.option:hover:not(.ui-state-active){background-color:#feebc8}.ui-datepicker td span.ui-state-hover:not(.ui-state-active),.ui-datepicker td a.ui-state-hover:not(.ui-state-active),.ui-datepicker td .ibo-quick-create--compartment-results--element>.ui-state-hover.option:hover:not(.ui-state-active){color:#7b341e}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:0.7em 0 0 0;padding:0 0.2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:0.5em 0.2em 0.4em;cursor:pointer;padding:0.2em 0.6em 0.3em 0.6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto 0.4em}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current{float:right}.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-slider{position:relative;text-align:left;background-color:#f8f9fa;border:solid 1px #929fb1;border-radius:3px}.ui-slider .ui-slider-handle{background-color:white;border:solid 1px #929fb1;border-radius:3px;position:absolute;z-index:2;width:1.4em;height:1.4em;-ms-touch-action:none;touch-action:none;cursor:pointer}.ui-slider .ui-slider-handle:hover,.ui-slider .ui-slider-handle:active{border:solid 1px #c05621}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:0.7em;display:block;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle{filter:inherit}.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:0.8em}.ui-slider-horizontal .ui-slider-handle{top:-0.2em;margin-left:-0.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:0.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-0.3em;margin-left:0;margin-bottom:-0.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default;z-index:100}.ui-autocomplete .ui-menu-item{padding:0}.ui-autocomplete-input{width:auto;display:inline}.ui-helper-hidden-accessible{clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-tabs-tab.ui-state-disabled a,.ui-tabs-tab.ui-state-disabled .ibo-quick-create--compartment-results--element>.option:hover{cursor:not-allowed !important}.ui-multiselect{width:auto !important;padding-left:0.7em !important;padding-right:1.5em !important;text-align:left;white-space:nowrap;overflow:hidden;display:grid}button.ui-multiselect>span{overflow:hidden}.ui-multiselect span.ui-icon{float:right}.ui-multiselect-single .ui-multiselect-checkboxes input{position:absolute !important;top:auto !important;left:-9999px}.ui-multiselect-single .ui-multiselect-checkboxes label{padding:5px !important}.ui-multiselect-header{margin-bottom:3px;padding:3px 0}.ui-multiselect-header ul{padding-left:24px}.ui-multiselect-header ul li{float:left;padding:0 10px 0 0}.ui-multiselect-header span.ui-icon{float:left}.ui-multiselect-header li.ui-multiselect-close{float:right;text-align:right;padding-right:0}.ui-multiselect-menu{display:none;padding:3px;position:absolute;z-index:10000;text-align:left}.ui-multiselect-checkboxes{position:relative;overflow-y:scroll !important}.ui-multiselect-checkboxes label{display:flex;align-items:center;cursor:pointer;padding:3px 1px}.ui-multiselect-checkboxes label input{margin-right:5px;position:relative;top:1px}.ui-multiselect-checkboxes li{clear:both;padding-right:3px}.ui-multiselect-checkboxes li.ui-multiselect-optgroup-label{text-align:center}.ui-multiselect-checkboxes li.ui-multiselect-optgroup-label a,.ui-multiselect-checkboxes li.ui-multiselect-optgroup-label .ibo-quick-create--compartment-results--element>.option:hover{display:block;padding:3px;margin:1px 0;text-decoration:none}.ui-dialog-titlebar.ui-multiselect-header{padding-left:20px;padding-right:20px}.ui-dialog-titlebar.ui-multiselect-header ul{padding-left:0;width:100%}.ui-dialog-titlebar.ui-multiselect-header a,.ui-dialog-titlebar.ui-multiselect-header .ibo-quick-create--compartment-results--element>.option:hover{color:#212934;font-weight:normal}.ui-multiselect,.ui-multiselect-menu,.ui-multiselect-header{background-color:#f8f9fa}button.ui-multiselect{padding-right:10px !important}button.ui-multiselect .fas{float:right;padding-left:10px}.dataTables_paginate{color:#404b5a}.dataTables_paginate a.paginate_button,.dataTables_paginate .ibo-quick-create--compartment-results--element>.paginate_button.option:hover{display:inline-flex;justify-content:center;align-items:center;padding:0 5px;min-width:20px;height:20px;border-radius:3px}.dataTables_paginate a.paginate_button:hover,.dataTables_paginate .ibo-quick-create--compartment-results--element>.paginate_button.option:hover{background-color:#f8f9fa}.dataTables_paginate a.paginate_button.disabled,.dataTables_paginate .ibo-quick-create--compartment-results--element>.paginate_button.disabled.option:hover{color:#929fb1;background-color:transparent;cursor:default}.dataTables_paginate a.paginate_button.current,.dataTables_paginate .ibo-quick-create--compartment-results--element>.paginate_button.current.option:hover{color:#212934;background-color:#e1e7ec;box-shadow:inset 0px 1px 0px rgba(0, 0, 0, 0.15)}.dataTables_length select{}.dataTables_length select[aria-controls]{display:inline-flex;width:unset;min-width:50px;height:20px;padding:0 4px}.dataTables_scrollHead{}.dataTables_scrollHead thead tr th{cursor:pointer}.dataTables_scrollHead thead tr th.sorting::after{position:absolute;right:calc((12px - 8px) / 2);content:"";opacity:0.3;line-height:inherit}.dataTables_scrollHead thead tr th.sorting_asc:after{content:"";opacity:1}.dataTables_scrollHead thead tr th.sorting_desc:after{content:"";opacity:1}.dataTables_scrollHeadInner{border-bottom:1px solid #ccd4db}.dataTable th,.dataTable td{position:relative;padding:10px 12px}.dataTable tr:nth-child(odd){background-color:white}.dataTable tr:nth-child(even){background-color:#f2f2f2}.dataTable tr.ibo-is-red{background-color:#fce8e8}.dataTable tr.ibo-is-danger{background-color:#fed7d7}.dataTable tr.ibo-is-alert{background-color:#fed7d7}.dataTable tr.ibo-is-orange{background-color:floralwhite}.dataTable tr.ibo-is-warning{background-color:#feebc8}.dataTable tr.ibo-is-blue{background-color:#bee3f8}.dataTable tr.ibo-is-info{background-color:#bee3f8}.dataTable tr.ibo-is-green{background-color:#dcedc8}.dataTable tr.ibo-is-success{background-color:#c5e1a5}.dataTable tr.ibo-is-red td:first-child::before{content:"";position:absolute;left:0;top:0;width:3px;height:100%;background-color:#feb2b2}.dataTable tr.ibo-is-danger td:first-child::before{content:"";position:absolute;left:0;top:0;width:3px;height:100%;background-color:#fc8181}.dataTable tr.ibo-is-alert td:first-child::before{content:"";position:absolute;left:0;top:0;width:3px;height:100%;background-color:#fc8181}.dataTable tr.ibo-is-orange td:first-child::before{content:"";position:absolute;left:0;top:0;width:3px;height:100%;background-color:#fbd38d}.dataTable tr.ibo-is-warning td:first-child::before{content:"";position:absolute;left:0;top:0;width:3px;height:100%;background-color:#f6ae55}.dataTable tr.ibo-is-blue td:first-child::before{content:"";position:absolute;left:0;top:0;width:3px;height:100%;background-color:#63b4ed}.dataTable tr.ibo-is-info td:first-child::before{content:"";position:absolute;left:0;top:0;width:3px;height:100%;background-color:#63b4ed}.dataTable tr.ibo-is-green td:first-child::before{content:"";position:absolute;left:0;top:0;width:3px;height:100%;background-color:#aed581}.dataTable tr.ibo-is-success td:first-child::before{content:"";position:absolute;left:0;top:0;width:3px;height:100%;background-color:#aed581}.treeview,.treeview ul{padding:0;margin:0;list-style:none}.treeview div.hitarea{height:15px;width:15px;margin-left:-15px;float:left;cursor:pointer}.treeview li{margin:0;padding:3px 0 3px 16px}.treeview a.selected,.treeview .ibo-quick-create--compartment-results--element>.selected.option:hover{background-color:#f8f9fa}#treecontrol{margin:1em 0}.treeview .hover{color:#dd6c20;cursor:pointer}.treeview li{background:url("..//images/tv-item.gif") 0 0 no-repeat}.treeview .collapsable{background-image:url("..//images/tv-collapsable.gif")}.treeview .expandable{background-image:url("..//images/tv-expandable.gif")}.treeview .last{background-image:url("..//images/tv-item-last.gif")}.treeview .lastCollapsable{background-image:url("..//images/tv-collapsable-last.gif")}.treeview .lastExpandable{background-image:url("..//images/tv-expandable-last.gif")}.filetree li{padding:3px 0 1px 16px}.filetree span.folder,.filetree span.file{padding-left:16px;display:block;height:15px}.filetree span.folder{background:url("..//images/tv-folder.gif") 0 0 no-repeat}.filetree span.file{background:url("..//images/tv-file.gif") 0 0 no-repeat}.blockUI.blockOverlay{background-color:#f2f2f2}.blockUI.blockMsg{font-size:6em;text-align:center;color:#6e7a8a;border:none;background-color:transparent}.mfp-bg{z-index:1100}.mfp-wrap{z-index:1101}.selectize-dropdown,.selectize-input,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active,.selectize-input input,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active input{color:#212934}.selectize-control.single .selectize-input,.selectize-control.single .ibo-quick-create--input.selectize-control.single .selectize-input.input-active,.ibo-quick-create--input.selectize-control.single .selectize-control.single .selectize-input.input-active{box-shadow:unset;background-color:white;background-image:unset;background-repeat:unset}.selectize-input,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active,.selectize-control.single .selectize-input.input-active,.selectize-control.single .ibo-quick-create--input.selectize-control.single .selectize-input.input-active,.ibo-quick-create--input.selectize-control.single .selectize-control.single .selectize-input.input-active{background:unset;background-color:white;cursor:text;display:inline-flex}.selectize-control.single .selectize-input.dropdown-active:after,.selectize-control.single .ibo-quick-create--input.selectize-control.single .dropdown-active.selectize-input.input-active:after,.ibo-quick-create--input.selectize-control.single .selectize-control.single .dropdown-active.selectize-input.input-active:after{margin-top:unset;border-width:unset;border-color:unset}.selectize-control.single .selectize-input:after,.selectize-control.single .ibo-quick-create--input.selectize-control.single .selectize-input.input-active:after,.ibo-quick-create--input.selectize-control.single .selectize-control.single .selectize-input.input-active:after,.selectize-control.single .selectize-input:not(.no-arrow):after,.selectize-control.single .ibo-quick-create--input.selectize-control.single .selectize-input.input-active:not(.no-arrow):after,.ibo-quick-create--input.selectize-control.single .selectize-control.single .selectize-input.input-active:not(.no-arrow):after{content:unset}.selectize-input::after,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active::after{content:unset}.selectize-input>*,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active>*{display:inline-flex}.selectize-control.single .selectize-input,.selectize-control.single .ibo-quick-create--input.selectize-control.single .selectize-input.input-active,.ibo-quick-create--input.selectize-control.single .selectize-control.single .selectize-input.input-active,.selectize-dropdown.single{border-color:#aebecd}.selectize-dropdown{background-color:white;color:#212934}.selectize-dropdown .selected,.selectize-dropdown .active,.selectize-dropdown .active:not(.selected){background:#ebf8ff;color:#212934}.selectize-dropdown [data-selectable],.selectize-dropdown .optgroup-header{padding:5px 8px}.selectize-dropdown .option{opacity:1}.selectize-add-option{display:inline-flex;justify-content:center;align-items:flex-end;position:absolute;right:0;padding-bottom:10px;height:100%;width:24px;z-index:1;color:#212934}.selectize-input .attribute-set-item>*,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active .attribute-set-item>*{display:inline}.selectize-input .attribute-set-item.item-add::before,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active .attribute-set-item.item-add::before,.selectize-input .attribute-set-item.item-remove::before,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active .attribute-set-item.item-remove::before{margin-right:4px}.selectize-input .attribute-set-item.item-add,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active .attribute-set-item.item-add{background-color:#dcedc8 !important}.selectize-input .attribute-set-item.item-add::before,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active .attribute-set-item.item-add::before{color:#33691e;content:""}.selectize-input .attribute-set-item.item-remove,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active .attribute-set-item.item-remove{background-color:#fce8e8 !important}.selectize-input .attribute-set-item.item-remove::before,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active .attribute-set-item.item-remove::before{color:#9b2c2c;content:""}.selectize-input .attribute-set-item.item-ignore-partial,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active .attribute-set-item.item-ignore-partial{background-color:#e1e7ec !important}.selectize-input.selectize-input-error,.ibo-quick-create--input.selectize-control.single .selectize-input-error.selectize-input.input-active{border:1px solid #e53e3e}.toastify.on{opacity:1}.toast-close{background:transparent;border:0;color:inherit;cursor:pointer;font-family:inherit;padding:0;margin-left:8px}.toastify-right{right:16px}.toastify-left{left:16px}.toastify-top{top:-150px}.toastify-bottom{bottom:-150px}.toastify-rounded{border-radius:25px}.toastify-avatar{width:1.5em;height:1.5em;margin:-7px 5px;border-radius:2px}.toastify-center{margin-left:auto;margin-right:auto;left:0;right:0;max-width:fit-content;max-width:-moz-fit-content}@media only screen and (max-width:360px){.toastify-right,.toastify-left{margin-left:auto;margin-right:auto;left:0;right:0;max-width:fit-content}}:root{--ibo-scrollbar--scrollbar-width: 8px;--ibo-scrollbar--scrollbar-height: 8px;--ibo-scrollbar--scrollbar-track-background-color: rgba(255, 255, 255, 0);--ibo-scrollbar--scrollbar-track-border-radius: 5px;--ibo-scrollbar--scrollbar-thumb-background-color: #d5dde5;--ibo-scrollbar--scrollbar-thumb-border: none;--ibo-scrollbar--scrollbar-thumb-border-radius: 5px}*,*::before,*::after{box-sizing:border-box}*{scrollbar-width:thin;scrollbar-color:var(--ibo-scrollbar--scrollbar-thumb-background-color) var(--ibo-scrollbar--scrollbar-track-background-color)}*::-webkit-scrollbar{width:var(--ibo-scrollbar--scrollbar-width);height:var(--ibo-scrollbar--scrollbar-height)}*::-webkit-scrollbar-track{background-color:var(--ibo-scrollbar--scrollbar-track-background-color);border-radius:var(--ibo-scrollbar--scrollbar-track-border-radius)}* ::-webkit-scrollbar-thumb{background-color:var(--ibo-scrollbar--scrollbar-thumb-background-color);border:var(--ibo-scrollbar--scrollbar-thumb-border);border-radius:var(--ibo-scrollbar--scrollbar-thumb-border-radius)}html{font-size:12px}a,.ibo-quick-create--compartment-results--element>.option:hover{color:var(--ibo-hyperlink-color);text-decoration:var(--ibo-hyperlink-text-decoration)}a:hover,.ibo-quick-create--compartment-results--element>.option:hover,a:active,.ibo-quick-create--compartment-results--element>.option:hover:active,a:visited,.ibo-quick-create--compartment-results--element>.option:hover:visited{text-decoration:var(--ibo-hyperlink-text-decoration)}a:hover,.ibo-quick-create--compartment-results--element>.option:hover{color:var(--ibo-hyperlink-color--on-hover);text-decoration:var(--ibo-hyperlink-text-decoration--on-hover)}a:active,.ibo-quick-create--compartment-results--element>.option:hover:active{color:var(--ibo-hyperlink-color--on-active);text-decoration:var(--ibo-hyperlink-text-decoration--on-active)}.ibo-alert.ibo-is-primary{background-color:#feebc8;color:#7b341e}.ibo-alert.ibo-is-primary a,.ibo-alert.ibo-is-primary .ibo-quick-create--compartment-results--element>.option:hover{color:#7b341e}.ibo-alert.ibo-is-primary::before{background-color:#c05621}.ibo-alert.ibo-is-secondary,.ui-dialog .ibo-alert.ui-button,.ibo-alert.ui-datepicker-current,.ibo-alert.ui-datepicker-close{background-color:#e1e7ec;color:#212934}.ibo-alert.ibo-is-secondary a,.ui-dialog .ibo-alert.ui-button a,.ui-dialog .ibo-alert.ui-button .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ui-datepicker-current a,.ibo-alert.ui-datepicker-current .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ui-datepicker-close a,.ibo-alert.ui-datepicker-close .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-secondary .ibo-quick-create--compartment-results--element>.option:hover{color:#212934}.ibo-alert.ibo-is-secondary::before,.ui-dialog .ibo-alert.ui-button::before,.ibo-alert.ui-datepicker-current::before,.ibo-alert.ui-datepicker-close::before{background-color:#6e7a8a}.ibo-alert.ibo-is-neutral,.ui-dialog .ibo-alert.ui-button.ui-dialog-titlebar-close{background-color:#e1e7ec;color:#212934}.ibo-alert.ibo-is-neutral a,.ui-dialog .ibo-alert.ui-button.ui-dialog-titlebar-close a,.ibo-alert.ibo-is-neutral .ibo-quick-create--compartment-results--element>.option:hover,.ui-dialog .ibo-alert.ui-button.ui-dialog-titlebar-close .ibo-quick-create--compartment-results--element>.option:hover{color:#212934}.ibo-alert.ibo-is-neutral::before,.ui-dialog .ibo-alert.ui-button.ui-dialog-titlebar-close::before{background-color:#6e7a8a}.ibo-toast.ibo-is-information,.ibo-alert.ibo-is-information{background-color:#bee3f8;color:#2a4265}.ibo-toast.ibo-is-information a,.ibo-toast.ibo-is-information .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-information a,.ibo-alert.ibo-is-information .ibo-quick-create--compartment-results--element>.option:hover{color:#2a4265}.ibo-toast.ibo-is-information::before,.ibo-alert.ibo-is-information::before{background-color:#2b6bb0}.ibo-toast.ibo-is-success,.ibo-alert.ibo-is-success{background-color:#dcedc8;color:#33691e}.ibo-toast.ibo-is-success a,.ibo-toast.ibo-is-success .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-success a,.ibo-alert.ibo-is-success .ibo-quick-create--compartment-results--element>.option:hover{color:#33691e}.ibo-toast.ibo-is-success::before,.ibo-alert.ibo-is-success::before{background-color:#689f38}.ibo-alert.ibo-is-failure{background-color:#fed7d7;color:#742a2a}.ibo-alert.ibo-is-failure a,.ibo-alert.ibo-is-failure .ibo-quick-create--compartment-results--element>.option:hover{color:#742a2a}.ibo-alert.ibo-is-failure::before{background-color:#c53030}.ibo-toast.ibo-is-warning,.ibo-alert.ibo-is-warning{background-color:#feebc8;color:#7b341e}.ibo-toast.ibo-is-warning a,.ibo-toast.ibo-is-warning .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-warning a,.ibo-alert.ibo-is-warning .ibo-quick-create--compartment-results--element>.option:hover{color:#7b341e}.ibo-toast.ibo-is-warning::before,.ibo-alert.ibo-is-warning::before{background-color:#c05621}.ibo-toast.ibo-is-error,.ibo-alert.ibo-is-danger{background-color:#fed7d7;color:#742a2a}.ibo-toast.ibo-is-error a,.ibo-toast.ibo-is-error .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-danger a,.ibo-alert.ibo-is-danger .ibo-quick-create--compartment-results--element>.option:hover{color:#742a2a}.ibo-toast.ibo-is-error::before,.ibo-alert.ibo-is-danger::before{background-color:#c53030}.ibo-alert.ibo-is-grey{background-color:#e1e7ec;color:#212934}.ibo-alert.ibo-is-grey a,.ibo-alert.ibo-is-grey .ibo-quick-create--compartment-results--element>.option:hover{color:#212934}.ibo-alert.ibo-is-grey::before{background-color:#6e7a8a}.ibo-alert.ibo-is-blue-grey{background-color:#b0bec5;color:#263238}.ibo-alert.ibo-is-blue-grey a,.ibo-alert.ibo-is-blue-grey .ibo-quick-create--compartment-results--element>.option:hover{color:#263238}.ibo-alert.ibo-is-blue-grey::before{background-color:#455a64}.ibo-alert.ibo-is-blue{background-color:#bee3f8;color:#2a4265}.ibo-alert.ibo-is-blue a,.ibo-alert.ibo-is-blue .ibo-quick-create--compartment-results--element>.option:hover{color:#2a4265}.ibo-alert.ibo-is-blue::before{background-color:#2b6bb0}.ibo-alert.ibo-is-cyan{background-color:#c9eef2;color:#006164}.ibo-alert.ibo-is-cyan a,.ibo-alert.ibo-is-cyan .ibo-quick-create--compartment-results--element>.option:hover{color:#006164}.ibo-alert.ibo-is-cyan::before{background-color:#2b6bb0}.ibo-alert.ibo-is-green{background-color:#dcedc8;color:#33691e}.ibo-alert.ibo-is-green a,.ibo-alert.ibo-is-green .ibo-quick-create--compartment-results--element>.option:hover{color:#33691e}.ibo-alert.ibo-is-green::before{background-color:#689f38}.ibo-alert.ibo-is-orange{background-color:#feebc8;color:#7b341e}.ibo-alert.ibo-is-orange a,.ibo-alert.ibo-is-orange .ibo-quick-create--compartment-results--element>.option:hover{color:#7b341e}.ibo-alert.ibo-is-orange::before{background-color:#c05621}.ibo-alert.ibo-is-red{background-color:#fed7d7;color:#742a2a}.ibo-alert.ibo-is-red a,.ibo-alert.ibo-is-red .ibo-quick-create--compartment-results--element>.option:hover{color:#742a2a}.ibo-alert.ibo-is-red::before{background-color:#c53030}.ibo-alert.ibo-is-pink{background-color:#fed7e2;color:#702459}.ibo-alert.ibo-is-pink a,.ibo-alert.ibo-is-pink .ibo-quick-create--compartment-results--element>.option:hover{color:#702459}.ibo-alert.ibo-is-pink::before{background-color:#b83280}.ibo-alert{position:relative;padding:18px 20px;min-height:30px;border-radius:3px;overflow:hidden}.ibo-alert::before{display:block;position:absolute;top:0;left:0;content:"";width:4px;height:100%}.ibo-alert .ibo-alert--title{cursor:pointer}.ibo-alert.ibo-is-opened .ibo-alert--minimize-button,.ibo-alert.ibo-input-select-icon--menu .ibo-alert--minimize-button{display:block}.ibo-alert.ibo-is-opened .ibo-alert--maximize-button,.ibo-alert.ibo-input-select-icon--menu .ibo-alert--maximize-button{display:none}.ibo-alert:not(.ibo-is-opened){padding:5px 20px}.ibo-alert:not(.ibo-is-opened) .ibo-alert--title{padding-bottom:0}.ibo-alert:not(.ibo-is-opened) .ibo-alert--minimize-button{display:none}.ibo-alert:not(.ibo-is-opened) .ibo-alert--maximize-button{display:block}.ibo-alert:not(.ibo-is-opened) .ibo-alert--body{display:none}.ibo-alert--title+.ibo-alert--body{margin-top:4px}.ibo-alert--action-button{position:absolute;cursor:pointer;top:5px}.ibo-alert--action-button:hover i{opacity:0.8}.ibo-alert--action-button.ibo-alert--maximize-button,.ibo-alert--action-button.ibo-alert--minimize-button{right:30px}.ibo-alert--action-button.ibo-alert--close-button{right:10px}.ibo-button.ibo-is-regular.ibo-is-neutral,.ui-dialog .ibo-is-regular.ibo-is-neutral.ui-button,.ui-dialog .ibo-is-neutral.ui-button,.ui-dialog .ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-current,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-close,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ibo-is-regular.ibo-is-neutral.ui-datepicker-current,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-neutral.ui-datepicker-current,.ibo-is-neutral.ui-datepicker-current.ui-datepicker-close,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ibo-is-regular.ibo-is-neutral.ui-datepicker-close,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ibo-is-neutral.ui-datepicker-close.ui-datepicker-current,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-neutral.ui-datepicker-close,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-button.ibo-is-neutral.ui-button,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close,.ibo-button.ibo-is-neutral.ui-datepicker-current,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-button.ibo-is-neutral.ui-datepicker-close,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-regular.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:#f8f9fa;color:#212934;box-shadow:0px 2px 0px #d5dde5}.ibo-button.ibo-is-regular.ibo-is-neutral:hover,.ui-dialog .ibo-is-regular.ibo-is-neutral.ui-button:hover,.ui-dialog .ibo-is-neutral.ui-button:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-close:hover,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-neutral.ui-datepicker-current:hover,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button:hover,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-neutral.ui-datepicker-current:hover,.ibo-is-neutral.ui-datepicker-current.ui-datepicker-close:hover,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-neutral.ui-datepicker-close:hover,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button:hover,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-neutral.ui-datepicker-close.ui-datepicker-current:hover,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-neutral.ui-datepicker-close:hover,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-button.ibo-is-neutral.ui-button:hover,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:hover,.ibo-button.ibo-is-neutral.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-button.ibo-is-neutral.ui-datepicker-close:hover,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-regular.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close:hover,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:#e1e7ec;color:#212934;box-shadow:0px 2px 0px #d5dde5}.ibo-button.ibo-is-regular.ibo-is-neutral:active,.ui-dialog .ibo-is-regular.ibo-is-neutral.ui-button:active,.ui-dialog .ibo-is-neutral.ui-button:active,.ui-dialog .ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-current:active,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-close:active,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ibo-is-regular.ibo-is-neutral.ui-datepicker-current:active,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button:active,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-neutral.ui-datepicker-current:active,.ibo-is-neutral.ui-datepicker-current.ui-datepicker-close:active,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ibo-is-regular.ibo-is-neutral.ui-datepicker-close:active,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button:active,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ibo-is-neutral.ui-datepicker-close.ui-datepicker-current:active,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-neutral.ui-datepicker-close:active,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-button.ibo-is-neutral.ui-button:active,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:active,.ibo-button.ibo-is-neutral.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-button.ibo-is-neutral.ui-datepicker-close:active,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-regular.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close:active,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:#e1e7ec;color:#212934;box-shadow:inset 0px 2px 0px #d5dde5 , 0px 2px 0px #e1e7ec}.ibo-button.ibo-is-regular.ibo-is-neutral:disabled,.ui-dialog .ibo-is-regular.ibo-is-neutral.ui-button:disabled,.ui-dialog .ibo-is-neutral.ui-button:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-close:disabled,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-neutral.ui-datepicker-current:disabled,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button:disabled,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-neutral.ui-datepicker-current:disabled,.ibo-is-neutral.ui-datepicker-current.ui-datepicker-close:disabled,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-neutral.ui-datepicker-close:disabled,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button:disabled,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-neutral.ui-datepicker-close.ui-datepicker-current:disabled,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-neutral.ui-datepicker-close:disabled,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ibo-is-neutral.ui-button:disabled,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:disabled,.ibo-button.ibo-is-neutral.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-button.ibo-is-neutral.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-regular.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close:disabled,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:#d5dde5;color:#6e7a8a;box-shadow:inset 0px 2px 0px #d5dde5}.ibo-button.ibo-is-regular.ibo-is-primary,.ui-dialog .ibo-is-regular.ibo-is-primary.ui-button,.ui-dialog .ibo-is-primary.ui-button,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-current,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-close,.ibo-is-regular.ibo-is-primary.ui-datepicker-current,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button,.ibo-is-primary.ui-datepicker-current,.ibo-is-primary.ui-datepicker-current.ui-datepicker-close,.ibo-is-regular.ibo-is-primary.ui-datepicker-close,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button,.ibo-is-primary.ui-datepicker-close.ui-datepicker-current,.ibo-is-primary.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-primary.ui-button,.ibo-button.ibo-is-primary.ui-datepicker-current,.ibo-button.ibo-is-primary.ui-datepicker-close{background-color:#00838f;color:white;box-shadow:0px 2px 0px #003636}.ibo-button.ibo-is-regular.ibo-is-primary:hover,.ui-dialog .ibo-is-regular.ibo-is-primary.ui-button:hover,.ui-dialog .ibo-is-primary.ui-button:hover,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-primary.ui-datepicker-current:hover,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button:hover,.ibo-is-primary.ui-datepicker-current:hover,.ibo-is-primary.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-primary.ui-datepicker-close:hover,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button:hover,.ibo-is-primary.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-primary.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-primary.ui-button:hover,.ibo-button.ibo-is-primary.ui-datepicker-current:hover,.ibo-button.ibo-is-primary.ui-datepicker-close:hover{background-color:#006164;color:white;box-shadow:0px 2px 0px #003636}.ibo-button.ibo-is-regular.ibo-is-primary:active,.ui-dialog .ibo-is-regular.ibo-is-primary.ui-button:active,.ui-dialog .ibo-is-primary.ui-button:active,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-close:active,.ibo-is-regular.ibo-is-primary.ui-datepicker-current:active,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button:active,.ibo-is-primary.ui-datepicker-current:active,.ibo-is-primary.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-regular.ibo-is-primary.ui-datepicker-close:active,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button:active,.ibo-is-primary.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-primary.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-primary.ui-button:active,.ibo-button.ibo-is-primary.ui-datepicker-current:active,.ibo-button.ibo-is-primary.ui-datepicker-close:active{background-color:#006164;color:white;box-shadow:inset 0px 2px 0px #003636 , 0px 2px 0px #006164}.ibo-button.ibo-is-regular.ibo-is-primary:disabled,.ui-dialog .ibo-is-regular.ibo-is-primary.ui-button:disabled,.ui-dialog .ibo-is-primary.ui-button:disabled,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-primary.ui-datepicker-current:disabled,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button:disabled,.ibo-is-primary.ui-datepicker-current:disabled,.ibo-is-primary.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-primary.ui-datepicker-close:disabled,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button:disabled,.ibo-is-primary.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-primary.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-primary.ui-button:disabled,.ibo-button.ibo-is-primary.ui-datepicker-current:disabled,.ibo-button.ibo-is-primary.ui-datepicker-close:disabled{background-color:#d5dde5;color:#6e7a8a;box-shadow:inset 0px 2px 0px #d5dde5}.ibo-button.ibo-is-regular.ibo-is-secondary,.ui-dialog .ibo-is-regular.ibo-is-secondary.ui-button,.ui-dialog .ibo-is-secondary.ui-button,.ui-dialog .ui-button,.ui-dialog .ui-button.ui-datepicker-current,.ui-dialog .ui-button.ui-datepicker-close,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-current,.ui-dialog .ui-button.ui-datepicker-current.ui-datepicker-close,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-close,.ui-dialog .ui-button.ui-datepicker-close.ui-datepicker-current,.ui-dialog .ibo-is-regular.ui-button,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-current,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-close,.ibo-is-regular.ibo-is-secondary.ui-datepicker-current,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button,.ui-dialog .ui-datepicker-current.ui-button,.ui-dialog .ui-datepicker-current.ui-button.ui-datepicker-close,.ibo-is-secondary.ui-datepicker-current,.ui-datepicker-current,.ui-datepicker-current.ui-datepicker-close,.ibo-is-secondary.ui-datepicker-current.ui-datepicker-close,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button,.ibo-is-regular.ui-datepicker-current,.ibo-is-regular.ui-datepicker-current.ui-datepicker-close,.ibo-is-regular.ibo-is-secondary.ui-datepicker-close,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button,.ui-dialog .ui-datepicker-close.ui-button,.ui-dialog .ui-datepicker-close.ui-button.ui-datepicker-current,.ibo-is-secondary.ui-datepicker-close.ui-datepicker-current,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button,.ui-datepicker-close.ui-datepicker-current,.ibo-is-secondary.ui-datepicker-close,.ui-datepicker-close,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button,.ibo-is-regular.ui-datepicker-close.ui-datepicker-current,.ibo-is-regular.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-secondary.ui-button,.ui-dialog .ibo-button.ui-button,.ui-dialog .ibo-button.ui-button.ui-datepicker-current,.ui-dialog .ibo-button.ui-button.ui-datepicker-close,.ibo-button.ibo-is-secondary.ui-datepicker-current,.ui-dialog .ibo-button.ui-datepicker-current.ui-button,.ibo-button.ui-datepicker-current,.ibo-button.ui-datepicker-current.ui-datepicker-close,.ibo-button.ibo-is-secondary.ui-datepicker-close,.ui-dialog .ibo-button.ui-datepicker-close.ui-button,.ibo-button.ui-datepicker-close.ui-datepicker-current,.ibo-button.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-regular.ui-button,.ibo-button.ibo-is-regular.ui-datepicker-current,.ibo-button.ibo-is-regular.ui-datepicker-close{background-color:#f8f9fa;color:#212934;box-shadow:0px 2px 0px #d5dde5}.ibo-button.ibo-is-regular.ibo-is-secondary:hover,.ui-dialog .ibo-is-regular.ibo-is-secondary.ui-button:hover,.ui-dialog .ibo-is-secondary.ui-button:hover,.ui-dialog .ui-button:hover,.ui-dialog .ui-button.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-datepicker-close:hover,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-datepicker-current.ui-datepicker-close:hover,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-close:hover,.ui-dialog .ui-button.ui-datepicker-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-regular.ui-button:hover,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-secondary.ui-datepicker-current:hover,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button:hover,.ui-dialog .ui-datepicker-current.ui-button:hover,.ui-dialog .ui-datepicker-current.ui-button.ui-datepicker-close:hover,.ibo-is-secondary.ui-datepicker-current:hover,.ui-datepicker-current:hover,.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-secondary.ui-datepicker-current.ui-datepicker-close:hover,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button:hover,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button:hover,.ibo-is-regular.ui-datepicker-current:hover,.ibo-is-regular.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-secondary.ui-datepicker-close:hover,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button:hover,.ui-dialog .ui-datepicker-close.ui-button:hover,.ui-dialog .ui-datepicker-close.ui-button.ui-datepicker-current:hover,.ibo-is-secondary.ui-datepicker-close.ui-datepicker-current:hover,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button:hover,.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-secondary.ui-datepicker-close:hover,.ui-datepicker-close:hover,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button:hover,.ibo-is-regular.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-regular.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-secondary.ui-button:hover,.ui-dialog .ibo-button.ui-button:hover,.ui-dialog .ibo-button.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-button.ui-datepicker-close:hover,.ibo-button.ibo-is-secondary.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-datepicker-current.ui-button:hover,.ibo-button.ui-datepicker-current:hover,.ibo-button.ui-datepicker-current.ui-datepicker-close:hover,.ibo-button.ibo-is-secondary.ui-datepicker-close:hover,.ui-dialog .ibo-button.ui-datepicker-close.ui-button:hover,.ibo-button.ui-datepicker-close.ui-datepicker-current:hover,.ibo-button.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-regular.ui-button:hover,.ibo-button.ibo-is-regular.ui-datepicker-current:hover,.ibo-button.ibo-is-regular.ui-datepicker-close:hover{background-color:#e1e7ec;color:#212934;box-shadow:0px 2px 0px #d5dde5}.ibo-button.ibo-is-regular.ibo-is-secondary:active,.ui-dialog .ibo-is-regular.ibo-is-secondary.ui-button:active,.ui-dialog .ibo-is-secondary.ui-button:active,.ui-dialog .ui-button:active,.ui-dialog .ui-button.ui-datepicker-current:active,.ui-dialog .ui-button.ui-datepicker-close:active,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-current:active,.ui-dialog .ui-button.ui-datepicker-current.ui-datepicker-close:active,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-close:active,.ui-dialog .ui-button.ui-datepicker-close.ui-datepicker-current:active,.ui-dialog .ibo-is-regular.ui-button:active,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-close:active,.ibo-is-regular.ibo-is-secondary.ui-datepicker-current:active,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button:active,.ui-dialog .ui-datepicker-current.ui-button:active,.ui-dialog .ui-datepicker-current.ui-button.ui-datepicker-close:active,.ibo-is-secondary.ui-datepicker-current:active,.ui-datepicker-current:active,.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-secondary.ui-datepicker-current.ui-datepicker-close:active,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button:active,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button:active,.ibo-is-regular.ui-datepicker-current:active,.ibo-is-regular.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-regular.ibo-is-secondary.ui-datepicker-close:active,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button:active,.ui-dialog .ui-datepicker-close.ui-button:active,.ui-dialog .ui-datepicker-close.ui-button.ui-datepicker-current:active,.ibo-is-secondary.ui-datepicker-close.ui-datepicker-current:active,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button:active,.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-secondary.ui-datepicker-close:active,.ui-datepicker-close:active,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button:active,.ibo-is-regular.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-regular.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-secondary.ui-button:active,.ui-dialog .ibo-button.ui-button:active,.ui-dialog .ibo-button.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-button.ui-datepicker-close:active,.ibo-button.ibo-is-secondary.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-datepicker-current.ui-button:active,.ibo-button.ui-datepicker-current:active,.ibo-button.ui-datepicker-current.ui-datepicker-close:active,.ibo-button.ibo-is-secondary.ui-datepicker-close:active,.ui-dialog .ibo-button.ui-datepicker-close.ui-button:active,.ibo-button.ui-datepicker-close.ui-datepicker-current:active,.ibo-button.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-regular.ui-button:active,.ibo-button.ibo-is-regular.ui-datepicker-current:active,.ibo-button.ibo-is-regular.ui-datepicker-close:active{background-color:#e1e7ec;color:#212934;box-shadow:inset 0px 2px 0px #d5dde5 , 0px 2px 0px #e1e7ec}.ibo-button.ibo-is-regular.ibo-is-secondary:disabled,.ui-dialog .ibo-is-regular.ibo-is-secondary.ui-button:disabled,.ui-dialog .ibo-is-secondary.ui-button:disabled,.ui-dialog .ui-button:disabled,.ui-dialog .ui-button.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-datepicker-close:disabled,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-datepicker-current.ui-datepicker-close:disabled,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-close:disabled,.ui-dialog .ui-button.ui-datepicker-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-regular.ui-button:disabled,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-secondary.ui-datepicker-current:disabled,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button:disabled,.ui-dialog .ui-datepicker-current.ui-button:disabled,.ui-dialog .ui-datepicker-current.ui-button.ui-datepicker-close:disabled,.ibo-is-secondary.ui-datepicker-current:disabled,.ui-datepicker-current:disabled,.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-secondary.ui-datepicker-current.ui-datepicker-close:disabled,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button:disabled,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button:disabled,.ibo-is-regular.ui-datepicker-current:disabled,.ibo-is-regular.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-secondary.ui-datepicker-close:disabled,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button:disabled,.ui-dialog .ui-datepicker-close.ui-button:disabled,.ui-dialog .ui-datepicker-close.ui-button.ui-datepicker-current:disabled,.ibo-is-secondary.ui-datepicker-close.ui-datepicker-current:disabled,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button:disabled,.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-secondary.ui-datepicker-close:disabled,.ui-datepicker-close:disabled,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button:disabled,.ibo-is-regular.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-regular.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-secondary.ui-button:disabled,.ui-dialog .ibo-button.ui-button:disabled,.ui-dialog .ibo-button.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-button.ui-datepicker-close:disabled,.ibo-button.ibo-is-secondary.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-datepicker-current.ui-button:disabled,.ibo-button.ui-datepicker-current:disabled,.ibo-button.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-button.ibo-is-secondary.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ui-datepicker-close.ui-button:disabled,.ibo-button.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-button.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-regular.ui-button:disabled,.ibo-button.ibo-is-regular.ui-datepicker-current:disabled,.ibo-button.ibo-is-regular.ui-datepicker-close:disabled{background-color:#d5dde5;color:#6e7a8a;box-shadow:inset 0px 2px 0px #d5dde5}.ibo-button.ibo-is-regular.ibo-is-danger,.ui-dialog .ibo-is-regular.ibo-is-danger.ui-button,.ui-dialog .ibo-is-danger.ui-button,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-current,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-close,.ibo-is-regular.ibo-is-danger.ui-datepicker-current,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button,.ibo-is-danger.ui-datepicker-current,.ibo-is-danger.ui-datepicker-current.ui-datepicker-close,.ibo-is-regular.ibo-is-danger.ui-datepicker-close,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button,.ibo-is-danger.ui-datepicker-close.ui-datepicker-current,.ibo-is-danger.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-danger.ui-button,.ibo-button.ibo-is-danger.ui-datepicker-current,.ibo-button.ibo-is-danger.ui-datepicker-close{background-color:#c53030;color:white;box-shadow:0px 2px 0px #742a2a}.ibo-button.ibo-is-regular.ibo-is-danger:hover,.ui-dialog .ibo-is-regular.ibo-is-danger.ui-button:hover,.ui-dialog .ibo-is-danger.ui-button:hover,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-danger.ui-datepicker-current:hover,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button:hover,.ibo-is-danger.ui-datepicker-current:hover,.ibo-is-danger.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-danger.ui-datepicker-close:hover,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button:hover,.ibo-is-danger.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-danger.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-danger.ui-button:hover,.ibo-button.ibo-is-danger.ui-datepicker-current:hover,.ibo-button.ibo-is-danger.ui-datepicker-close:hover{background-color:#9b2c2c;color:white;box-shadow:0px 2px 0px #742a2a}.ibo-button.ibo-is-regular.ibo-is-danger:active,.ui-dialog .ibo-is-regular.ibo-is-danger.ui-button:active,.ui-dialog .ibo-is-danger.ui-button:active,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-close:active,.ibo-is-regular.ibo-is-danger.ui-datepicker-current:active,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button:active,.ibo-is-danger.ui-datepicker-current:active,.ibo-is-danger.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-regular.ibo-is-danger.ui-datepicker-close:active,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button:active,.ibo-is-danger.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-danger.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-danger.ui-button:active,.ibo-button.ibo-is-danger.ui-datepicker-current:active,.ibo-button.ibo-is-danger.ui-datepicker-close:active{background-color:#9b2c2c;color:white;box-shadow:inset 0px 2px 0px #742a2a , 0px 2px 0px #9b2c2c}.ibo-button.ibo-is-regular.ibo-is-danger:disabled,.ui-dialog .ibo-is-regular.ibo-is-danger.ui-button:disabled,.ui-dialog .ibo-is-danger.ui-button:disabled,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-danger.ui-datepicker-current:disabled,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button:disabled,.ibo-is-danger.ui-datepicker-current:disabled,.ibo-is-danger.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-danger.ui-datepicker-close:disabled,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button:disabled,.ibo-is-danger.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-danger.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-danger.ui-button:disabled,.ibo-button.ibo-is-danger.ui-datepicker-current:disabled,.ibo-button.ibo-is-danger.ui-datepicker-close:disabled{background-color:#d5dde5;color:#6e7a8a;box-shadow:inset 0px 2px 0px #d5dde5}.ibo-button.ibo-is-regular.ibo-is-success,.ui-dialog .ibo-is-regular.ibo-is-success.ui-button,.ui-dialog .ibo-is-success.ui-button,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-current,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-close,.ibo-is-regular.ibo-is-success.ui-datepicker-current,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button,.ibo-is-success.ui-datepicker-current,.ibo-is-success.ui-datepicker-current.ui-datepicker-close,.ibo-is-regular.ibo-is-success.ui-datepicker-close,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button,.ibo-is-success.ui-datepicker-close.ui-datepicker-current,.ibo-is-success.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-success.ui-button,.ibo-button.ibo-is-success.ui-datepicker-current,.ibo-button.ibo-is-success.ui-datepicker-close{background-color:#558b2f;color:white;box-shadow:0px 2px 0px #235816}.ibo-button.ibo-is-regular.ibo-is-success:hover,.ui-dialog .ibo-is-regular.ibo-is-success.ui-button:hover,.ui-dialog .ibo-is-success.ui-button:hover,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-success.ui-datepicker-current:hover,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button:hover,.ibo-is-success.ui-datepicker-current:hover,.ibo-is-success.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-success.ui-datepicker-close:hover,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button:hover,.ibo-is-success.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-success.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-success.ui-button:hover,.ibo-button.ibo-is-success.ui-datepicker-current:hover,.ibo-button.ibo-is-success.ui-datepicker-close:hover{background-color:#33691e;color:white;box-shadow:0px 2px 0px #235816}.ibo-button.ibo-is-regular.ibo-is-success:active,.ui-dialog .ibo-is-regular.ibo-is-success.ui-button:active,.ui-dialog .ibo-is-success.ui-button:active,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-close:active,.ibo-is-regular.ibo-is-success.ui-datepicker-current:active,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button:active,.ibo-is-success.ui-datepicker-current:active,.ibo-is-success.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-regular.ibo-is-success.ui-datepicker-close:active,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button:active,.ibo-is-success.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-success.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-success.ui-button:active,.ibo-button.ibo-is-success.ui-datepicker-current:active,.ibo-button.ibo-is-success.ui-datepicker-close:active{background-color:#33691e;color:white;box-shadow:inset 0px 2px 0px #235816 , 0px 2px 0px #33691e}.ibo-button.ibo-is-regular.ibo-is-success:disabled,.ui-dialog .ibo-is-regular.ibo-is-success.ui-button:disabled,.ui-dialog .ibo-is-success.ui-button:disabled,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-success.ui-datepicker-current:disabled,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button:disabled,.ibo-is-success.ui-datepicker-current:disabled,.ibo-is-success.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-success.ui-datepicker-close:disabled,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button:disabled,.ibo-is-success.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-success.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-success.ui-button:disabled,.ibo-button.ibo-is-success.ui-datepicker-current:disabled,.ibo-button.ibo-is-success.ui-datepicker-close:disabled{background-color:#d5dde5;color:#6e7a8a;box-shadow:inset 0px 2px 0px #d5dde5}.ibo-button.ibo-is-regular.ibo-is-red,.ui-dialog .ibo-is-regular.ibo-is-red.ui-button,.ui-dialog .ibo-is-red.ui-button,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-current,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-close,.ibo-is-regular.ibo-is-red.ui-datepicker-current,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button,.ibo-is-red.ui-datepicker-current,.ibo-is-red.ui-datepicker-current.ui-datepicker-close,.ibo-is-regular.ibo-is-red.ui-datepicker-close,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button,.ibo-is-red.ui-datepicker-close.ui-datepicker-current,.ibo-is-red.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-red.ui-button,.ibo-button.ibo-is-red.ui-datepicker-current,.ibo-button.ibo-is-red.ui-datepicker-close{background-color:#c53030;color:white;box-shadow:0px 2px 0px #742a2a}.ibo-button.ibo-is-regular.ibo-is-red:hover,.ui-dialog .ibo-is-regular.ibo-is-red.ui-button:hover,.ui-dialog .ibo-is-red.ui-button:hover,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-red.ui-datepicker-current:hover,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button:hover,.ibo-is-red.ui-datepicker-current:hover,.ibo-is-red.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-red.ui-datepicker-close:hover,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button:hover,.ibo-is-red.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-red.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-red.ui-button:hover,.ibo-button.ibo-is-red.ui-datepicker-current:hover,.ibo-button.ibo-is-red.ui-datepicker-close:hover{background-color:#9b2c2c;color:white;box-shadow:0px 2px 0px #742a2a}.ibo-button.ibo-is-regular.ibo-is-red:active,.ui-dialog .ibo-is-regular.ibo-is-red.ui-button:active,.ui-dialog .ibo-is-red.ui-button:active,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-close:active,.ibo-is-regular.ibo-is-red.ui-datepicker-current:active,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button:active,.ibo-is-red.ui-datepicker-current:active,.ibo-is-red.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-regular.ibo-is-red.ui-datepicker-close:active,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button:active,.ibo-is-red.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-red.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-red.ui-button:active,.ibo-button.ibo-is-red.ui-datepicker-current:active,.ibo-button.ibo-is-red.ui-datepicker-close:active{background-color:#9b2c2c;color:white;box-shadow:inset 0px 2px 0px #742a2a , 0px 2px 0px #9b2c2c}.ibo-button.ibo-is-regular.ibo-is-red:disabled,.ui-dialog .ibo-is-regular.ibo-is-red.ui-button:disabled,.ui-dialog .ibo-is-red.ui-button:disabled,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-red.ui-datepicker-current:disabled,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button:disabled,.ibo-is-red.ui-datepicker-current:disabled,.ibo-is-red.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-red.ui-datepicker-close:disabled,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button:disabled,.ibo-is-red.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-red.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-red.ui-button:disabled,.ibo-button.ibo-is-red.ui-datepicker-current:disabled,.ibo-button.ibo-is-red.ui-datepicker-close:disabled{background-color:#d5dde5;color:#6e7a8a;box-shadow:inset 0px 2px 0px #d5dde5}.ibo-button.ibo-is-regular.ibo-is-green,.ui-dialog .ibo-is-regular.ibo-is-green.ui-button,.ui-dialog .ibo-is-green.ui-button,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-current,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-close,.ibo-is-regular.ibo-is-green.ui-datepicker-current,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button,.ibo-is-green.ui-datepicker-current,.ibo-is-green.ui-datepicker-current.ui-datepicker-close,.ibo-is-regular.ibo-is-green.ui-datepicker-close,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button,.ibo-is-green.ui-datepicker-close.ui-datepicker-current,.ibo-is-green.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-green.ui-button,.ibo-button.ibo-is-green.ui-datepicker-current,.ibo-button.ibo-is-green.ui-datepicker-close{background-color:#558b2f;color:white;box-shadow:0px 2px 0px #235816}.ibo-button.ibo-is-regular.ibo-is-green:hover,.ui-dialog .ibo-is-regular.ibo-is-green.ui-button:hover,.ui-dialog .ibo-is-green.ui-button:hover,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-green.ui-datepicker-current:hover,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button:hover,.ibo-is-green.ui-datepicker-current:hover,.ibo-is-green.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-green.ui-datepicker-close:hover,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button:hover,.ibo-is-green.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-green.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-green.ui-button:hover,.ibo-button.ibo-is-green.ui-datepicker-current:hover,.ibo-button.ibo-is-green.ui-datepicker-close:hover{background-color:#33691e;color:white;box-shadow:0px 2px 0px #235816}.ibo-button.ibo-is-regular.ibo-is-green:active,.ui-dialog .ibo-is-regular.ibo-is-green.ui-button:active,.ui-dialog .ibo-is-green.ui-button:active,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-close:active,.ibo-is-regular.ibo-is-green.ui-datepicker-current:active,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button:active,.ibo-is-green.ui-datepicker-current:active,.ibo-is-green.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-regular.ibo-is-green.ui-datepicker-close:active,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button:active,.ibo-is-green.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-green.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-green.ui-button:active,.ibo-button.ibo-is-green.ui-datepicker-current:active,.ibo-button.ibo-is-green.ui-datepicker-close:active{background-color:#33691e;color:white;box-shadow:inset 0px 2px 0px #235816 , 0px 2px 0px #33691e}.ibo-button.ibo-is-regular.ibo-is-green:disabled,.ui-dialog .ibo-is-regular.ibo-is-green.ui-button:disabled,.ui-dialog .ibo-is-green.ui-button:disabled,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-green.ui-datepicker-current:disabled,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button:disabled,.ibo-is-green.ui-datepicker-current:disabled,.ibo-is-green.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-green.ui-datepicker-close:disabled,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button:disabled,.ibo-is-green.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-green.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-green.ui-button:disabled,.ibo-button.ibo-is-green.ui-datepicker-current:disabled,.ibo-button.ibo-is-green.ui-datepicker-close:disabled{background-color:#d5dde5;color:#6e7a8a;box-shadow:inset 0px 2px 0px #d5dde5}.ibo-button.ibo-is-regular.ibo-is-cyan,.ui-dialog .ibo-is-regular.ibo-is-cyan.ui-button,.ui-dialog .ibo-is-cyan.ui-button,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-current,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-close,.ibo-is-regular.ibo-is-cyan.ui-datepicker-current,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button,.ibo-is-cyan.ui-datepicker-current,.ibo-is-cyan.ui-datepicker-current.ui-datepicker-close,.ibo-is-regular.ibo-is-cyan.ui-datepicker-close,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button,.ibo-is-cyan.ui-datepicker-close.ui-datepicker-current,.ibo-is-cyan.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-cyan.ui-button,.ibo-button.ibo-is-cyan.ui-datepicker-current,.ibo-button.ibo-is-cyan.ui-datepicker-close{background-color:#00838f;color:white;box-shadow:0px 2px 0px #003636}.ibo-button.ibo-is-regular.ibo-is-cyan:hover,.ui-dialog .ibo-is-regular.ibo-is-cyan.ui-button:hover,.ui-dialog .ibo-is-cyan.ui-button:hover,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-cyan.ui-datepicker-current:hover,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button:hover,.ibo-is-cyan.ui-datepicker-current:hover,.ibo-is-cyan.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-cyan.ui-datepicker-close:hover,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button:hover,.ibo-is-cyan.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-cyan.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-cyan.ui-button:hover,.ibo-button.ibo-is-cyan.ui-datepicker-current:hover,.ibo-button.ibo-is-cyan.ui-datepicker-close:hover{background-color:#006164;color:white;box-shadow:0px 2px 0px #003636}.ibo-button.ibo-is-regular.ibo-is-cyan:active,.ui-dialog .ibo-is-regular.ibo-is-cyan.ui-button:active,.ui-dialog .ibo-is-cyan.ui-button:active,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-close:active,.ibo-is-regular.ibo-is-cyan.ui-datepicker-current:active,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button:active,.ibo-is-cyan.ui-datepicker-current:active,.ibo-is-cyan.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-regular.ibo-is-cyan.ui-datepicker-close:active,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button:active,.ibo-is-cyan.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-cyan.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-cyan.ui-button:active,.ibo-button.ibo-is-cyan.ui-datepicker-current:active,.ibo-button.ibo-is-cyan.ui-datepicker-close:active{background-color:#006164;color:white;box-shadow:inset 0px 2px 0px #003636 , 0px 2px 0px #006164}.ibo-button.ibo-is-regular.ibo-is-cyan:disabled,.ui-dialog .ibo-is-regular.ibo-is-cyan.ui-button:disabled,.ui-dialog .ibo-is-cyan.ui-button:disabled,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-cyan.ui-datepicker-current:disabled,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button:disabled,.ibo-is-cyan.ui-datepicker-current:disabled,.ibo-is-cyan.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-cyan.ui-datepicker-close:disabled,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button:disabled,.ibo-is-cyan.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-cyan.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-cyan.ui-button:disabled,.ibo-button.ibo-is-cyan.ui-datepicker-current:disabled,.ibo-button.ibo-is-cyan.ui-datepicker-close:disabled{background-color:#d5dde5;color:#6e7a8a;box-shadow:inset 0px 2px 0px #d5dde5}.ibo-button.ibo-is-alternative.ibo-is-neutral,.ui-dialog .ibo-is-alternative.ibo-is-neutral.ui-button,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-current,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-close,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-neutral.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-alternative.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:transparent;color:#212934;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-neutral:hover,.ui-dialog .ibo-is-alternative.ibo-is-neutral.ui-button:hover,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-current:hover,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-close:hover,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-neutral.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-alternative.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:#f8f9fa;color:#212934;box-shadow:0px 2px 0px #f8f9fa}.ibo-button.ibo-is-alternative.ibo-is-neutral:active,.ui-dialog .ibo-is-alternative.ibo-is-neutral.ui-button:active,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-current:active,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-close:active,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-neutral.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-alternative.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:#f8f9fa;color:#212934;box-shadow:inset 0px 2px 0px #e1e7ec , 0px 2px 0px #f8f9fa}.ibo-button.ibo-is-alternative.ibo-is-neutral:disabled,.ui-dialog .ibo-is-alternative.ibo-is-neutral.ui-button:disabled,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-current:disabled,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-close:disabled,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-neutral.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-alternative.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:transparent;color:#929fb1;box-shadow:inset 0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-primary,.ui-dialog .ibo-is-alternative.ibo-is-primary.ui-button,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-primary.ui-datepicker-current,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-primary.ui-datepicker-close,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-primary.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:transparent;color:#006164;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-primary:hover,.ui-dialog .ibo-is-alternative.ibo-is-primary.ui-button:hover,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-primary.ui-datepicker-current:hover,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-primary.ui-datepicker-close:hover,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-primary.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:white;color:#212934;box-shadow:0px 2px 0px white}.ibo-button.ibo-is-alternative.ibo-is-primary:active,.ui-dialog .ibo-is-alternative.ibo-is-primary.ui-button:active,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-primary.ui-datepicker-current:active,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-primary.ui-datepicker-close:active,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-primary.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:white;color:#212934;box-shadow:inset 0px 2px 0px white , 0px 2px 0px white}.ibo-button.ibo-is-alternative.ibo-is-primary:disabled,.ui-dialog .ibo-is-alternative.ibo-is-primary.ui-button:disabled,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-primary.ui-datepicker-current:disabled,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-primary.ui-datepicker-close:disabled,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-primary.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:transparent;color:#929fb1;box-shadow:inset 0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-secondary,.ui-dialog .ibo-is-alternative.ibo-is-secondary.ui-button,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ui-dialog .ibo-is-alternative.ui-button,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-current,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-close,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-current,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button,.ibo-is-alternative.ui-datepicker-current,.ibo-is-alternative.ui-datepicker-current.ui-datepicker-close,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-close,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button,.ibo-is-alternative.ui-datepicker-close.ui-datepicker-current,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-secondary.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-alternative.ui-button,.ibo-button.ibo-is-alternative.ui-datepicker-current,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-button.ibo-is-alternative.ui-datepicker-close,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close{background-color:transparent;color:#212934;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-secondary:hover,.ui-dialog .ibo-is-alternative.ibo-is-secondary.ui-button:hover,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ui-dialog .ibo-is-alternative.ui-button:hover,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-close:hover,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-current:hover,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button:hover,.ibo-is-alternative.ui-datepicker-current:hover,.ibo-is-alternative.ui-datepicker-current.ui-datepicker-close:hover,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-close:hover,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button:hover,.ibo-is-alternative.ui-datepicker-close.ui-datepicker-current:hover,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-secondary.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close:hover,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-alternative.ui-button:hover,.ibo-button.ibo-is-alternative.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-button.ibo-is-alternative.ui-datepicker-close:hover,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover{background-color:#f8f9fa;color:#212934;box-shadow:0px 2px 0px #f8f9fa}.ibo-button.ibo-is-alternative.ibo-is-secondary:active,.ui-dialog .ibo-is-alternative.ibo-is-secondary.ui-button:active,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ui-dialog .ibo-is-alternative.ui-button:active,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-current:active,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-close:active,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-current:active,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button:active,.ibo-is-alternative.ui-datepicker-current:active,.ibo-is-alternative.ui-datepicker-current.ui-datepicker-close:active,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-close:active,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button:active,.ibo-is-alternative.ui-datepicker-close.ui-datepicker-current:active,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-secondary.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close:active,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-alternative.ui-button:active,.ibo-button.ibo-is-alternative.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-button.ibo-is-alternative.ui-datepicker-close:active,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active{background-color:#f8f9fa;color:#212934;box-shadow:inset 0px 2px 0px #e1e7ec , 0px 2px 0px #f8f9fa}.ibo-button.ibo-is-alternative.ibo-is-secondary:disabled,.ui-dialog .ibo-is-alternative.ibo-is-secondary.ui-button:disabled,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ui-dialog .ibo-is-alternative.ui-button:disabled,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-close:disabled,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-current:disabled,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button:disabled,.ibo-is-alternative.ui-datepicker-current:disabled,.ibo-is-alternative.ui-datepicker-current.ui-datepicker-close:disabled,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-close:disabled,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button:disabled,.ibo-is-alternative.ui-datepicker-close.ui-datepicker-current:disabled,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-secondary.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close:disabled,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-alternative.ui-button:disabled,.ibo-button.ibo-is-alternative.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-button.ibo-is-alternative.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled{background-color:transparent;color:#929fb1;box-shadow:inset 0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-danger,.ui-dialog .ibo-is-alternative.ibo-is-danger.ui-button,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-danger.ui-datepicker-current,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-danger.ui-datepicker-close,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-danger.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:transparent;color:#c53030;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-danger:hover,.ui-dialog .ibo-is-alternative.ibo-is-danger.ui-button:hover,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-danger.ui-datepicker-current:hover,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-danger.ui-datepicker-close:hover,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-danger.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:#fed7d7;color:#742a2a;box-shadow:0px 2px 0px #fed7d7}.ibo-button.ibo-is-alternative.ibo-is-danger:active,.ui-dialog .ibo-is-alternative.ibo-is-danger.ui-button:active,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-danger.ui-datepicker-current:active,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-danger.ui-datepicker-close:active,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-danger.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:#fed7d7;color:#742a2a;box-shadow:inset 0px 2px 0px #c53030 , 0px 2px 0px #fed7d7}.ibo-button.ibo-is-alternative.ibo-is-danger:disabled,.ui-dialog .ibo-is-alternative.ibo-is-danger.ui-button:disabled,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-danger.ui-datepicker-current:disabled,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-danger.ui-datepicker-close:disabled,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-danger.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:transparent;color:#929fb1;box-shadow:inset 0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-success,.ui-dialog .ibo-is-alternative.ibo-is-success.ui-button,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-success.ui-datepicker-current,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-success.ui-datepicker-close,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-success.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:transparent;color:#33691e;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-success:hover,.ui-dialog .ibo-is-alternative.ibo-is-success.ui-button:hover,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-success.ui-datepicker-current:hover,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-success.ui-datepicker-close:hover,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-success.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:#dcedc8;color:#33691e;box-shadow:0px 2px 0px #dcedc8}.ibo-button.ibo-is-alternative.ibo-is-success:active,.ui-dialog .ibo-is-alternative.ibo-is-success.ui-button:active,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-success.ui-datepicker-current:active,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-success.ui-datepicker-close:active,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-success.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:#dcedc8;color:#33691e;box-shadow:inset 0px 2px 0px #689f38 , 0px 2px 0px #dcedc8}.ibo-button.ibo-is-alternative.ibo-is-success:disabled,.ui-dialog .ibo-is-alternative.ibo-is-success.ui-button:disabled,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-success.ui-datepicker-current:disabled,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-success.ui-datepicker-close:disabled,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-success.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:transparent;color:#929fb1;box-shadow:inset 0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-red,.ui-dialog .ibo-is-alternative.ibo-is-red.ui-button,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-red.ui-datepicker-current,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-red.ui-datepicker-close,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-red.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:transparent;color:#c53030;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-red:hover,.ui-dialog .ibo-is-alternative.ibo-is-red.ui-button:hover,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-red.ui-datepicker-current:hover,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-red.ui-datepicker-close:hover,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-red.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:#fed7d7;color:#742a2a;box-shadow:0px 2px 0px #fed7d7}.ibo-button.ibo-is-alternative.ibo-is-red:active,.ui-dialog .ibo-is-alternative.ibo-is-red.ui-button:active,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-red.ui-datepicker-current:active,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-red.ui-datepicker-close:active,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-red.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:#fed7d7;color:#742a2a;box-shadow:inset 0px 2px 0px #c53030 , 0px 2px 0px #fed7d7}.ibo-button.ibo-is-alternative.ibo-is-red:disabled,.ui-dialog .ibo-is-alternative.ibo-is-red.ui-button:disabled,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-red.ui-datepicker-current:disabled,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-red.ui-datepicker-close:disabled,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-red.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:transparent;color:#929fb1;box-shadow:inset 0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-green,.ui-dialog .ibo-is-alternative.ibo-is-green.ui-button,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-green.ui-datepicker-current,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-green.ui-datepicker-close,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-green.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:transparent;color:#33691e;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-green:hover,.ui-dialog .ibo-is-alternative.ibo-is-green.ui-button:hover,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-green.ui-datepicker-current:hover,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-green.ui-datepicker-close:hover,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-green.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:#dcedc8;color:#33691e;box-shadow:0px 2px 0px #dcedc8}.ibo-button.ibo-is-alternative.ibo-is-green:active,.ui-dialog .ibo-is-alternative.ibo-is-green.ui-button:active,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-green.ui-datepicker-current:active,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-green.ui-datepicker-close:active,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-green.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:#dcedc8;color:#33691e;box-shadow:inset 0px 2px 0px #689f38 , 0px 2px 0px #dcedc8}.ibo-button.ibo-is-alternative.ibo-is-green:disabled,.ui-dialog .ibo-is-alternative.ibo-is-green.ui-button:disabled,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-green.ui-datepicker-current:disabled,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-green.ui-datepicker-close:disabled,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-green.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:transparent;color:#929fb1;box-shadow:inset 0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-cyan,.ui-dialog .ibo-is-alternative.ibo-is-cyan.ui-button,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-current,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-close,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-cyan.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:transparent;color:#006164;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-cyan:hover,.ui-dialog .ibo-is-alternative.ibo-is-cyan.ui-button:hover,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-current:hover,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-close:hover,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-cyan.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:#c9eef2;color:#006164;box-shadow:0px 2px 0px #c9eef2}.ibo-button.ibo-is-alternative.ibo-is-cyan:active,.ui-dialog .ibo-is-alternative.ibo-is-cyan.ui-button:active,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-current:active,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-close:active,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-cyan.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:#c9eef2;color:#006164;box-shadow:inset 0px 2px 0px #00838f , 0px 2px 0px #c9eef2}.ibo-button.ibo-is-alternative.ibo-is-cyan:disabled,.ui-dialog .ibo-is-alternative.ibo-is-cyan.ui-button:disabled,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-current:disabled,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-close:disabled,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-cyan.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:transparent;color:#929fb1;box-shadow:inset 0px 2px 0px transparent}.ibo-button,.ui-dialog .ui-button,.ui-datepicker-current,.ui-datepicker-close{position:relative;display:inline-block;padding:6px 9px;border:0;border-radius:4px;cursor:pointer;text-transform:uppercase;white-space:nowrap}.ibo-button.ibo-action-button,.ui-dialog .ibo-action-button.ui-button,.ibo-action-button.ui-datepicker-current,.ibo-action-button.ui-datepicker-close{float:right}.ibo-button .ibo-button--loading-icon,.ui-dialog .ui-button .ibo-button--loading-icon,.ui-datepicker-current .ibo-button--loading-icon,.ui-datepicker-close .ibo-button--loading-icon{display:none}.ibo-button.ibo-is-loading .ibo-button--icon,.ui-dialog .ibo-is-loading.ui-button .ibo-button--icon,.ibo-is-loading.ui-datepicker-current .ibo-button--icon,.ibo-is-loading.ui-datepicker-close .ibo-button--icon{display:none}.ibo-button.ibo-is-loading .ibo-button--loading-icon,.ui-dialog .ibo-is-loading.ui-button .ibo-button--loading-icon,.ibo-is-loading.ui-datepicker-current .ibo-button--loading-icon,.ibo-is-loading.ui-datepicker-close .ibo-button--loading-icon{display:inline-block}.ibo-button.ibo-is-loading .ibo-button--loading-icon+.ibo-button--label,.ui-dialog .ibo-is-loading.ui-button .ibo-button--loading-icon+.ibo-button--label,.ibo-is-loading.ui-datepicker-current .ibo-button--loading-icon+.ibo-button--label,.ibo-is-loading.ui-datepicker-close .ibo-button--loading-icon+.ibo-button--label{margin-left:4px}.ibo-button--icon+.ibo-button--label{margin-left:4px}.ibo-button--vertical-align{margin-top:4px;margin-bottom:4px}.ibo-button-group{display:inline-flex;flex-wrap:nowrap}.ibo-button-group .ibo-button,.ibo-button-group .ui-dialog .ui-button,.ui-dialog .ibo-button-group .ui-button,.ibo-button-group .ui-datepicker-current,.ibo-button-group .ui-datepicker-close{position:relative}.ibo-button-group .ibo-button:first-child,.ibo-button-group .ui-dialog .ui-button:first-child,.ui-dialog .ibo-button-group .ui-button:first-child,.ibo-button-group .ui-datepicker-current:first-child,.ibo-button-group .ui-datepicker-close:first-child{border-radius:4px 0 0 4px}.ibo-button-group .ibo-button:last-child,.ibo-button-group .ui-dialog .ui-button:last-child,.ui-dialog .ibo-button-group .ui-button:last-child,.ibo-button-group .ui-datepicker-current:last-child,.ibo-button-group .ui-datepicker-close:last-child{border-radius:0 4px 4px 0}.ibo-button-group .ibo-button:not(:first-child):not(:last-child),.ibo-button-group .ui-dialog .ui-button:not(:first-child):not(:last-child),.ui-dialog .ibo-button-group .ui-button:not(:first-child):not(:last-child),.ibo-button-group .ui-datepicker-current:not(:first-child):not(:last-child),.ibo-button-group .ui-datepicker-close:not(:first-child):not(:last-child){border-radius:0}.ibo-button-group .ibo-button+.ibo-button,.ibo-button-group .ui-dialog .ui-button+.ibo-button,.ibo-button-group .ui-dialog .ui-dialog .ui-button+.ui-button,.ui-dialog .ibo-button-group .ui-dialog .ui-button+.ui-button,.ibo-button-group .ui-dialog .ui-button+.ui-datepicker-current,.ibo-button-group .ui-dialog .ui-button+.ui-datepicker-close,.ui-dialog .ibo-button-group .ui-button+.ibo-button,.ibo-button-group .ui-datepicker-current+.ibo-button,.ibo-button-group .ui-dialog .ui-datepicker-current+.ui-button,.ui-dialog .ibo-button-group .ui-datepicker-current+.ui-button,.ibo-button-group .ui-datepicker-current+.ui-datepicker-current,.ibo-button-group .ui-datepicker-current+.ui-datepicker-close,.ibo-button-group .ui-datepicker-close+.ibo-button,.ibo-button-group .ui-dialog .ui-datepicker-close+.ui-button,.ui-dialog .ibo-button-group .ui-datepicker-close+.ui-button,.ibo-button-group .ui-datepicker-close+.ui-datepicker-current,.ibo-button-group .ui-datepicker-close+.ui-datepicker-close,.ibo-button-group .ui-dialog .ibo-button+.ui-button,.ui-dialog .ibo-button-group .ibo-button+.ui-button,.ibo-button-group .ibo-button+.ui-datepicker-current,.ibo-button-group .ibo-button+.ui-datepicker-close{margin-left:0}.ibo-button-group .ibo-button+.ibo-button::before,.ibo-button-group .ui-dialog .ui-button+.ibo-button::before,.ui-dialog .ibo-button-group .ui-button+.ibo-button::before,.ibo-button-group .ui-datepicker-current+.ibo-button::before,.ibo-button-group .ui-datepicker-close+.ibo-button::before,.ibo-button-group .ui-dialog .ibo-button+.ui-button::before,.ui-dialog .ibo-button-group .ibo-button+.ui-button::before,.ibo-button-group .ibo-button+.ui-datepicker-current::before,.ibo-button-group .ibo-button+.ui-datepicker-close::before{content:"";position:absolute;top:6px;bottom:6px;left:0;width:1px;border-left:1px solid transparent}.ibo-button-group>*+*.ibo-is-regular.ibo-is-neutral::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-current::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-close::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button.ui-dialog-titlebar-close::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close::before{border-left-color:#d5dde5}.ibo-button-group>*+*.ibo-is-regular.ibo-is-neutral:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button:hover::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:hover::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-current:hover::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-close:hover::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button.ui-dialog-titlebar-close:hover::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover::before{border-left-color:#d5dde5}.ibo-button-group>*+*.ibo-is-regular.ibo-is-neutral:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button:active::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:active::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-current:active::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-close:active::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button.ui-dialog-titlebar-close:active::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active::before{border-left-color:#e1e7ec}.ibo-button-group>*+*.ibo-is-regular.ibo-is-neutral:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:disabled::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-current:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button.ui-dialog-titlebar-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled::before{border-left-color:#aebecd}.ibo-button-group>*+*.ibo-is-regular.ibo-is-primary::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button::before,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-current::before,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-close::before{border-left-color:#006164}.ibo-button-group>*+*.ibo-is-regular.ibo-is-primary:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button:hover::before,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-current:hover::before,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-close:hover::before{border-left-color:#006164}.ibo-button-group>*+*.ibo-is-regular.ibo-is-primary:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button:active::before,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-current:active::before,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-close:active::before{border-left-color:#006164}.ibo-button-group>*+*.ibo-is-regular.ibo-is-primary:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button:disabled::before,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-current:disabled::before,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-close:disabled::before{border-left-color:#aebecd}.ibo-button-group>*+*.ibo-is-regular.ibo-is-secondary::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button::before,.ui-dialog .ibo-button-group>*+*.ui-button::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-current::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-close::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-current::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button::before,.ibo-button-group>*+*.ui-datepicker-current::before,.ibo-button-group>*+*.ui-datepicker-current.ui-datepicker-close::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-close::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button::before,.ibo-button-group>*+*.ui-datepicker-close.ui-datepicker-current::before,.ibo-button-group>*+*.ui-datepicker-close::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button::before,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-current::before,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-close::before{border-left-color:#d5dde5}.ibo-button-group>*+*.ibo-is-regular.ibo-is-secondary:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button:hover::before,.ui-dialog .ibo-button-group>*+*.ui-button:hover::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-current:hover::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-close:hover::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-current:hover::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button:hover::before,.ibo-button-group>*+*.ui-datepicker-current:hover::before,.ibo-button-group>*+*.ui-datepicker-current.ui-datepicker-close:hover::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-close:hover::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button:hover::before,.ibo-button-group>*+*.ui-datepicker-close.ui-datepicker-current:hover::before,.ibo-button-group>*+*.ui-datepicker-close:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button:hover::before,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-current:hover::before,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-close:hover::before{border-left-color:#d5dde5}.ibo-button-group>*+*.ibo-is-regular.ibo-is-secondary:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button:active::before,.ui-dialog .ibo-button-group>*+*.ui-button:active::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-current:active::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-close:active::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-current:active::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button:active::before,.ibo-button-group>*+*.ui-datepicker-current:active::before,.ibo-button-group>*+*.ui-datepicker-current.ui-datepicker-close:active::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-close:active::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button:active::before,.ibo-button-group>*+*.ui-datepicker-close.ui-datepicker-current:active::before,.ibo-button-group>*+*.ui-datepicker-close:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button:active::before,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-current:active::before,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-close:active::before{border-left-color:#e1e7ec}.ibo-button-group>*+*.ibo-is-regular.ibo-is-secondary:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-button:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-current:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-close:disabled::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-current:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button:disabled::before,.ibo-button-group>*+*.ui-datepicker-current:disabled::before,.ibo-button-group>*+*.ui-datepicker-current.ui-datepicker-close:disabled::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button:disabled::before,.ibo-button-group>*+*.ui-datepicker-close.ui-datepicker-current:disabled::before,.ibo-button-group>*+*.ui-datepicker-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button:disabled::before,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-current:disabled::before,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-close:disabled::before{border-left-color:#aebecd}.ibo-button-group>*+*.ibo-is-regular.ibo-is-danger::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button::before,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-current::before,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-close::before{border-left-color:#9b2c2c}.ibo-button-group>*+*.ibo-is-regular.ibo-is-danger:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button:hover::before,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-current:hover::before,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-close:hover::before{border-left-color:#9b2c2c}.ibo-button-group>*+*.ibo-is-regular.ibo-is-danger:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button:active::before,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-current:active::before,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-close:active::before{border-left-color:#9b2c2c}.ibo-button-group>*+*.ibo-is-regular.ibo-is-danger:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button:disabled::before,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-current:disabled::before,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-close:disabled::before{border-left-color:#aebecd}.ibo-button-group>*+*.ibo-is-regular.ibo-is-success::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button::before,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-current::before,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-close::before{border-left-color:#33691e}.ibo-button-group>*+*.ibo-is-regular.ibo-is-success:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button:hover::before,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-current:hover::before,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-close:hover::before{border-left-color:#33691e}.ibo-button-group>*+*.ibo-is-regular.ibo-is-success:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button:active::before,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-current:active::before,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-close:active::before{border-left-color:#33691e}.ibo-button-group>*+*.ibo-is-regular.ibo-is-success:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button:disabled::before,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-current:disabled::before,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-close:disabled::before{border-left-color:#aebecd}.ibo-button-group>*+*.ibo-is-regular.ibo-is-red::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button::before,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-current::before,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-close::before{border-left-color:#9b2c2c}.ibo-button-group>*+*.ibo-is-regular.ibo-is-red:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button:hover::before,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-current:hover::before,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-close:hover::before{border-left-color:#9b2c2c}.ibo-button-group>*+*.ibo-is-regular.ibo-is-red:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button:active::before,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-current:active::before,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-close:active::before{border-left-color:#9b2c2c}.ibo-button-group>*+*.ibo-is-regular.ibo-is-red:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button:disabled::before,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-current:disabled::before,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-close:disabled::before{border-left-color:#aebecd}.ibo-button-group>*+*.ibo-is-regular.ibo-is-green::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button::before,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-current::before,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-close::before{border-left-color:#33691e}.ibo-button-group>*+*.ibo-is-regular.ibo-is-green:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button:hover::before,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-current:hover::before,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-close:hover::before{border-left-color:#33691e}.ibo-button-group>*+*.ibo-is-regular.ibo-is-green:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button:active::before,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-current:active::before,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-close:active::before{border-left-color:#33691e}.ibo-button-group>*+*.ibo-is-regular.ibo-is-green:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button:disabled::before,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-current:disabled::before,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-close:disabled::before{border-left-color:#aebecd}.ibo-button-group>*+*.ibo-is-regular.ibo-is-cyan::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button::before,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-current::before,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-close::before{border-left-color:#006164}.ibo-button-group>*+*.ibo-is-regular.ibo-is-cyan:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button:hover::before,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-current:hover::before,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-close:hover::before{border-left-color:#006164}.ibo-button-group>*+*.ibo-is-regular.ibo-is-cyan:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button:active::before,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-current:active::before,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-close:active::before{border-left-color:#006164}.ibo-button-group>*+*.ibo-is-regular.ibo-is-cyan:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button:disabled::before,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-current:disabled::before,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-close:disabled::before{border-left-color:#aebecd}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-neutral::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button.ui-dialog-titlebar-close::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button.ui-dialog-titlebar-close::before{border-left-color:#404b5a}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-neutral:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button.ui-dialog-titlebar-close:hover::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button.ui-dialog-titlebar-close:hover::before{border-left-color:#404b5a}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-neutral:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button.ui-dialog-titlebar-close:active::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button.ui-dialog-titlebar-close:active::before{border-left-color:#404b5a}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-neutral:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button.ui-dialog-titlebar-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button.ui-dialog-titlebar-close:disabled::before{border-left-color:#aebecd}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-primary::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button.ui-dialog-titlebar-close::before{border-left-color:#00838f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-primary:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button.ui-dialog-titlebar-close:hover::before{border-left-color:#404b5a}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-primary:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button.ui-dialog-titlebar-close:active::before{border-left-color:#404b5a}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-primary:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button.ui-dialog-titlebar-close:disabled::before{border-left-color:#aebecd}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-secondary::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button.ui-dialog-titlebar-close::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button::before,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-current::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close::before,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-close::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close::before{border-left-color:#404b5a}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-secondary:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button.ui-dialog-titlebar-close:hover::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:hover::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button:hover::before,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-current:hover::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover::before,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-close:hover::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover::before{border-left-color:#404b5a}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-secondary:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button.ui-dialog-titlebar-close:active::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:active::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button:active::before,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-current:active::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active::before,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-close:active::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active::before{border-left-color:#404b5a}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-secondary:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button.ui-dialog-titlebar-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button:disabled::before,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-current:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled::before,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled::before{border-left-color:#aebecd}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-danger::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button.ui-dialog-titlebar-close::before{border-left-color:#e53e3e}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-danger:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button.ui-dialog-titlebar-close:hover::before{border-left-color:#9b2c2c}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-danger:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button.ui-dialog-titlebar-close:active::before{border-left-color:#9b2c2c}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-danger:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button.ui-dialog-titlebar-close:disabled::before{border-left-color:#aebecd}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-success::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button.ui-dialog-titlebar-close::before{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-success:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button.ui-dialog-titlebar-close:hover::before{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-success:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button.ui-dialog-titlebar-close:active::before{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-success:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button.ui-dialog-titlebar-close:disabled::before{border-left-color:#aebecd}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-red::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button.ui-dialog-titlebar-close::before{border-left-color:#e53e3e}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-red:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button.ui-dialog-titlebar-close:hover::before{border-left-color:#9b2c2c}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-red:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button.ui-dialog-titlebar-close:active::before{border-left-color:#9b2c2c}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-red:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button.ui-dialog-titlebar-close:disabled::before{border-left-color:#aebecd}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-green::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button.ui-dialog-titlebar-close::before{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-green:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button.ui-dialog-titlebar-close:hover::before{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-green:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button.ui-dialog-titlebar-close:active::before{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-green:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button.ui-dialog-titlebar-close:disabled::before{border-left-color:#aebecd}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-cyan::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button.ui-dialog-titlebar-close::before{border-left-color:#00838f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-cyan:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button.ui-dialog-titlebar-close:hover::before{border-left-color:#00838f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-cyan:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button.ui-dialog-titlebar-close:active::before{border-left-color:#00838f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-cyan:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button.ui-dialog-titlebar-close:disabled::before{border-left-color:#aebecd}.ibo-breadcrumbs{position:relative;margin-right:32px}.ibo-breadcrumbs.ibo-is-overflowing{justify-content:right}.ibo-breadcrumbs *{display:flex;align-items:center}.ibo-breadcrumbs--item{color:#404b5a}.ibo-breadcrumbs--item:not(:last-child):hover .ibo-breadcrumbs--item-icon>*{opacity:1;filter:none}.ibo-breadcrumbs--item-icon{margin-right:8px;transition:all 0.1s linear}.ibo-breadcrumbs--item-icon>span{color:#929fb1;opacity:0.6}.ibo-breadcrumbs--item-icon>img{height:auto;max-width:16px;opacity:0.3;filter:grayscale(100%)}.ibo-breadcrumbs--item-label{display:inline;max-width:100px}.ibo-breadcrumbs--item:not(:last-child)::after,.ibo-breadcrumbs--previous-items-list-toggler:not(:last-child)::after{content:"";margin:0 12px;color:#aebecd}.ibo-breadcrumbs--previous-items-list-toggler{margin-right:24px;color:#6e7a8a !important}.ibo-breadcrumbs--previous-items-list-toggler:not(:last-child)::after{position:absolute;right:-24px}.ibo-breadcrumbs--previous-items-list{display:flex;flex-direction:column;align-items:stretch;position:fixed;top:37px;padding:8px 0;background-color:white}.ibo-breadcrumbs--previous-item{color:#404b5a;padding:12px 12px}.ibo-breadcrumbs--previous-item .ibo-breadcrumbs--item-label{max-width:200px}@keyframes ibo-quick-create--drawer--opening{from{top:-310px;box-shadow:none}to{top:100%;box-shadow:0 3px 6px rgba(0, 0, 0, 0.1), 0 10px 20px rgba(0, 0, 0, 0.15)}}.ibo-quick-create{position:relative}.ibo-quick-create.ibo-is-opened .ibo-quick-create--input,.ibo-quick-create.ibo-input-select-icon--menu .ibo-quick-create--input{width:245px}.ibo-quick-create.ibo-is-opened .ibo-quick-create--drawer,.ibo-quick-create.ibo-input-select-icon--menu .ibo-quick-create--drawer{animation-name:ibo-quick-create--drawer--opening;animation-delay:0.1s;animation-duration:0.2s;animation-direction:normal;animation-fill-mode:forwards}.ibo-quick-create--head{background-color:white}.ibo-quick-create--icon{color:#dd6c20;align-self:center;padding:0 16px}.ibo-quick-create--icon:hover{color:#c05621}.ibo-quick-create--icon:active{color:#9c4221}.ibo-quick-create--input{width:0;border:none;transition:all 0.2s ease-in-out}.ibo-quick-create--input.selectize-control.single{position:sticky;display:flex}.ibo-quick-create--input.selectize-control.single .selectize-input,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active{display:flex;background-color:transparent;background-image:none;border:none;box-shadow:none}.ibo-quick-create--input.selectize-control.single .selectize-input>input,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active>input{color:#404b5a;outline:none;border:none}.ibo-quick-create--input.selectize-control.single .selectize-input>input::placeholder,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active>input::placeholder{color:#929fb1}.ibo-quick-create--input.selectize-control.single .selectize-input>input:-ms-input-placeholder,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active>input:-ms-input-placeholder,.ibo-quick-create--input.selectize-control.single .selectize-input>input::-ms-input-placeholder,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active>input::-ms-input-placeholder{color:#929fb1}.ibo-quick-create--input.selectize-control.single .selectize-input>.item,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active>.item{color:#404b5a;line-height:200%}.ibo-quick-create--input.selectize-control.single .selectize-dropdown{background-color:white;border:none;border-radius:0}.ibo-quick-create--drawer{z-index:-1;position:absolute;left:0;right:0;top:-310px;padding:16px 16px;background-color:white;box-shadow:none}.ibo-quick-create--compartment-title{margin-top:8px;margin-bottom:8px;padding-left:32px;overflow-x:hidden;color:#404b5a}.ibo-quick-create--compartment-title>span{position:relative}.ibo-quick-create--compartment-title>span::before,.ibo-quick-create--compartment-title>span::after{content:"";display:inline-block;position:absolute;top:50%;height:1px;width:600px;border-top:1px solid #404b5a}.ibo-quick-create--compartment-title>span::before{right:100%;margin-right:8px}.ibo-quick-create--compartment-title>span::after{left:100%;margin-left:8px}.ibo-quick-create--compartment-content{color:#212934}.ibo-quick-create--compartment-element{display:flex;align-items:center;padding:4px 8px;margin-left:-8px;margin-right:-8px;color:inherit}.ibo-quick-create--compartment-element-image{margin-right:8px;width:20px}.ibo-quick-create--compartment-results--container{position:static;width:100% !important;background:transparent;border:none;box-shadow:none}.ibo-quick-create--compartment-results--element{overflow:unset;max-height:unset}.ibo-quick-create--compartment-results--element>.option{padding:4px 8px;margin-left:-8px;margin-right:-8px;color:inherit}.ibo-quick-create--compartment-results--element>.option.active{background-color:#e1e7ec;border-radius:3px}.ibo-quick-create--compartment-results--element>.option:hover{cursor:pointer}.ibo-quick-create--compartment-results--element>.option .highlight{font-weight:bold}.ibo-quick-create--compartment--placeholder{align-items:center;display:flex;flex-direction:column}.ibo-quick-create--compartment--placeholder-image>svg{width:66%;height:inherit;margin:24px auto 16px auto;display:flex}.ibo-quick-create--compartment--placeholder-hint{text-align:justify;padding:0 8px;color:#6e7a8a}@keyframes ibo-global-search--drawer--opening{from{top:-310px;box-shadow:none}to{top:100%;box-shadow:0 3px 6px rgba(0, 0, 0, 0.1), 0 10px 20px rgba(0, 0, 0, 0.15)}}.ibo-global-search{position:relative}.ibo-global-search.ibo-is-opened .ibo-global-search--input,.ibo-global-search.ibo-input-select-icon--menu .ibo-global-search--input,.ibo-global-search.ibo-is-opened .ibo-global-search--input:hover,.ibo-global-search.ibo-is-opened .ibo-global-search--input:focus,.ibo-global-search.ibo-is-opened .ibo-global-search--input:active,.ibo-global-search.ibo-input-select-icon--menu .ibo-global-search--input:hover,.ibo-global-search.ibo-input-select-icon--menu .ibo-global-search--input:focus,.ibo-global-search.ibo-input-select-icon--menu .ibo-global-search--input:active{padding:8px 8px;width:245px}.ibo-global-search.ibo-is-opened .ibo-global-search--drawer,.ibo-global-search.ibo-input-select-icon--menu .ibo-global-search--drawer{animation-name:ibo-global-search--drawer--opening;animation-delay:0.1s;animation-duration:0.2s;animation-direction:normal;animation-fill-mode:forwards}.ibo-global-search--head{background-color:white}.ibo-global-search--icon{color:#dd6c20;align-self:center;padding:0 16px}.ibo-global-search--icon:hover{color:#c05621}.ibo-global-search--icon:active{color:#9c4221}.ibo-global-search--input,.ibo-global-search--input:hover,.ibo-global-search--input:focus,.ibo-global-search--input:active{padding:0;width:0;color:#404b5a;background-color:transparent;border:none;outline:none;transition:all 0.2s ease-in-out}.ibo-global-search--input::placeholder,.ibo-global-search--input:hover::placeholder,.ibo-global-search--input:focus::placeholder,.ibo-global-search--input:active::placeholder{color:#929fb1}.ibo-global-search--input:-ms-input-placeholder,.ibo-global-search--input:hover:-ms-input-placeholder,.ibo-global-search--input:focus:-ms-input-placeholder,.ibo-global-search--input:active:-ms-input-placeholder,.ibo-global-search--input::-ms-input-placeholder,.ibo-global-search--input:hover::-ms-input-placeholder,.ibo-global-search--input:focus::-ms-input-placeholder,.ibo-global-search--input:active::-ms-input-placeholder{color:#929fb1}.ibo-global-search--drawer{z-index:-1;position:absolute;left:0;right:0;top:-310px;padding:16px 16px;background-color:white;box-shadow:none}.ibo-global-search--compartment-title{margin-bottom:8px;padding-left:32px;overflow-x:hidden;color:#404b5a}.ibo-global-search--compartment-title>span{position:relative}.ibo-global-search--compartment-title>span::before,.ibo-global-search--compartment-title>span::after{content:"";display:inline-block;position:absolute;top:50%;height:1px;width:600px;border-top:1px solid #404b5a}.ibo-global-search--compartment-title>span::before{right:100%;margin-right:8px}.ibo-global-search--compartment-title>span::after{left:100%;margin-left:8px}.ibo-global-search--compartment-content{color:#212934}.ibo-global-search--compartment-element{display:flex;align-items:center;color:inherit}.ibo-global-search--compartment-element:not(:last-child){margin-bottom:8px}.ibo-global-search--compartment-element-image{margin-right:8px;width:20px}.ibo-global-search--compartment--placeholder{align-items:center;display:flex;flex-direction:column}.ibo-global-search--compartment--placeholder-image>svg{width:66%;height:inherit;margin:24px auto 16px auto;display:flex}.ibo-global-search--compartment--placeholder-hint{text-align:justify;padding:0 8px;color:#6e7a8a}.ibo-popover-menu,.ui-menu,.ui-multiselect-menu,.ibo-input-select-icon--menu,.graph_config .toolkit_menu.graph>ul>li ul{display:none;padding:0;background-color:white;border-radius:3px;flex-wrap:wrap;position:absolute}.ibo-popover-menu.ibo-is-opened,.ibo-is-opened.ui-menu,.ui-menu.ibo-input-select-icon--menu,.ibo-is-opened.ui-multiselect-menu,.ui-multiselect-menu.ibo-input-select-icon--menu,.ibo-is-opened.ibo-input-select-icon--menu,.ibo-input-select-icon--menu,.graph_config .toolkit_menu.graph>ul>li ul.ibo-is-opened,.graph_config .toolkit_menu.graph>ul>li ul.ibo-input-select-icon--menu,.ibo-popover-menu.ibo-input-select-icon--menu,.ibo-input-select-icon--menu.ui-menu,.ibo-input-select-icon--menu.ui-multiselect-menu{display:flex;flex-direction:column}.ibo-popover-menu--toggler-visual-hint{margin-left:0.5rem}.ibo-popover-menu--section,.ui-multiselect-checkboxes{display:flex;flex-direction:column;align-self:flex-start;margin:0 0;width:100%;white-space:nowrap;overflow:hidden}.ibo-popover-menu--section:first-child,.ui-multiselect-checkboxes:first-child{border-radius:3px 3px 0 0}.ibo-popover-menu--section:last-child,.ui-multiselect-checkboxes:last-child{border-radius:0 0 3px 3px}.ibo-popover-menu--item,.ui-menu-item,.ui-multiselect-checkboxes li,.ibo-input-select-icon--menu--item,.graph_config .toolkit_menu.graph>ul>li ul li{padding:12px 24px 12px 16px;color:#212934}.ibo-popover-menu--item a,.ui-menu-item a,.ui-menu-item .ibo-quick-create--compartment-results--element>.option:hover,.ui-multiselect-checkboxes li a,.ui-multiselect-checkboxes li .ibo-quick-create--compartment-results--element>.option:hover,.ibo-input-select-icon--menu--item a,.ibo-input-select-icon--menu--item .ibo-quick-create--compartment-results--element>.option:hover,.graph_config .toolkit_menu.graph>ul>li ul li a,.graph_config .toolkit_menu.graph>ul>li ul li .ibo-quick-create--compartment-results--element>.option:hover,.ibo-popover-menu--item .ibo-quick-create--compartment-results--element>.option:hover{color:#212934}.ibo-popover-menu--item:hover,.ui-menu-item:hover,.ui-multiselect-checkboxes li:hover,.ibo-input-select-icon--menu--item:hover,.graph_config .toolkit_menu.graph>ul>li ul li:hover{background-color:#e1e7ec;color:inherit}.ibo-popover-menu--item.ibo-popover-menu--item-separator,.ibo-popover-menu--item-separator.ui-menu-item,.ui-menu-item.ui-autocomplete-category,.ui-multiselect-checkboxes li.ibo-popover-menu--item-separator,.ui-multiselect-checkboxes li.ui-autocomplete-category,.ibo-popover-menu--item-separator.ibo-input-select-icon--menu--item,.ibo-input-select-icon--menu--item.ui-autocomplete-category,.graph_config .toolkit_menu.graph>ul>li ul li.ibo-popover-menu--item-separator,.graph_config .toolkit_menu.graph>ul>li ul li.ui-autocomplete-category,.ibo-popover-menu--item.ui-autocomplete-category,.ui-autocomplete-category.ui-menu-item,.ui-autocomplete-category.ibo-input-select-icon--menu--item{padding:0;margin:0;background-color:#e1e7ec}.ibo-popover-menu--item--icon{padding-right:5px;color:#6e7a8a;font-size:1.33rem}#ibo-navigation-menu--notifications-menu{flex-flow:column;min-width:min(550px, 90vw);max-width:90vw}#ibo-navigation-menu--notifications-menu .ibo-navigation-menu--notifications--messages-section{overflow:auto}.ibo-navigation-menu--notifications--show-all-messages,.ibo-navigation-menu--notifications-dismiss-all,.ibo-navigation-menu--notifications-show-all-multiple{overflow-x:inherit;text-align:center;min-height:45px}.ibo-navigation-menu--notifications--item--image{max-width:20px;max-height:20px;margin:0 6px;border-radius:100%}.ibo-navigation-menu--notifications--item--image[src=""]{display:none}.ibo-navigation-menu--notifications--item--image:not([src=""])~.ibo-navigation-menu--notifications--item--image{display:none}.ibo-navigation-menu--notifications--item--bottom-text{display:flex;flex-direction:column;align-items:center;float:right;align-self:center;margin-left:auto;margin-right:auto}.ibo-navigation-menu--notifications--item--content{flex-grow:1;padding:0 14px;max-height:128px;overflow-y:auto;white-space:normal}.ibo-navigation-menu--notifications--item--content img{max-height:100px;padding:5px}.ibo-navigation-menu--notifications-item{display:flex;flex-direction:row;cursor:pointer}.ibo-navigation-menu--notifications--item--new-message-indicator{width:13px;height:13px;background-color:white;border:solid 2px #aebecd;border-radius:100%;margin-top:4px;flex-shrink:0}.ibo-navigation-menu--notifications--item--new-message-indicator.ibo-is-priority-1{background-color:#fce8e8;border:solid 2px #f56565}.ibo-navigation-menu--notifications--item--new-message-indicator.ibo-is-priority-2{background-color:floralwhite;border:solid 2px #ea7d1e}.ibo-navigation-menu--notifications--item--new-message-indicator.ibo-is-priority-3{background-color:#ebf8ff;border:solid 2px #429ae1}.ibo-navigation-menu--notifications--item--new-message-indicator.ibo-is-priority-4{background-color:white;border:solid 2px #aebecd}.ibo-navigation-menu--notifications-show-all-multiple~.ibo-popover-menu .ibo-navigation-menu--notifications--item--new-message-indicator,.ibo-navigation-menu--notifications-show-all-multiple~.ui-menu .ibo-navigation-menu--notifications--item--new-message-indicator,.ibo-navigation-menu--notifications-show-all-multiple~.ui-multiselect-menu .ibo-navigation-menu--notifications--item--new-message-indicator,.ibo-navigation-menu--notifications-show-all-multiple~.ibo-input-select-icon--menu .ibo-navigation-menu--notifications--item--new-message-indicator,.graph_config .toolkit_menu.graph>ul>li .ibo-navigation-menu--notifications-show-all-multiple~ul .ibo-navigation-menu--notifications--item--new-message-indicator{display:inline-block;margin-right:15px}.ibo-navigation-menu--notifications-dismiss-all--icon{margin:0 10px 0 0}.ibo-popover-menu--item--no-message{text-align:center}.ibo-popover-menu--item--no-message--image>svg{max-width:220px;height:inherit;padding:15px}.ibo-panel.ibo-has-sticky-header>.ibo-panel--header .ibo-panel--title,.ibo-panel.ibo-has-sticky-header>.ibo-object-summary--header .ibo-panel--title,.ibo-panel.ibo-has-sticky-header>.ibo-panel--header .ibo-panel--subtitle,.ibo-panel.ibo-has-sticky-header>.ibo-object-summary--header .ibo-panel--subtitle,.ibo-panel.ibo-has-sticky-header>.ibo-panel--header .ibo-panel--icon,.ibo-panel.ibo-has-sticky-header>.ibo-object-summary--header .ibo-panel--icon,.ibo-panel.ibo-has-sticky-header>.ibo-panel--header .ibo-panel--titles,.ibo-panel.ibo-has-sticky-header>.ibo-object-summary--header .ibo-panel--titles,.ibo-object-details.ibo-has-sticky-header>.ibo-panel--header .ibo-panel--header-left,.ibo-object-details.ibo-has-sticky-header>.ibo-object-summary--header .ibo-panel--header-left{transition:all 0.15s linear}.ibo-panel{--ibo-main-color: #929fb1;position:relative}.ibo-panel.ibo-has-icon>.ibo-panel--header .ibo-panel--titles,.ibo-panel.ibo-has-icon>.ibo-object-summary--header .ibo-panel--titles{padding-left:16px}.ibo-panel.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header .ibo-panel--header-left,.ibo-panel.ibo-has-icon.ibo-has-medallion-icon>.ibo-object-summary--header .ibo-panel--header-left{position:relative;z-index:1;margin-left:16px}.ibo-panel.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header .ibo-panel--header-left .ibo-panel--icon,.ibo-panel.ibo-has-icon.ibo-has-medallion-icon>.ibo-object-summary--header .ibo-panel--header-left .ibo-panel--icon{position:absolute;bottom:-24px;left:0;overflow:hidden;width:72px;height:72px;min-width:72px;min-height:72px;background-color:#f8f9fa;border:2px solid #90a4ae;border-radius:100%}.ibo-panel.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header .ibo-panel--header-left .ibo-panel--titles,.ibo-panel.ibo-has-icon.ibo-has-medallion-icon>.ibo-object-summary--header .ibo-panel--header-left .ibo-panel--titles{padding-left:calc(72px + 16px)}.ibo-panel.ibo-is-selectable .ibo-panel--body::after{content:" ";background-color:transparent;cursor:pointer;position:absolute;display:flex;align-items:center;justify-content:center;height:100%;width:100%;z-index:3;font-size:7rem}.ibo-panel.ibo-is-selectable:hover .ibo-panel--body::after{content:"";color:#f8f9fa;background-color:rgba(146, 159, 177, 0.4);display:flex}.ibo-panel.ibo-is-selected .ibo-panel--body::after{content:"";color:#f8f9fa;background-color:rgba(33, 41, 52, 0.5);display:flex}.ibo-panel.ibo-is-selected:hover .ibo-panel--body::after{background-color:rgba(110, 122, 138, 0.5);display:flex}.ibo-panel--header,.ibo-object-summary--header{position:relative;z-index:2;display:flex;justify-content:space-between;align-items:flex-end;margin-bottom:4px}.ibo-panel--header-left{justify-content:left}.ibo-panel--icon{width:48px;height:48px;min-width:48px;min-height:48px}.ibo-panel--icon-background{width:100%;height:100%;background-position:center;background-repeat:no-repeat;background-size:contain}.ibo-panel--icon-background--must-contain{background-size:contain}.ibo-panel--icon-background--must-cover{background-size:cover}.ibo-panel--icon-background--must-zoomout{background-size:66.67%}.ibo-panel--title{display:inline-block;color:#212934;flex-grow:1}.ibo-panel--subtitle{display:flex;color:#404b5a}.ibo-panel--body{position:relative;z-index:1;padding:32px 16px 24px 16px;background-color:white;border:1px solid #ccd4db;border-radius:5px;overflow:hidden}.ibo-panel--body::before{position:absolute;top:0;left:0;display:block;background-color:var(--ibo-main-color);content:"";width:100%;height:8px;padding-bottom:8px}.ibo-panel.ibo-is-primary>.ibo-panel--body::before{background-color:#dd6c20}.ibo-panel.ibo-is-secondary>.ibo-panel--body::before,.ui-dialog .ibo-panel.ui-button>.ibo-panel--body::before,.ibo-panel.ui-datepicker-current>.ibo-panel--body::before,.ibo-panel.ui-datepicker-close>.ibo-panel--body::before{background-color:#929fb1}.ibo-panel.ibo-is-neutral>.ibo-panel--body::before,.ui-dialog .ibo-panel.ui-button.ui-dialog-titlebar-close>.ibo-panel--body::before{background-color:#929fb1}.ibo-panel.ibo-is-information>.ibo-panel--body::before{background-color:#3182ce}.ibo-panel.ibo-is-success>.ibo-panel--body::before{background-color:#7cb342}.ibo-panel.ibo-is-failure>.ibo-panel--body::before{background-color:#e53e3e}.ibo-panel.ibo-is-warning>.ibo-panel--body::before{background-color:#dd6c20}.ibo-panel.ibo-is-danger>.ibo-panel--body::before{background-color:#e53e3e}.ibo-panel.ibo-is-grey>.ibo-panel--body::before{background-color:#929fb1}.ibo-panel.ibo-is-blue-grey>.ibo-panel--body::before{background-color:#546e7a}.ibo-panel.ibo-is-blue>.ibo-panel--body::before{background-color:#2c5382}.ibo-panel.ibo-is-cyan>.ibo-panel--body::before{background-color:#00aac1}.ibo-panel.ibo-is-green>.ibo-panel--body::before{background-color:#7cb342}.ibo-panel.ibo-is-orange>.ibo-panel--body::before{background-color:#dd6c20}.ibo-panel.ibo-is-red>.ibo-panel--body::before{background-color:#e53e3e}.ibo-panel.ibo-is-pink>.ibo-panel--body::before{background-color:#d53f8c}.ibo-panel--collapsible-toggler{display:inline-block;margin-right:8px;font-size:1.5rem;color:#6e7a8a;cursor:pointer}.ibo-panel .ibo-panel--collapsible-toggler--opened{display:block}.ibo-panel .ibo-panel--collapsible-toggler--closed{display:none}.ibo-panel:not(.ibo-is-opened) .ibo-panel--collapsible-toggler--closed{display:block}.ibo-panel:not(.ibo-is-opened) .ibo-panel--collapsible-toggler--opened{display:none}.ibo-panel:not(.ibo-is-opened) .ibo-panel--body{display:none}.ibo-panel.ibo-has-sticky-header>.ibo-panel--header,.ibo-panel.ibo-has-sticky-header>.ibo-object-summary--header{position:sticky;top:0;border:transparent;transition-property:all, top, background-color;transition-duration:0.15s, 0s, 0s;transition-timing-function:linear}.ibo-panel.ibo-has-sticky-header>.ibo-panel--header.ibo-is-sticking,.ibo-panel.ibo-has-sticky-header>.ibo-is-sticking.ibo-object-summary--header{padding-top:4px;padding-bottom:4px;background-color:#f8f9fa;border:1px solid #ccd4db;align-items:center}.ibo-panel.ibo-has-sticky-header>.ibo-panel--header.ibo-is-sticking .ibo-panel--title,.ibo-panel.ibo-has-sticky-header>.ibo-is-sticking.ibo-object-summary--header .ibo-panel--title{font-size:1.17rem}.ibo-panel.ibo-has-sticky-header>.ibo-panel--header.ibo-is-sticking .ibo-panel--subtitle,.ibo-panel.ibo-has-sticky-header>.ibo-is-sticking.ibo-object-summary--header .ibo-panel--subtitle{font-size:1rem}.ibo-panel.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header,.ibo-panel.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-object-summary--header{}.ibo-panel.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header.ibo-is-sticking .ibo-panel--icon,.ibo-panel.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-is-sticking.ibo-object-summary--header .ibo-panel--icon{bottom:-12px;width:48px;height:48px;min-width:48px;min-height:48px;border:1px solid #ccd4db}.ibo-panel.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header.ibo-is-sticking .ibo-panel--titles,.ibo-panel.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-is-sticking.ibo-object-summary--header .ibo-panel--titles{padding-left:calc(48px + 16px)}.ibo-collapsible-section--header{display:flex;align-items:stretch}.ibo-collapsible-section.ibo-is-opened .ibo-collapsible-section--minimize-button,.ibo-collapsible-section.ibo-input-select-icon--menu .ibo-collapsible-section--minimize-button{display:block}.ibo-collapsible-section.ibo-is-opened .ibo-collapsible-section--maximize-button,.ibo-collapsible-section.ibo-input-select-icon--menu .ibo-collapsible-section--maximize-button{display:none}.ibo-collapsible-section:not(.ibo-is-opened) .ibo-collapsible-section--minimize-button{display:none}.ibo-collapsible-section:not(.ibo-is-opened) .ibo-collapsible-section--maximize-button{display:block}.ibo-collapsible-section:not(.ibo-is-opened) .ibo-collapsible-section--body{display:none}.ibo-collapsible-section .ibo-collapsible-section--header{cursor:pointer}.ibo-collapsible-section .ibo-collapsible-section--header:hover i{opacity:0.8}.ibo-collapsible-section .ibo-collapsible-section--header .ibo-collapsible-section--action-button{align-self:center}.ibo-collapsible-section .ibo-collapsible-section--header .ibo-collapsible-section--action-button.ibo-collapsible-section--maximize-button,.ibo-collapsible-section .ibo-collapsible-section--header .ibo-collapsible-section--action-button.ibo-collapsible-section--minimize-button{color:#6e7a8a;margin-right:8px}.ibo-collapsible-section .ibo-collapsible-section--header .ibo-collapsible-section--title{color:#212934;flex-grow:1}.ibo-collapsible-section .ibo-collapsible-section--body{position:relative;padding:24px 16px 16px;background-color:white;border:solid 1px #ccd4db;border-radius:5px;overflow:hidden}.ibo-modal{display:flex;flex-direction:column;max-height:90vh !important;max-width:90vw !important}.ibo-modal.ibo-is-extra-small{height:calc(min(20vh, 150px)) !important;width:calc(min(20vw, 200px)) !important}.ibo-modal.ibo-is-small{height:calc(min(60vh, 400px)) !important;width:calc(min(60vw, 800px)) !important}.ibo-modal.ibo-is-medium{height:calc(min(75vh, 600px)) !important;width:calc(min(75vw, 1200px)) !important}.ibo-modal.ibo-is-large{height:calc(min(90vh, 900px)) !important;width:calc(min(90vw, 1800px)) !important}.ibo-modal-option--do-not-show-again{margin-top:16px}.ibo-modal-option--do-not-show-again .ibo-modal-option--do-not-show-again--checkbox{height:auto;display:inline-block;width:auto}.ibo-modal.ibo-is-informative{align-items:center;min-width:384px;min-height:24px !important}.ibo-modal.ibo-is-informative::before{display:block;position:absolute;top:0;left:0;content:"";width:4px;height:100%}.ibo-modal.ibo-is-informative.ibo-is-error::before{background-color:#e53e3e}.ibo-modal.ibo-is-informative.ibo-is-warning::before{background-color:#dd6c20}.ibo-modal.ibo-is-informative.ibo-is-information::before{background-color:#3182ce}.ibo-modal.ibo-is-informative.ibo-is-success::before{background-color:#7cb342}.ibo-dashlet{position:relative;width:calc(100% - 24px);margin:calc(24px / 2) calc(24px / 2)}.ibo-dashlet.dashlet-selected{position:relative}.ibo-dashlet--is-inline{width:auto}.ibo-dashlet-blocker{position:absolute;z-index:9;top:0;left:0;width:100%;height:100%;cursor:not-allowed}:root{--ibo-dashlet-badge--min-width: 200px;--ibo-dashlet-badge--padding-x: 16px;--ibo-dashlet-badge--padding-y: 16px;--ibo-dashlet-badge--background-color: white;--ibo-dashlet-badge--border: 1px solid #ccd4db;--ibo-dashlet-badge--border-radius: 5px}.ibo-dashlet-badge{max-width:350px;flex-basis:200px;flex-grow:1;flex-shrink:1;padding:16px 16px;background-color:white;border:1px solid #ccd4db;border-radius:5px}.ibo-dashlet-badge--body{display:flex;justify-items:left;align-items:center}.ibo-dashlet-badge--icon-container{margin-right:16px}.ibo-dashlet-badge--icon{width:48px;min-width:48px;max-height:48px}.ibo-dashlet-badge--actions{flex-grow:1;overflow-x:hidden}.ibo-dashlet-badge--action-list{color:inherit}.ibo-dashlet-badge--action-list-count{margin-right:8px}.ibo-dashlet-badge--action-list-label{display:inline-block}.ibo-dashlet-badge--action-create-icon{margin-right:8px}.ibo-dashlet-badge--body--tooltip-title{margin-bottom:16px}.ibo-dashlet-header-static{padding:16px 16px 0 16px;overflow-x:hidden}.ibo-dashlet-header-static--body{position:relative;display:inline-flex;justify-items:left;align-items:center;margin-left:48px;color:#212934}.ibo-dashlet-header-static--body::before,.ibo-dashlet-header-static--body::after{content:"";position:absolute;top:50%;width:10000px;height:1px;border-bottom:2px solid #ccd4db}.ibo-dashlet-header-static--body::before{right:calc(100% + 16px)}.ibo-dashlet-header-static--body::after{left:calc(100% + 16px)}.ibo-dashlet-header-static--icon-container{margin-right:16px}.ibo-dashlet-header-static--icon{width:48px;min-width:48px;max-height:48px}.ibo-dashlet-header-dynamic--container{display:flex;flex-wrap:wrap}.ibo-dashlet-header-dynamic--count{margin-right:10px}.ibo-input,.ui-autocomplete-input,.ui-multiselect,.dataTables_length select,.ui_tpicker_hour_slider>select,.ui_tpicker_minute_slider>select,.ui_tpicker_second_slider>select,select.ibo-input-select-placeholder,.ibo-datatableconfig--attributes-panel--per-page--input,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper input[type="text"]{height:30px;width:100%;background-color:white;color:#212934;padding:0 10px;border:1px solid #aebecd;border-radius:3px}.ibo-input:focus,.ui-autocomplete-input:focus,.ui-multiselect:focus,.dataTables_length select:focus,.ui_tpicker_hour_slider>select:focus,.ui_tpicker_minute_slider>select:focus,.ui_tpicker_second_slider>select:focus,select.ibo-input-select-placeholder:focus,.ibo-datatableconfig--attributes-panel--per-page--input:focus,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"]:focus,.search_form_handler .sf_filter .sff_input_wrapper input[type="text"]:focus{border-color:#dd6c20}.ibo-input:disabled,.ui-autocomplete-input:disabled,.ui-multiselect:disabled,.dataTables_length select:disabled,.ui_tpicker_hour_slider>select:disabled,.ui_tpicker_minute_slider>select:disabled,.ui_tpicker_second_slider>select:disabled,select.ibo-input-select-placeholder:disabled,.ibo-datatableconfig--attributes-panel--per-page--input:disabled,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"]:disabled,.search_form_handler .sf_filter .sff_input_wrapper input[type="text"]:disabled{background-color:#d5dde5;color:#929fb1}.ibo-input::placeholder,.ui-autocomplete-input::placeholder,.ui-multiselect::placeholder,.dataTables_length select::placeholder,.ui_tpicker_hour_slider>select::placeholder,.ui_tpicker_minute_slider>select::placeholder,.ui_tpicker_second_slider>select::placeholder,select.ibo-input-select-placeholder::placeholder,.ibo-datatableconfig--attributes-panel--per-page--input::placeholder,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"]::placeholder,.search_form_handler .sf_filter .sff_input_wrapper input[type="text"]::placeholder{color:#929fb1}textarea.ibo-input,textarea.ui-autocomplete-input,textarea.ui-multiselect,textarea.ibo-datatableconfig--attributes-panel--per-page--input{height:unset}.ibo-input-wrapper.is-error .ibo-input,.is-error.ui_tpicker_hour_slider .ibo-input,.is-error.ui_tpicker_hour_slider .ui-autocomplete-input,.is-error.ui_tpicker_hour_slider .ui-multiselect,.is-error.ui_tpicker_hour_slider .dataTables_length select,.dataTables_length .is-error.ui_tpicker_hour_slider select,.is-error.ui_tpicker_hour_slider .ui_tpicker_hour_slider>select,.is-error.ui_tpicker_hour_slider .ui_tpicker_minute_slider>select,.is-error.ui_tpicker_hour_slider .ui_tpicker_second_slider>select,.is-error.ui_tpicker_hour_slider select.ibo-input-select-placeholder,.is-error.ui_tpicker_hour_slider .ibo-datatableconfig--attributes-panel--per-page--input,.is-error.ui_tpicker_hour_slider .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .is-error.ui_tpicker_hour_slider input[type="text"],.is-error.ui_tpicker_hour_slider .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .is-error.ui_tpicker_hour_slider input[type="text"],.is-error.ui_tpicker_minute_slider .ibo-input,.is-error.ui_tpicker_minute_slider .ui-autocomplete-input,.is-error.ui_tpicker_minute_slider .ui-multiselect,.is-error.ui_tpicker_minute_slider .dataTables_length select,.dataTables_length .is-error.ui_tpicker_minute_slider select,.is-error.ui_tpicker_minute_slider .ui_tpicker_hour_slider>select,.is-error.ui_tpicker_minute_slider .ui_tpicker_minute_slider>select,.is-error.ui_tpicker_minute_slider .ui_tpicker_second_slider>select,.is-error.ui_tpicker_minute_slider select.ibo-input-select-placeholder,.is-error.ui_tpicker_minute_slider .ibo-datatableconfig--attributes-panel--per-page--input,.is-error.ui_tpicker_minute_slider .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .is-error.ui_tpicker_minute_slider input[type="text"],.is-error.ui_tpicker_minute_slider .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .is-error.ui_tpicker_minute_slider input[type="text"],.is-error.ui_tpicker_second_slider .ibo-input,.is-error.ui_tpicker_second_slider .ui-autocomplete-input,.is-error.ui_tpicker_second_slider .ui-multiselect,.is-error.ui_tpicker_second_slider .dataTables_length select,.dataTables_length .is-error.ui_tpicker_second_slider select,.is-error.ui_tpicker_second_slider .ui_tpicker_hour_slider>select,.is-error.ui_tpicker_second_slider .ui_tpicker_minute_slider>select,.is-error.ui_tpicker_second_slider .ui_tpicker_second_slider>select,.is-error.ui_tpicker_second_slider select.ibo-input-select-placeholder,.is-error.ui_tpicker_second_slider .ibo-datatableconfig--attributes-panel--per-page--input,.is-error.ui_tpicker_second_slider .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .is-error.ui_tpicker_second_slider input[type="text"],.is-error.ui_tpicker_second_slider .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .is-error.ui_tpicker_second_slider input[type="text"],.ibo-input-wrapper.is-error .ui-autocomplete-input,.ibo-input-wrapper.is-error .ui-multiselect,.ibo-input-wrapper.is-error .dataTables_length select,.dataTables_length .ibo-input-wrapper.is-error select,.ibo-input-wrapper.is-error .ui_tpicker_hour_slider>select,.ibo-input-wrapper.is-error .ui_tpicker_minute_slider>select,.ibo-input-wrapper.is-error .ui_tpicker_second_slider>select,.ibo-input-wrapper.is-error select.ibo-input-select-placeholder,.ibo-input-wrapper.is-error .ibo-datatableconfig--attributes-panel--per-page--input,.ibo-input-wrapper.is-error .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .ibo-input-wrapper.is-error input[type="text"],.ibo-input-wrapper.is-error .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .ibo-input-wrapper.is-error input[type="text"],.ibo-input-wrapper.is-error .ibo-input-vanilla,.is-error.ui_tpicker_hour_slider .ibo-input-vanilla,.is-error.ui_tpicker_minute_slider .ibo-input-vanilla,.is-error.ui_tpicker_second_slider .ibo-input-vanilla,.ibo-input-wrapper.is-error .ck-editor,.is-error.ui_tpicker_hour_slider .ck-editor,.is-error.ui_tpicker_minute_slider .ck-editor,.is-error.ui_tpicker_second_slider .ck-editor,.ibo-input-wrapper.is-error textarea,.is-error.ui_tpicker_hour_slider textarea,.is-error.ui_tpicker_minute_slider textarea,.is-error.ui_tpicker_second_slider textarea,.ibo-input-field-wrapper.is-error .ibo-input,.ibo-input-field-wrapper.is-error .ui-autocomplete-input,.ibo-input-field-wrapper.is-error .ui-multiselect,.ibo-input-field-wrapper.is-error .dataTables_length select,.dataTables_length .ibo-input-field-wrapper.is-error select,.ibo-input-field-wrapper.is-error .ui_tpicker_hour_slider>select,.ibo-input-field-wrapper.is-error .ui_tpicker_minute_slider>select,.ibo-input-field-wrapper.is-error .ui_tpicker_second_slider>select,.ibo-input-field-wrapper.is-error select.ibo-input-select-placeholder,.ibo-input-field-wrapper.is-error .ibo-datatableconfig--attributes-panel--per-page--input,.ibo-input-field-wrapper.is-error .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .ibo-input-field-wrapper.is-error input[type="text"],.ibo-input-field-wrapper.is-error .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .ibo-input-field-wrapper.is-error input[type="text"],.ibo-input-field-wrapper.is-error .ibo-input-vanilla,.ibo-input-field-wrapper.is-error .ck-editor,.ibo-input-field-wrapper.is-error textarea{border-color:#e53e3e}.ibo-input-wrapper.is-error .ibo-input-vanilla input,.is-error.ui_tpicker_hour_slider .ibo-input-vanilla input,.is-error.ui_tpicker_minute_slider .ibo-input-vanilla input,.is-error.ui_tpicker_second_slider .ibo-input-vanilla input,.ibo-input-field-wrapper.is-error .ibo-input-vanilla input{border:0;background-color:rgba(255, 255, 255, 0)}input.ibo-input-vanilla{width:unset;display:initial}.ibo-input-wrapper--with-buttons,.ibo-input-select-wrapper--with-buttons{position:relative;display:flex}.ibo-field-validation{color:#c53030}.file-input{display:block;position:relative}.ibo-input--label-right{margin-right:4px;display:inline}.ibo-input--label-left{margin-left:4px;display:inline}.disabled{background-color:#d5dde5}.ibo-input-checkbox{height:16px;width:auto}.ibo-input-date-wrapper{position:relative}.ibo-input-date{display:inline-block;width:100%}.ibo-input-date+button{position:absolute;display:inline-block;margin-left:-20px;margin-top:5px;padding:0;background-color:transparent;color:#404b5a;border:none}.ibo-input-datetime-wrapper{position:relative}.ibo-input-datetime{display:inline-block;width:100%}.ibo-input-datetime--action-button{position:absolute;display:inline-block;margin-left:-20px;margin-top:5px;padding:0;color:#404b5a}.ui_tpicker_hour_slider>select,.ui_tpicker_minute_slider>select,.ui_tpicker_second_slider>select{width:auto;padding-right:18px}.ibo-input-duration{display:inline-block;width:unset;text-align:right}.ibo-input-image{display:flex;justify-content:flex-start;align-items:flex-start}.ibo-input-image--image-view{position:relative;overflow:hidden;min-height:96px;background-color:#e1e7ec;border-radius:5px}.ibo-input-image--image-view img[src=""],.ibo-input-image--image-view img[src="null"]{visibility:hidden}.ibo-input-image--image-view input[type="file"]{position:absolute;top:0;bottom:0;left:0;right:0;width:100%;opacity:0}.ibo-input-image--edit-buttons{display:flex;flex-direction:column;margin-left:0.5rem}.ibo-input-image--edit-buttons .ibo-button+.ibo-button,.ibo-input-image--edit-buttons .ui-dialog .ui-button+.ibo-button,.ibo-input-image--edit-buttons .ui-dialog .ui-dialog .ui-button+.ui-button,.ui-dialog .ibo-input-image--edit-buttons .ui-dialog .ui-button+.ui-button,.ibo-input-image--edit-buttons .ui-dialog .ui-button+.ui-datepicker-current,.ibo-input-image--edit-buttons .ui-dialog .ui-button+.ui-datepicker-close,.ui-dialog .ibo-input-image--edit-buttons .ui-button+.ibo-button,.ibo-input-image--edit-buttons .ui-datepicker-current+.ibo-button,.ibo-input-image--edit-buttons .ui-dialog .ui-datepicker-current+.ui-button,.ui-dialog .ibo-input-image--edit-buttons .ui-datepicker-current+.ui-button,.ibo-input-image--edit-buttons .ui-datepicker-current+.ui-datepicker-current,.ibo-input-image--edit-buttons .ui-datepicker-current+.ui-datepicker-close,.ibo-input-image--edit-buttons .ui-datepicker-close+.ibo-button,.ibo-input-image--edit-buttons .ui-dialog .ui-datepicker-close+.ui-button,.ui-dialog .ibo-input-image--edit-buttons .ui-datepicker-close+.ui-button,.ibo-input-image--edit-buttons .ui-datepicker-close+.ui-datepicker-current,.ibo-input-image--edit-buttons .ui-datepicker-close+.ui-datepicker-close,.ibo-input-image--edit-buttons .ui-dialog .ibo-button+.ui-button,.ui-dialog .ibo-input-image--edit-buttons .ibo-button+.ui-button,.ibo-input-image--edit-buttons .ibo-button+.ui-datepicker-current,.ibo-input-image--edit-buttons .ibo-button+.ui-datepicker-close{margin-top:0.5rem;margin-left:0}.ibo-input-richtext-placeholder{height:192px;width:100%;visibility:hidden}.ibo-input-select,.ui-multiselect,.ui_tpicker_hour_slider>select,.ui_tpicker_minute_slider>select,.ui_tpicker_second_slider>select,select.ibo-input-select-placeholder{display:inline-flex;min-width:50px;appearance:none}.ibo-input-select.ibo-input-selectize,.ibo-input-selectize.ui-multiselect,.ui_tpicker_hour_slider>select.ibo-input-selectize,.ui_tpicker_minute_slider>select.ibo-input-selectize,.ui_tpicker_second_slider>select.ibo-input-selectize,select.ibo-input-selectize.ibo-input-select-placeholder{padding-right:0;padding-left:0;min-width:150px !important}.ibo-input-select.ibo-input-selectize input,.ibo-input-selectize.ui-multiselect input,.ui_tpicker_hour_slider>select.ibo-input-selectize input,.ui_tpicker_minute_slider>select.ibo-input-selectize input,.ui_tpicker_second_slider>select.ibo-input-selectize input,select.ibo-input-selectize.ibo-input-select-placeholder input{border-width:0;color:inherit;border-color:white;padding-left:10px}.ibo-input-select.ibo-input-selectize>[data-value],.ibo-input-selectize.ui-multiselect>[data-value],.ui_tpicker_hour_slider>select.ibo-input-selectize>[data-value],.ui_tpicker_minute_slider>select.ibo-input-selectize>[data-value],.ui_tpicker_second_slider>select.ibo-input-selectize>[data-value],select.ibo-input-selectize.ibo-input-select-placeholder>[data-value]{height:100%;line-height:30px;padding-left:10px}.ibo-input-select[size],.ui-multiselect[size],.ui_tpicker_hour_slider>select[size],.ui_tpicker_minute_slider>select[size],.ui_tpicker_second_slider>select[size],select.ibo-input-select-placeholder[size]{height:auto}.ibo-input-select[multiple],.ui-multiselect[multiple],.ui_tpicker_hour_slider>select[multiple],.ui_tpicker_minute_slider>select[multiple],.ui_tpicker_second_slider>select[multiple],select.ibo-input-select-placeholder[multiple]{padding-left:unset;padding-right:unset}.ibo-input-select[multiple] option,.ui-multiselect[multiple] option,.ui_tpicker_hour_slider>select[multiple] option,.ui_tpicker_minute_slider>select[multiple] option,.ui_tpicker_second_slider>select[multiple] option,select.ibo-input-select-placeholder[multiple] option{padding:4px 10px}.ibo-input-select-autocomplete{min-width:150px !important;text-overflow:ellipsis}.ibo-input-selectize{min-width:150px !important}.ibo-input-selectize>div{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ibo-input-selectize>input{background-color:unset;border:unset}.ibo-input-selectize>input:focus{outline:none !important}.ibo-input-selectize.input-active{border:1px solid #dd6c20}.ibo-input-select-wrapper,.ui_tpicker_hour_slider,.ui_tpicker_minute_slider,.ui_tpicker_second_slider{position:relative}.ibo-input-select-wrapper--with-buttons .selectize-control{display:grid;width:100%}.ibo-input-select-wrapper::after,.ui_tpicker_hour_slider::after,.ui_tpicker_minute_slider::after,.ui_tpicker_second_slider::after{position:absolute;z-index:1;content:"";font-family:"Font Awesome 5 Free";font-weight:600;height:28px;margin-left:-16px;margin-top:1px;padding-top:3px;background-color:inherit;color:#212934;pointer-events:none}.ibo-input-select-container{display:flex}.ibo-input-select-wrapper--with-buttons:not(.ibo-input-select-autocomplete-wrapper)::after{position:absolute;z-index:1;content:"";font-family:"Font Awesome 5 Free";font-weight:600;cursor:pointer;right:8px;height:28px;margin-left:-16px;margin-top:1px;padding-top:3px;background-color:inherit;color:#212934;pointer-events:none}.ibo-input-select--action-buttons{position:absolute;z-index:1;display:flex;height:28px;margin-top:0;margin-right:3px;font-size:1rem;background-color:inherit;color:#404b5a;padding:0 2px;text-align:right;bottom:0;top:0;right:0}.ibo-input-select-wrapper .ibo-input-select--action-buttons,.ui_tpicker_hour_slider .ibo-input-select--action-buttons,.ui_tpicker_minute_slider .ibo-input-select--action-buttons,.ui_tpicker_second_slider .ibo-input-select--action-buttons{margin-right:20px}.ibo-input-select--action-button{display:flex;align-items:center;padding-left:6px;padding-right:2px;float:right}.selectize-dropdown.ui-autocomplete,.selectize-dropdown.set-dropdown,.selectize-dropdown.plugin-custom_itop{z-index:2000;max-height:50vh;max-width:50em;overflow-y:auto}.selectize-dropdown-content{max-height:50vh}.selectize-dropdown.ui-menu .ui-state-active{margin:unset;background-color:#ebf8ff;color:#404b5a}.ibo-input-select--autocomplete-item,.ibo-input-select--notification-item{display:flex;justify-content:left;align-items:center}.ibo-input-select--autocomplete-item-image{width:30px;height:30px;min-width:30px;min-height:30px;background-position:center center;background-size:100%;border-radius:100%;margin-right:0.7rem;background-color:#ebf8ff;border:1px solid #929fb1}.ibo-input-select--autocomplete-item-image.ibo-is-not-medallion{border:unset;border-radius:0;background-color:unset}.ibo-input-select-icon{display:inline-flex;text-align:left}.ibo-input-select-icon>img{max-height:100%;max-width:100%;padding-right:4px}.ibo-input-select-icon>span{overflow:hidden}.ibo-input-select-icon--menu{position:absolute;z-index:21;max-height:300px;overflow-x:hidden;overflow-y:auto;flex-wrap:nowrap}.ibo-input-select-icon--menu--item>*{width:100%;white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis}.ibo-input-select-icon--menu--item>*>.ibo-input-select-icon--menu--icon{max-width:100%;max-height:100%;margin-right:10px}.ibo-input-one-way-password-wrapper>*:not(first-child){margin-top:6px}.ibo-input-set{flex-wrap:wrap;height:auto;min-height:30px}.ibo-input-set>input{height:auto}.ibo-input-set .item[data-value]>.remove{font-size:18px;padding-top:0.15em;border-left:none}.attribute-set .attribute-set-item,.selectize-control.multi .selectize-input.ibo-input-set .attribute-set-item,.selectize-control.multi .ibo-quick-create--input.selectize-control.single .ibo-input-set.selectize-input.input-active .attribute-set-item,.ibo-quick-create--input.selectize-control.single .selectize-control.multi .ibo-input-set.selectize-input.input-active .attribute-set-item{display:inline-flex;margin-top:1px;margin-right:0;margin-bottom:1px;padding:4px 6px;max-width:360px;background:white none;border:none;border-radius:3px;box-shadow:0 1px 1px rgba(0, 0, 0, 0.15), 0 0 1px 1px rgba(241, 241, 241, 0.7);color:#212934;text-shadow:none}.attribute-set .attribute-set-item:not(:first-child),.selectize-control.multi .selectize-input.ibo-input-set .attribute-set-item:not(:first-child),.selectize-control.multi .ibo-quick-create--input.selectize-control.single .ibo-input-set.selectize-input.input-active .attribute-set-item:not(:first-child),.ibo-quick-create--input.selectize-control.single .selectize-control.multi .ibo-input-set.selectize-input.input-active .attribute-set-item:not(:first-child){margin-left:3px}.attribute-set.history-added .attribute-set-item{font-weight:bold}.attribute-set.history-removed .attribute-set-item{text-decoration:line-through;font-style:italic}.selectize-control.multi .selectize-input.ibo-input-set,.selectize-control.multi .ibo-quick-create--input.selectize-control.single .ibo-input-set.selectize-input.input-active,.ibo-quick-create--input.selectize-control.single .selectize-control.multi .ibo-input-set.selectize-input.input-active{padding:0 8px}.ibo-input-text,textarea{width:100%;min-height:12rem;padding:10px 12px}.ibo-input-text.ibo-is-code,textarea.ibo-is-code{background-color:white}.ibo-input-text--export{width:100%;min-height:15em}.ibo-toggler--wrapper{position:relative;display:inline-block;width:36px;height:20px;vertical-align:baseline}.ibo-toggler--wrapper .ibo-toggler{display:none}.ibo-toggler--slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;border-radius:16px;background-color:#929fb1;transition:0.4s}.ibo-toggler--slider:before{content:"";position:absolute;left:3px;bottom:3px;height:15px;width:15px;border-radius:100%;background-color:#f8f9fa;transition:0.4s}.ibo-toggler--wrapper input:checked+.ibo-toggler--slider{background-color:#dd6c20}.ibo-toggler--wrapper input:disabled+.ibo-toggler--slider{background-color:#e1e7ec}.ibo-toggler--wrapper input:checked:disabled+.ibo-toggler--slider{background-color:#feebc8}input:focus+.ibo-toggler--slider{box-shadow:0 0 1px #dd6c20}input:checked+.ibo-toggler--slider:before{transform:translateX(14.5px)}label~.ibo-toggler--wrapper{margin-left:4px}.ibo-pill.ibo-is-new{color:#2a4265;background-color:#ebf8ff}.ibo-pill.ibo-is-neutral,.ui-dialog .ibo-pill.ui-button.ui-dialog-titlebar-close{color:#2a4265;background-color:#ebf8ff}.ibo-pill.ibo-is-waiting{color:#9c4221;background-color:floralwhite}.ibo-pill.ibo-is-success{color:#33691e;background-color:#dcedc8}.ibo-pill.ibo-is-failure{color:#9b2c2c;background-color:#fce8e8}.ibo-pill.ibo-is-frozen{color:#6e7a8a;background-color:#f8f9fa}.ibo-pill.ibo-is-active{color:#33691e;background-color:#dcedc8}.ibo-pill.ibo-is-inactive{color:#9c4221;background-color:floralwhite}.ibo-pill{--ibo-main-color--100: #ebf8ff;--ibo-main-color--900: #2a4265;max-width:240px;margin-top:4px;margin-bottom:4px;padding:6px 10px;border-radius:3px;color:var(--ibo-main-color--900);background-color:var(--ibo-main-color--100)}.ibo-pill:hover,.ibo-pill:active{color:inherit}.ibo-prop--apply{width:calc(32px + 12px);padding-left:12px}.ibo-prop--apply.ui-state-error:after{color:#404b5a;content:"";vertical-align:bottom}.ibo-prop--apply.ui-state-error>span{display:none !important}.ibo-prop--cancel{width:calc(32px + 8px);padding-left:8px}.ibo-prop--apply,.ibo-prop--cancel{height:28px}.ibo-prop--apply>span,.ibo-prop--cancel>span{display:block;height:28px;width:32px;text-align:center}.ibo-prop--apply>span>div,.ibo-prop--cancel>span>div{display:inline-flex;justify-content:center;align-items:center;width:100%;height:100%}.ibo-spinner.ibo-is-inline{display:inline-block}.ibo-spinner.ibo-is-inline>*{display:inline-block}.ibo-spinner.ibo-is-small,.ibo-spinner.ibo-is-medium,.ibo-spinner.ibo-is-large{display:flex;flex-direction:column}.ibo-spinner.ibo-is-small>.ibo-spinner--icon,.ibo-spinner.ibo-is-medium>.ibo-spinner--icon,.ibo-spinner.ibo-is-large>.ibo-spinner--icon{align-self:center;color:#929fb1}.ibo-spinner.ibo-is-small>.ibo-spinner--description,.ibo-spinner.ibo-is-medium>.ibo-spinner--description,.ibo-spinner.ibo-is-large>.ibo-spinner--description{align-self:center;color:#404b5a}.ibo-spinner.ibo-is-small>.ibo-spinner--description{margin-top:4px}.ibo-spinner.ibo-is-medium>.ibo-spinner--description{margin-top:8px}.ibo-spinner.ibo-is-large>.ibo-spinner--description{margin-top:16px}.ibo-title{color:#212934;padding:12px 0}.ibo-title--icon{width:90px;height:90px;min-width:90px;min-height:90px;overflow:hidden}.ibo-title--icon>.ibo-title--icon-level-2{width:80px;height:80px;min-width:80px;min-height:80px}.ibo-title--icon>.ibo-title--icon-level-3{width:70px;height:70px;min-width:70px;min-height:70px}.ibo-title--icon-background{width:100%;height:100%;background-position:center;background-repeat:no-repeat;background-size:contain}.ibo-title--icon-background--must-contain{background-size:contain}.ibo-title--icon-background--must-cover{background-size:cover}.ibo-title--icon-background--must-zoomout{background-size:66.67%}.ibo-title--subtitle{margin-top:2px;margin-bottom:2px;flex-wrap:wrap}.ibo-title-for-dashlet{padding-top:2em}.ibo-title-for-dashlet--content{background-color:white;border-radius:5px;border:1px solid;border-color:#ccd4db;padding-bottom:1em}.ibo-title-separator{border-radius:5px 5px 0 0;border-color:#3182ce;color:#3182ce;background-color:#3182ce;border:3px solid;margin:0;padding:0}:root{--ibo-datatable-panel--table-spacing: 48px}.ibo-datatable--toolbar{display:flex;justify-content:space-between;align-items:center;padding:0 6px;color:#404b5a}.ibo-datatable--toolbar:first-child{margin-bottom:18px}.ibo-datatable--toolbar:not(:first-child){margin-top:18px}.ibo-datatable--toolbar-left>*:not(:first-child),.ibo-datatable--toolbar-right>*:not(:first-child){margin-left:1rem}.ibo-datatable-header{color:#212934}.ibo-datatable-panel>.ibo-panel--body{padding:32px 0 24px}.ibo-datatable--selection-validation-buttons-toolbar{clear:both;margin-top:10px}.ibo-list-column{max-height:150px;overflow-y:auto}.ibo-sort-order::after{color:#dd6c20}.ibo-sort-order.ibo-is-descending::after{content:""}.ibo-sort-order.ibo-is-ascending::after{content:""}.ibo-sort-order.ibo-is-none::after{content:""}.itop-fieldsorter>.selected{background-color:#bee3f8}.ibo-datatable tbody>tr{transition:background-color 300ms linear}.ibo-datatable tbody>tr:hover,.ibo-datatable tbody>tr.selected:hover{cursor:pointer;background-color:#feebc8}.ibo-datatable tbody>tr.selected{background-color:#fbd38d}.ibo-datatable tbody>tr .ibo-datatable--row-actions-toolbar{justify-content:end}.ibo-datatable tbody>tr>[data-attribute-type="AttributeHTML"],.ibo-datatable tbody>tr>[data-attribute-type="AttributeText"],.ibo-datatable tbody>tr>[data-attribute-type="AttributeLongText"]{max-width:100%;overflow:auto}.ibo-datatable--selected-count,.ibo-datatable--result-count{padding-right:0.2em;padding-left:0.1em}.ibo-datatable[data-status="loading"]{margin-top:18px}.ibo-datatable[data-status="loading"] td,.ibo-datatable[data-status="loading"] th{position:relative;padding:10px 12px}.ibo-datatable[data-status="loading"] tr:nth-child(even){background-color:#f2f2f2}.ibo-datatable[data-status="loading"] th{border-bottom:1px solid #ccd4db}.ibo-datatableconfig--attributes-panel .ibo-multi-column .ibo-column:first-child{margin:8px 0;max-height:150px;overflow-y:scroll}.ibo-datatableconfig--attributes-panel--per-page--input{margin:0 4px;max-width:4em;display:initial}.ibo-datatableconfig--settings-panel .ibo-panel--body{display:flex;flex-direction:row}.ibo-datatableconfig--settings-panel--options-container{flex-grow:1}.ibo-datatableconfig--settings-panel--option{display:flex;flex-direction:row;align-items:first baseline;margin-right:4px}.ibo-prop-header{padding-bottom:14px}.ibo-fieldset~.ibo-fieldset:not(.ibo-column),fieldset~.ibo-fieldset:not(.ibo-column),.ibo-fieldset~fieldset:not(.ibo-column){margin-top:48px}.ibo-multi-column~.ibo-fieldset,.ibo-multi-column~fieldset{margin-top:48px}.ibo-fieldset-legend,.ibo-dashboard-editor--properties-subtitle,.ibo-dashboard--available-dashlet--title,.ibo-dashlet--properties--title,legend{width:100%;margin-bottom:16px;padding-bottom:4px;border-bottom:2px solid #aebecd}.ibo-field{}.ibo-field:not([data-attribute-type="AttributeBlob"], [data-attribute-type="AttributeFile"], [data-attribute-type="AttributeImage"], [data-attribute-type="AttributeCustomFields"], [data-attribute-type="AttributeTagSet"], [data-attribute-type="AttributeEnumSet"], [data-attribute-type="AttributeLinkedSet"], [data-attribute-type="AttributeLinkedSetIndirect"], [data-attribute-type="AttributeClassAttCodeSet"], [data-attribute-type="AttributeQueryAttCodeSet"], .ibo-input-file-select--container){}.ibo-field:not([data-attribute-type="AttributeBlob"], [data-attribute-type="AttributeFile"], [data-attribute-type="AttributeImage"], [data-attribute-type="AttributeCustomFields"], [data-attribute-type="AttributeTagSet"], [data-attribute-type="AttributeEnumSet"], [data-attribute-type="AttributeLinkedSet"], [data-attribute-type="AttributeLinkedSetIndirect"], [data-attribute-type="AttributeClassAttCodeSet"], [data-attribute-type="AttributeQueryAttCodeSet"], .ibo-input-file-select--container) .ibo-field--value{word-break:break-word;white-space:inherit}.ibo-field:not([data-attribute-type="AttributeBlob"], [data-attribute-type="AttributeFile"], [data-attribute-type="AttributeImage"], [data-attribute-type="AttributeCustomFields"], [data-attribute-type="AttributeTagSet"], [data-attribute-type="AttributeEnumSet"], [data-attribute-type="AttributeLinkedSet"], [data-attribute-type="AttributeLinkedSetIndirect"], [data-attribute-type="AttributeClassAttCodeSet"], [data-attribute-type="AttributeQueryAttCodeSet"], .ibo-input-file-select--container) .ibo-field--value *:not(input, select, textarea){word-break:break-word;white-space:inherit}.ibo-field:not([data-attribute-type="AttributeBlob"], [data-attribute-type="AttributeFile"], [data-attribute-type="AttributeImage"], [data-attribute-type="AttributeCustomFields"], [data-attribute-type="AttributeTagSet"], [data-attribute-type="AttributeEnumSet"], [data-attribute-type="AttributeLinkedSet"], [data-attribute-type="AttributeLinkedSetIndirect"], [data-attribute-type="AttributeClassAttCodeSet"], [data-attribute-type="AttributeQueryAttCodeSet"], .ibo-input-file-select--container) .ibo-field--value pre{white-space:break-spaces}.ibo-field[data-attribute-type="AttributeImage"]>.ibo-field--value{display:grid}.ibo-field[data-attribute-type="AttributeImage"]>.ibo-field--value>span{display:inherit}.ibo-field[data-attribute-type="AttributeHTML"][data-attribute-flag-read-only="true"],.ibo-field[data-attribute-type="AttributeText"][data-attribute-flag-read-only="true"],.ibo-field[data-attribute-type="AttributeLongText"][data-attribute-flag-read-only="true"]{display:grid}.ibo-field[data-attribute-type="AttributeHTML"][data-attribute-flag-read-only="true"]>.ibo-field--value,.ibo-field[data-attribute-type="AttributeText"][data-attribute-flag-read-only="true"]>.ibo-field--value,.ibo-field[data-attribute-type="AttributeLongText"][data-attribute-flag-read-only="true"]>.ibo-field--value{max-width:100%;overflow:auto}.ibo-field-large{display:block}.ibo-field-large .ibo-field--label{position:relative;display:flex;align-items:center;max-width:initial;width:100%}.ibo-field-large .ibo-field-small .ibo-field--label{display:table-cell;vertical-align:top;padding-right:10px;min-width:100px;max-width:145px;width:30%}.ibo-field-large .ibo-field--value{margin-top:2px}.ibo-field-large .ibo-field--value>*{--ibo-scrollbar--scrollbar-track-background-color: #f2f2f2}.ibo-field-large.ibo-is-fullscreen{background-color:white}.ibo-field-large.ibo-is-fullscreen .ibo-field--label{position:fixed;width:100%;min-width:initial;max-width:initial;padding:4px 8px;background-color:#f8f9fa;border-bottom:1px solid #ccd4db}.ibo-field-large.ibo-is-fullscreen .ibo-field--value{padding:36px 8px 4px 8px}.ibo-field-large.ibo-is-fullscreen .ibo-field--value>*{height:initial !important;width:initial !important}.ibo-field-small{display:table;width:100%}.ibo-field-small .ibo-field--label{display:table-cell;vertical-align:top;padding-right:10px}.ibo-field--fullscreen-toggler{width:20px;height:20px;border-radius:5px;cursor:pointer}.ibo-field--fullscreen-toggler:hover{background-color:#f2f2f2}.ibo-field--label{min-width:100px;max-width:145px;width:30%;word-break:break-word}.ibo-field--label-small .ibo-field--label{width:20em}.ibo-field--value{width:100%;color:#404b5a}.ibo-field--value .HTML table{table-layout:fixed;width:100%}.ibo-field--label>.ibo-field--comments{flex:auto}.ibo-fieldset-legend>.ibo-field--comments,.ibo-dashboard-editor--properties-subtitle>.ibo-field--comments,.ibo-dashboard--available-dashlet--title>.ibo-field--comments,.ibo-dashlet--properties--title>.ibo-field--comments,legend>.ibo-field--comments{padding-bottom:2px;font-size:1.17rem}.ibo-field--comments{display:table-cell;vertical-align:top;width:5em}.ibo-field--comments>input[type="checkbox"]{margin-left:5px;float:right}.ibo-field--comments>.multi_values,.ibo-field--comments>.mono_value,.ibo-field--comments>.ibo-field--comments--synchro{float:right}.mailto,.tel{white-space:nowrap}.mailto .text_decoration,.tel .text_decoration{margin-right:0.5rem;font-size:0.9em}.object-ref-icon.text_decoration,.object-ref-icon-disabled.text_decoration{margin-right:0.5rem}.ibo-field--enable-bulk,.ibo-field--comments--synchro{display:inline;padding:2px 5px;margin:0 0 0 5px;height:calc(100% - 5px);border-radius:5px;font-weight:bold;white-space:nowrap}.ibo-field--enable-bulk--checkbox{margin-left:8px}.ibo-toolbar{display:flex;align-items:center}.ibo-toolbar.ibo-toolbar--action{position:relative}.ibo-toolbar.ibo-toolbar--button{margin-top:16px}.ibo-toolbar-spacer{flex-grow:1}.ibo-toolbar-vertical-separator{display:inline-flex;border-right:1px solid #aebecd;width:1px;height:16px;margin:0 0.75rem}.search_box{box-sizing:border-box;position:relative;z-index:1100;text-align:center}.search_box *{box-sizing:border-box}.search_form_handler{}.search_form_handler input[type="text"],.search_form_handler select{padding:1px 2px}.search_form_handler:not(.closed) .sf_title .sft_short{display:none}.search_form_handler:not(.closed) .sf_title .sft_toggler{transform:rotateX(180deg);transition:transform 0.5s linear}.search_form_handler.closed{margin-bottom:0.5em;width:150px;overflow:hidden;border-radius:4px}.search_form_handler.closed .sf_criterion_area{height:0;opacity:0;padding:0}.search_form_handler.closed .sf_title{padding:6px 8px;text-align:center;font-size:12px}.search_form_handler.closed .sf_title .sft_long{display:none}.search_form_handler.closed .sf_title .sft_hint,.search_form_handler.closed .sf_title .sfobs_hint{display:none}.search_form_handler:not(.no_auto_submit) .sft_hint{display:none}.search_form_handler:not(.no_auto_submit) .sfc_fg_apply{display:none}.search_form_handler.no_auto_submit .sfc_fg_search{display:none}.search_form_handler.no_auto_submit .sft_hint{display:inline-block}.search_form_handler:not(.hide_obsolete_data) .sfobs_hint{display:none}.search_form_handler.hide_obsolete_data .sfobs_hint{display:inline-block}.search_form_handler.hide_obsolete_data.no_auto_submit .sfobs_hint{margin-left:30px}.search_form_handler .sf_message{display:none;margin:8px 8px 0 8px;border-radius:0px}.search_form_handler .sf_criterion_area{padding:8px 8px 3px 8px}.search_form_handler .sf_criterion_area .sf_criterion_row:not(:first-child){margin-top:20px}.search_form_handler .sf_criterion_area .sf_criterion_row:not(:first-child)::before{content:"";position:absolute;top:-12px;left:0px;width:100%;border-top:1px solid #e1e7ec}.search_form_handler .sf_criterion_area .sf_criterion_row:not(:first-child)::after{content:"or";position:absolute;top:-20px;left:8px;padding-left:5px;padding-right:5px;color:#929fb1;background-color:white}.search_form_handler .sf_criterion_area .sf_criterion_row .sf_criterion_group{display:inline}.search_form_handler .sf_criterion_area .sf_criterion_row .sf_criterion_group .sfc_fg_button,.search_form_handler .sf_criterion_area .sf_criterion_row .sf_criterion_group .sfc_header{border:1px solid #d5dde5;border-radius:3px}.search_form_handler .sf_criterion_area .search_form_criteria,.search_form_handler .sf_criterion_area .sf_more_criterion,.search_form_handler .sf_criterion_area .sf_button{position:relative;display:inline-block;margin-right:10px;margin-top:3px;margin-bottom:3px;vertical-align:top}.search_form_handler .sf_criterion_area .search_form_criteria.opened,.search_form_handler .sf_criterion_area .sf_more_criterion.opened,.search_form_handler .sf_criterion_area .sf_button.opened{margin-bottom:0}.search_form_handler .sf_criterion_area .search_form_criteria.opened .sfc_header,.search_form_handler .sf_criterion_area .search_form_criteria.opened .sfm_header,.search_form_handler .sf_criterion_area .sf_more_criterion.opened .sfc_header,.search_form_handler .sf_criterion_area .sf_more_criterion.opened .sfm_header,.search_form_handler .sf_criterion_area .sf_button.opened .sfc_header,.search_form_handler .sf_criterion_area .sf_button.opened .sfm_header{border-bottom:none !important;padding-bottom:13px}.search_form_handler .sf_criterion_area .search_form_criteria>*,.search_form_handler .sf_criterion_area .sf_more_criterion>*,.search_form_handler .sf_criterion_area .sf_button>*{padding:7px 8px;vertical-align:top;border:solid 1px #d5dde5;border-radius:3px}.search_form_handler .sf_criterion_area .search_form_criteria .sfm_content,.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_content,.search_form_handler .sf_criterion_area .sf_button .sfm_content{position:absolute;z-index:-1;min-width:100%;left:0px;margin-top:-1px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_fg_buttons,.search_form_handler .sf_criterion_area .search_form_criteria .sfm_buttons,.search_form_handler .sf_criterion_area .sf_more_criterion .sfc_fg_buttons,.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_buttons,.search_form_handler .sf_criterion_area .sf_button .sfc_fg_buttons,.search_form_handler .sf_criterion_area .sf_button .sfm_buttons{white-space:nowrap}.search_form_handler .sf_criterion_area .sf_more_criterion,.search_form_handler .sf_criterion_area .sf_button{min-width:34px;text-align:center}.search_form_handler .sf_criterion_area .search_form_criteria{}.search_form_handler .sf_criterion_area .search_form_criteria.locked{background-color:#d5dde5}.search_form_handler .sf_criterion_area .search_form_criteria.locked .sfc_title{user-select:none;cursor:initial}.search_form_handler .sf_criterion_area .search_form_criteria.draft .sfc_header,.search_form_handler .sf_criterion_area .search_form_criteria.draft .sfc_form_group{border-style:dashed;border-color:#929fb1}.search_form_handler .sf_criterion_area .search_form_criteria.draft .sfc_title{font-style:italic}.search_form_handler .sf_criterion_area .search_form_criteria.opened{z-index:1}.search_form_handler .sf_criterion_area .search_form_criteria.opened .sfc_toggle{transform:rotateX(-180deg)}.search_form_handler .sf_criterion_area .search_form_criteria.opened .sfc_form_group{display:block;margin-top:-1px;z-index:-1}.search_form_handler .sf_criterion_area .search_form_criteria.opened_left .sfc_form_group{left:auto;right:0px}.search_form_handler .sf_criterion_area .search_form_criteria:not(:last-of-type){margin-right:12px}.search_form_handler .sf_criterion_area .search_form_criteria>*{background-color:#f2f2f2;color:#212934}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_toggle,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_close{position:absolute;top:7px;color:#dd6c20}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_locked{position:absolute;top:9px;color:#aebecd}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_toggle{display:inline-block;right:23px;transition:all 0.3s ease-in-out}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_close,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_locked{right:7px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_title{max-width:240px;padding-right:30px;white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis;cursor:pointer}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_title .sfc_values{font-weight:bold}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group{position:absolute;display:none;max-width:450px;width:max-content;max-height:520px;overflow-x:auto;overflow-y:hidden}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators{font-size:12px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator.force_hide{display:none !important}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator>label{line-height:20px;white-space:nowrap}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator>label>*{display:inline-block;vertical-align:middle}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_radio{width:12px;margin:0;margin-right:7px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_name{width:96px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"]{display:unset;width:160px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices label>input{vertical-align:text-top;margin-left:0;margin-right:8px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper{max-height:415px;overflow-y:auto;margin:0 -8px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items .sfc_opc_mc_items_list{text-align:left}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items .sfc_opc_mc_items_list.sfc_opc_mc_items_selected{position:relative;padding-top:5px;margin-top:5px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items .sfc_opc_mc_items_list.sfc_opc_mc_items_selected::before{content:"";position:absolute;border-top:1px solid #d5dde5;width:calc(100% - 12px);margin-left:6px;top:0px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items .sfc_opc_mc_items_list .sfc_opc_mc_placeholder{padding:15px 8px;font-style:italic;text-align:center}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items .sfc_opc_mc_items_list .sfc_opc_mc_item{padding:4px 8px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items .sfc_opc_mc_items_list .sfc_opc_mc_item:hover{background-color:#e1e7ec}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items .sfc_opc_mc_items_list .sfc_opc_mc_item label{display:inline-block;width:100%}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items_hint{margin-top:15px;margin-bottom:15px;padding-left:9px;padding-right:9px;color:#6e7a8a;font-size:10px;font-style:italic}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items_hint>span{margin-right:0.5em;font-style:italic}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_search,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_apply,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_cancel{margin-top:8px;font-size:1rem}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_search,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_apply{margin-right:5px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_more,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_less{position:absolute;bottom:7px;right:0px;cursor:pointer;color:#2c5382;font-size:10px;font-weight:bold;border:none;background-color:transparent}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_more>span,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_less>span{margin-left:3px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operator:not(:first-of-type),.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operator:first-of-type .sfc_op_radio{display:none}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_less{display:none}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_more{display:inline-block}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group.advanced .sfc_fg_operator{margin-bottom:3px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group.advanced .sfc_fg_operator:last-of-type{margin-bottom:0}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group.advanced .sfc_fg_operator:not(:first-of-type),.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group.advanced .sfc_fg_operator:first-of-type .sfc_op_radio{display:inherit}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group.advanced .sfc_fg_less{display:inline-block}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group.advanced .sfc_fg_more{display:none}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group.advanced .hide_on_advanced{display:none}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group:not(.advanced) .hide_on_less{display:none}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_raw>*{border-color:transparent}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_raw .sfc_title{cursor:initial;padding-right:20px}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_raw .sfc_form_group{display:none}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_enum .sfc_form_group .sfc_fg_operator_in>label{display:inline-block;width:100%;line-height:initial;white-space:nowrap}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_enum .sfc_form_group .sfc_fg_operator_in>label .sfc_op_content{width:100%}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_tag_set .sfc_form_group .sfc_fg_operator_in>label{display:inline-block;width:100%;line-height:initial;white-space:nowrap}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_tag_set .sfc_form_group .sfc_fg_operator_in>label .sfc_op_content{width:100%}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_numeric .sfc_fg_operators .sfc_fg_operator.sfc_fg_operator_between .sfc_op_content_from_outer{display:inline}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_numeric .sfc_fg_operators .sfc_fg_operator.sfc_fg_operator_between .sfc_op_content_until_outer{display:inline;margin-left:5px}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_numeric .sfc_fg_operators .sfc_fg_operator.sfc_fg_operator_between label.sfc_op_content_from_label,.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_numeric .sfc_fg_operators .sfc_fg_operator.sfc_fg_operator_between label.sfc_op_content_until_label{width:45px;display:inline-block}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_numeric .sfc_fg_operators .sfc_fg_operator.sfc_fg_operator_between input[type="text"]{width:77px}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date_time .sfc_form_group.advanced .sfc_fg_operator_between,.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date .sfc_form_group.advanced .sfc_fg_operator_between{margin-bottom:5px}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date_time .sfc_fg_operator_between_days input,.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date .sfc_fg_operator_between_days input{width:135px}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date_time button.ui-datepicker-trigger,.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date button.ui-datepicker-trigger{background:none;border:none;height:100%;padding:2px}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date_time button.ui-datepicker-trigger img,.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date button.ui-datepicker-trigger img{vertical-align:middle}.search_form_handler .sf_criterion_area .sf_more_criterion.opened{z-index:2}.search_form_handler .sf_criterion_area .sf_more_criterion.opened .sfm_content{display:inherit}.search_form_handler .sf_criterion_area .sf_more_criterion.opened_left .sfm_content{left:auto;right:0px}.search_form_handler .sf_criterion_area .sf_more_criterion>*{background-color:white;color:#37474f}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_toggler .sfm_tg_title{margin-right:7px}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_toggler .sfm_tg_icon{color:#dd6c20}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_content{display:none;min-width:200px}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_content .sfm_lists{margin:0 -8px;padding:0 8px;max-height:400px;overflow-x:hidden;overflow-y:auto}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_content .sfm_lists .sfl_items>li:hover{background-color:#e1e7ec}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_content .sfm_buttons{display:none}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_content .sfm_buttons button{margin-top:8px;margin-right:5px;padding:3px 6px;font-size:11px}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_content .sfm_buttons button:last-of-type{margin-right:0}.search_form_handler .sf_criterion_area .sf_button{cursor:pointer}.search_form_handler .sf_criterion_area .sf_button>*{background-color:white;color:#dd6c20}.search_form_handler .sf_list:not(:first-of-type) .sfl_title{border-top:1px solid #ccd4db;padding-top:8px;margin-top:5px}.search_form_handler .sf_list .sfl_title{font-weight:bold}.search_form_handler .sf_list .sfl_items{margin:5px -8px 0 -8px;padding:0;text-align:left}.search_form_handler .sf_list .sfl_items>li{padding:4px 8px;list-style:none;white-space:nowrap}.search_form_handler .sf_list .sfl_items>li:hover{background-color:#e1e7ec}.search_form_handler .sf_list .sfl_items>li.sfl_i_placeholder{font-style:italic;opacity:0.8}.search_form_handler .sf_list .sfl_items>li>label{display:inline-block;width:100%}.search_form_handler .sf_list .sfl_items>li>label>*{vertical-align:middle}.search_form_handler .sf_list .sfl_items>li>label>input[type="checkbox"]{margin-left:0;margin-right:8px}.search_form_handler .sf_filter{position:relative;margin-top:8px;margin-bottom:8px}.search_form_handler .sf_filter input,.search_form_handler .sf_filter button,.search_form_handler .sf_filter .sff_picto{vertical-align:middle;height:22px}.search_form_handler .sf_filter input,.search_form_handler .sf_filter button{border:1px solid #ABABAB}.search_form_handler .sf_filter input{width:100% !important}.search_form_handler .sf_filter button{width:23px;background-color:white;color:#dd6c20;font-size:10px}.search_form_handler .sf_filter button:first-of-type{margin-left:5px}.search_form_handler .sf_filter button:not(:first-of-type){border-left:transparent}.search_form_handler .sf_filter .sff_input_wrapper{position:relative}.search_form_handler .sf_filter .sff_input_wrapper input[type="text"]{display:unset}.search_form_handler .sf_filter .sff_input_wrapper .sff_picto{position:absolute;right:7px;top:3px;user-select:none;color:#404b5a}.search_form_handler .sf_filter .sff_input_wrapper .sff_reset{display:none}.search_form_handler .sf_filter .sff_input_wrapper input::-ms-clear{display:none}.search_form_handler .sf_filter.sf_with_buttons input{width:calc(100% - 28px) !important;min-width:120px}.sft_hint,.sfobs_hint,.sft_toggler{margin-left:8px;color:#404b5a}.sf_results_placeholder{margin-top:24px;text-align:center}.sf_results_placeholder button{margin-top:8px}.sf_results_placeholder button>span{margin-right:0.5em}.ibo-search-form-panel{z-index:3;margin-bottom:8px}.ibo-search-form-panel .ibo-panel--body{padding:18px 14px 10px;overflow:initial}.ibo-search-form-panel .ibo-panel--body::before{border-radius:5px 5px 0 0}#ibo-main-content .search_form_handler .sf_criterion_area{padding:0}.sfm_tg_title{display:none}.ibo-criterion-group:empty~.sf_more_criterion .sfm_tg_title{display:unset}.sf_results_area{z-index:1;margin-bottom:300px}.ibo-search-form-panel .ibo-panel--body.ibo-is-sticking{position:fixed;border-radius:0;border-bottom-color:transparent}.ibo-datatable-panel.ibo-is-sticking .ibo-panel--header,.ibo-datatable-panel.ibo-is-sticking .ibo-object-summary--header{z-index:0}.ibo-datatable-panel.ibo-is-sticking .ibo-datatable--toolbar{position:fixed;z-index:2;padding-bottom:4px;background-color:white;border-left:1px solid #ccd4db;border-right:1px solid #ccd4db}.ibo-datatable-panel.ibo-is-sticking .dataTables_scrollHead{position:fixed !important;z-index:2;background-color:white;border-left:1px solid #ccd4db !important;border-right:1px solid #ccd4db !important}.ibo-field-badge{display:inline-flex;align-items:baseline;margin:0;padding:4px 10px;border-radius:3px;background-color:var(--ibo-main-color);color:var(--ibo-complementary-color)}.ibo-field-badge--decoration+.ibo-field-badge--label{margin-left:0.5rem}.ibo-input-file-select--container .ibo-input-file-select .ibo-input-file-select--file-input{display:none}.ibo-input-file-select--container .ibo-input-file-select .ibo-input-file-select--file-name{margin-left:10px}.ibo-medallion-icon{display:flex;padding:13px 0}.ibo-medallion-icon--image{height:48px;width:48px;padding:2px;border-radius:100%;background-color:#bee3f8}.ibo-medallion-icon--description{display:inline-block;padding-left:8px}@keyframes decreaseHighlight{0%{height:100%}8%{border-radius:0 0 0 3px}100%{height:0}}.ibo-toast{display:inline-flex;position:fixed;align-items:center;max-width:calc(50% - 20px);padding:12px 8px 12px 16px;border-radius:3px;box-shadow:0 2px 4px rgba(0, 0, 0, 0.12), 0 3px 6px rgba(0, 0, 0, 0.15);transition:all 0.4s cubic-bezier(0.215, 0.61, 0.355, 1);z-index:2147483647}.ibo-toast::before{display:block;position:absolute;top:0;left:0;content:"";width:4px;height:100%;top:initial;bottom:0;border-radius:3px 0 0 3px}.ibo-toast.ibo-is-auto-closeable::before{animation:decreaseHighlight 5s linear forwards}.ibo-toast:hover::before{animation:none}.ibo-badge{display:inline-block;white-space:nowrap;padding:2px 4px;border-radius:4px}.ibo-badge.ibo-is-primary{background-color:floralwhite;color:#7b341e}.ibo-badge.ibo-is-secondary,.ui-dialog .ibo-badge.ui-button,.ibo-badge.ui-datepicker-current,.ibo-badge.ui-datepicker-close{background-color:#f8f9fa;color:#212934}.ibo-badge.ibo-is-neutral,.ui-dialog .ibo-badge.ui-button.ui-dialog-titlebar-close{background-color:#f8f9fa;color:#212934}.ibo-badge.ibo-is-information{background-color:#ebf8ff;color:#2a4265}.ibo-badge.ibo-is-success{background-color:#dcedc8;color:#33691e}.ibo-badge.ibo-is-failure{background-color:#fce8e8;color:#742a2a}.ibo-badge.ibo-is-warning{background-color:floralwhite;color:#7b341e}.ibo-badge.ibo-is-danger{background-color:#fce8e8;color:#742a2a}.ibo-badge.ibo-is-grey{background-color:#f8f9fa;color:#212934}.ibo-badge.ibo-is-blue-grey{background-color:#cfd8dc;color:#263238}.ibo-badge.ibo-is-blue{background-color:#ebf8ff;color:#2a4265}.ibo-badge.ibo-is-cyan{background-color:#c9eef2;color:#006164}.ibo-badge.ibo-is-green{background-color:#dcedc8;color:#33691e}.ibo-badge.ibo-is-orange{background-color:floralwhite;color:#7b341e}.ibo-badge.ibo-is-red{background-color:#fce8e8;color:#742a2a}.ibo-badge.ibo-is-pink{background-color:#fff5f7;color:#702459}:root{}.ibo-navigation-menu{position:relative;height:100vh}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--square-company-logo{display:none}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--full-company-logo{display:flex}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--silo-selection{display:inline-block}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--silo-visual-hint{display:none}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body{width:310px}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--toggler-bar:nth-child(1){top:4px;left:7px;width:14px;transform:rotateZ(-45deg)}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--toggler-bar:nth-child(2){top:8px;left:7px;width:0;opacity:0}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--toggler-bar:nth-child(3){top:12px;left:7px;width:14px;transform:rotateZ(45deg)}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--menu-group:not(.ibo-is-active):active{border-radius:16px}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part{padding:24px 0 12px}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part .ibo-navigation-menu--notifications .ibo-navigation-menu--notifications-toggler{display:none}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part .ibo-navigation-menu--user-info{height:100%}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part .ibo-navigation-menu--user-info .ibo-navigation-menu--user-welcome-message,.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part .ibo-navigation-menu--user-info .ibo-navigation-menu--user-notifications,.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part .ibo-navigation-menu--user-info .ibo-navigation-menu--user-organization{display:block}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part .ibo-navigation-menu--user-info .ibo-navigation-menu--user-picture{margin-top:-60px;width:72px;height:72px;border:solid 3px #263238}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part .ibo-navigation-menu--user-info .ibo-navigation-menu--user-picture .ibo-navigation-menu--user-picture--image{max-width:72px;max-height:72px}.ibo-navigation-menu.ibo-is-active .ibo-navigation-menu--drawer{right:calc(-1 * 312px)}.ibo-navigation-menu.ibo-is-filtered .ibo-navigation-menu--menu-filter-clear{display:block}.ibo-navigation-menu.ibo-is-filtered .ibo-navigation-menu--menu-nodes{margin-bottom:48px}.ibo-navigation-menu.ibo-is-filtered .ibo-navigation-menu--menu-nodes .ibo-navigation-menu--menu-nodes-title{margin-bottom:8px}.ibo-navigation-menu--body,.ibo-navigation-menu--drawer{height:100vh}.ibo-navigation-menu--body{z-index:1;display:flex;flex-direction:column;justify-content:space-between;align-items:stretch;height:100vh;width:60px;background-color:#263238;transition:width 0.1s ease-in-out}.ibo-navigation-menu--top-part{z-index:2;min-height:120px;padding:12px 16px;overflow:hidden}.ibo-navigation-menu--middle-part{z-index:1;flex-grow:1;overflow-y:auto;padding:24px 16px 16px;scrollbar-width:thin;scrollbar-color:#d5dde5 rgba(255, 255, 255, 0)}.ibo-navigation-menu--middle-part::-webkit-scrollbar{width:5px}.ibo-navigation-menu--middle-part::-webkit-scrollbar-track{background-color:rgba(255, 255, 255, 0)}.ibo-navigation-menu--middle-part::-webkit-scrollbar-thumb{background-color:#d5dde5}.ibo-navigation-menu--bottom-part{z-index:2;padding-top:20px;padding-bottom:16px;height:126px;background-color:#404b5a;justify-content:space-between;flex-direction:column}.ibo-navigation-menu--toggler,.ibo-navigation-menu--menu-group{margin:calc(-1 * 10px) calc(-1 * 8px);padding:10px 8px;border-radius:5px}.ibo-navigation-menu--square-company-logo{display:flex;width:38px;height:38px;margin:0 -5px 44px}.ibo-navigation-menu--square-company-logo>img{object-fit:contain}.ibo-navigation-menu--full-company-logo{display:none;width:310px;height:70px;margin:0 0 12px -16px}.ibo-navigation-menu--full-company-logo>img{object-fit:contain;margin:0 auto}.ibo-navigation-menu--toggler{position:relative;display:inline-flex;width:44px}.ibo-navigation-menu--toggler:hover,.ibo-navigation-menu--toggler:active{background-color:#455a64}.ibo-navigation-menu--toggler:hover .ibo-navigation-menu--toggler-bar,.ibo-navigation-menu--toggler:active .ibo-navigation-menu--toggler-bar{background-color:white}.ibo-navigation-menu--toggler-icon{position:relative;display:flex;height:20px;width:28px}.ibo-navigation-menu--toggler-bar{position:absolute;display:block;height:3px;width:100%;opacity:1;transition:all 0.2s linear;background-color:#d5dde5}.ibo-navigation-menu--toggler-bar:nth-child(1){top:0}.ibo-navigation-menu--toggler-bar:nth-child(2){top:8px}.ibo-navigation-menu--toggler-bar:nth-child(3){top:16px}.ibo-navigation-menu--silo-selection{position:absolute;display:none;width:70%;margin-left:15px}.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ibo-input,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ibo-input,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ui-autocomplete-input,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ui-multiselect,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .dataTables_length select,.dataTables_length .ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider select,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ui_tpicker_hour_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ui_tpicker_minute_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ui_tpicker_second_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider select.ibo-input-select-placeholder,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ibo-datatableconfig--attributes-panel--per-page--input,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider input[type="text"],.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider input[type="text"],.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ibo-input,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ui-autocomplete-input,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ui-multiselect,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .dataTables_length select,.dataTables_length .ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider select,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ui_tpicker_hour_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ui_tpicker_minute_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ui_tpicker_second_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider select.ibo-input-select-placeholder,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ibo-datatableconfig--attributes-panel--per-page--input,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider input[type="text"],.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider input[type="text"],.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ibo-input,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ui-autocomplete-input,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ui-multiselect,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .dataTables_length select,.dataTables_length .ibo-navigation-menu--silo-selection .ui_tpicker_second_slider select,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ui_tpicker_hour_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ui_tpicker_minute_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ui_tpicker_second_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider select.ibo-input-select-placeholder,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ibo-datatableconfig--attributes-panel--per-page--input,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .ibo-navigation-menu--silo-selection .ui_tpicker_second_slider input[type="text"],.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .ibo-navigation-menu--silo-selection .ui_tpicker_second_slider input[type="text"],.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ui-autocomplete-input,.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ui-multiselect,.ibo-navigation-menu--silo-selection .ibo-input-wrapper .dataTables_length select,.dataTables_length .ibo-navigation-menu--silo-selection .ibo-input-wrapper select,.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ui_tpicker_hour_slider>select,.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ui_tpicker_minute_slider>select,.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ui_tpicker_second_slider>select,.ibo-navigation-menu--silo-selection .ibo-input-wrapper select.ibo-input-select-placeholder,.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ibo-datatableconfig--attributes-panel--per-page--input,.ibo-navigation-menu--silo-selection .ibo-input-wrapper .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .ibo-navigation-menu--silo-selection .ibo-input-wrapper input[type="text"],.ibo-navigation-menu--silo-selection .ibo-input-wrapper .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .ibo-navigation-menu--silo-selection .ibo-input-wrapper input[type="text"]{padding-right:38px;overflow:hidden}.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ibo-input-select-autocomplete,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ibo-input-select-autocomplete,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ibo-input-select-autocomplete,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ibo-input-select-autocomplete{padding-right:60px}.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ibo-input-select-autocomplete~.ibo-input-select--action-button--search,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--search,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--search,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--search{margin-left:-42px}.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ibo-input-select-autocomplete~.ibo-input-select--action-button--clear,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--clear,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--clear,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--clear{margin-left:-72px}.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ibo-input-select-autocomplete~.ibo-input-select--action-button--hierarchy,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--hierarchy,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--hierarchy,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--hierarchy{margin-left:-60px}.ibo-navigation-menu--silo-visual-hint{position:absolute;top:2px;right:0;width:16px;height:16px;background-color:#e53e3e;border:2px solid #263238;border-radius:100%}.ibo-navigation-menu--menu-group{display:flex;justify-content:left;align-items:center;white-space:nowrap;overflow-x:hidden;color:#d5dde5;transition-property:background-color, color, padding, margin, border-radius;transition-duration:0.1s;transition-timing-function:linear}.ibo-navigation-menu--menu-group>.ibo-navigation-menu--menu-group-icon{display:flex}.ibo-navigation-menu--menu-group .ibo-navigation-menu--menu-group-title{flex-grow:1}.ibo-navigation-menu--menu-group:not(:last-child){margin-bottom:20px}.ibo-navigation-menu--menu-group:not(.ibo-is-active):hover,.ibo-navigation-menu--menu-group:not(.ibo-is-active):active{color:white;background-color:#455a64}.ibo-navigation-menu--menu-group:not(.ibo-is-active):active{border-radius:100%}.ibo-navigation-menu--menu-group.ibo-is-active{margin-right:calc(-2 * 8px);padding-right:calc(2 - 8px);color:#37474f;background-color:#f8f9fa;border-radius:5px 0 0 5px}.ibo-navigation-menu--menu-group.ibo-is-active .ibo-navigation-menu--menu-group-icon{color:#ea7d1e}.ibo-navigation-menu--menu-group-icon{width:28px;min-width:28px;justify-content:center;font-size:1.83rem}.ibo-navigation-menu--menu-group-icon::before{width:28px}.ibo-navigation-menu--menu-group-title{margin-left:16px;justify-content:left}.ibo-navigation-menu--drawer{position:absolute;z-index:-1;top:0;bottom:0;right:0;display:flex;flex-direction:column;justify-content:flex-start;width:312px;padding:32px 20px;background-color:#f8f9fa;border-right:1px solid #d5dde5;transition:right 0.2s ease-in-out}.ibo-navigation-menu--menu-filter{position:relative}.ibo-navigation-menu--menu-filter-input{width:100%;padding:8px 10px;color:#212934;background-color:white;border:1px solid #d5dde5;border-radius:3px;padding-right:76px}.ibo-navigation-menu--menu-filter-input::placeholder{color:#6e7a8a}.ibo-navigation-menu--menu-filter-input:-ms-input-placeholder,.ibo-navigation-menu--menu-filter-input::-ms-input-placeholder{color:#6e7a8a}.ibo-navigation-menu--menu-filter-clear{display:none;position:absolute;top:8px;right:60px;padding:3px 3px}.ibo-navigation-menu--menu-filter-hotkey{position:absolute;top:6.5px;right:10px;border:1px solid #ccd4db;border-radius:3px;color:#6e7a8a;padding:2px 4px}.ibo-navigation-menu--menu-filter-hint{position:relative;margin-top:16px;padding-right:12px;color:#6e7a8a}.ibo-navigation-menu--menu-filter-hint-close{position:absolute;top:1px;right:2px}.ibo-navigation-menu--menu--placeholder{width:100%;margin-top:50px}.ibo-navigation-menu--menu--placeholder-image>svg{display:block;width:90%;height:auto;margin:auto}.ibo-navigation-menu--menu--placeholder-hint{margin-top:8px;text-align:center}.ibo-navigation-menu--menu-groups{overflow-y:auto;overflow-x:hidden;margin:50px calc(-1 * 20px) 0 calc(-1 * 20px);padding-left:20px;padding-right:20px;width:inherit}.ibo-navigation-menu--menu-nodes{display:none}.ibo-navigation-menu--menu-nodes ul li>a,.ibo-navigation-menu--menu-nodes ul .ibo-quick-create--compartment-results--elementli>.option:hover,.ibo-navigation-menu--menu-nodes ul .ibo-quick-create--compartment-results--element>li>.option:hover,.ibo-navigation-menu--menu-nodes ul li>span{margin:0 -10px;padding:6px 10px;border-radius:0;color:#6e7a8a}.ibo-navigation-menu--menu-nodes ul li>a,.ibo-navigation-menu--menu-nodes ul .ibo-quick-create--compartment-results--elementli>.option:hover,.ibo-navigation-menu--menu-nodes ul .ibo-quick-create--compartment-results--element>li>.option:hover{color:inherit}.ibo-navigation-menu--menu-nodes ul li>a:hover,.ibo-navigation-menu--menu-nodes ul .ibo-quick-create--compartment-results--elementli>.option:hover,.ibo-navigation-menu--menu-nodes ul .ibo-quick-create--compartment-results--element>li>.option:hover{background-color:#e1e7ec;border-radius:5px}.ibo-navigation-menu--menu-nodes ul ul{padding-left:20px}.ibo-navigation-menu--menu-nodes.ibo-is-active{display:block}.ibo-navigation-menu--menu-nodes-title{margin-top:0;margin-bottom:32px;word-break:break-word}.ibo-navigation-menu--menu-node-title{display:flex;justify-content:space-between;align-items:center}.ibo-navigation-menu--menu-node-counter{margin-left:8px;padding:2px 6px;width:34px;min-width:34px;text-align:center;background:#e1e7ec;border-radius:5px}.ibo-navigation-menu--notifications{position:relative;display:flex;flex-direction:column;align-content:center}.ibo-navigation-menu--notifications-toggler{position:relative;font-size:2rem;color:#929fb1}.ibo-navigation-menu--notifications-toggler:hover,.ibo-navigation-menu--notifications-toggler.ibo-is-loaded:hover{color:#f2f2f2}.ibo-navigation-menu--notifications-toggler.ibo-is-loaded{color:#d5dde5}.ibo-navigation-menu--notifications-toggler.ibo-is-loaded:not(.ibo-is-empty) .ibo-navigation-menu--notifications-toggler--new-messages{display:inline}.ibo-navigation-menu--notifications-toggler .ibo-navigation-menu--notifications-toggler--new-messages{top:-2px;right:-7px;width:16px;height:16px}.ibo-navigation-menu--user-notifications--toggler{position:relative}.ibo-navigation-menu--user-notifications--toggler.ibo-is-loaded{color:#d5dde5}.ibo-navigation-menu--user-notifications--toggler.ibo-is-loaded:not(.ibo-is-empty) .ibo-navigation-menu--notifications-toggler--new-messages{display:inline}.ibo-navigation-menu--user-notifications--toggler .ibo-navigation-menu--notifications-toggler--new-messages{top:-2px;right:-5px;width:10px;height:10px}.ibo-navigation-menu--notifications-toggler--new-messages{position:absolute;display:none;background-color:#e53e3e;border:2px solid #404b5a;border-radius:100%}.ibo-navigation-menu--user-info{justify-content:space-between;flex-direction:column}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-picture{width:36px;height:36px;overflow:hidden;background-color:#d5dde5;border-radius:100%}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-picture .ibo-navigation-menu--user-picture--image{display:flex;max-width:36px;max-height:36px}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-welcome-message,.ibo-navigation-menu--user-info .ibo-navigation-menu--user-organization,.ibo-navigation-menu--user-info .ibo-navigation-menu--user-notifications{display:none;text-align:center;color:white}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-welcome-message .ibo-navigation-menu--user-welcome-message--text,.ibo-navigation-menu--user-info .ibo-navigation-menu--user-welcome-message .ibo-navigation-menu--user-welcome-message--toggler{color:white}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-welcome-message--toggler{padding-left:6px}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-notifications .ibo-navigation-menu--user-notifications--text{color:white}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-notifications .ibo-navigation-menu--user-notifications--toggler--icon{padding-left:5px}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-organization{color:#ebf8ff}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container{position:absolute;bottom:10px}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ibo-popover-menu>.ibo-popover-menu--section:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ui-menu>.ibo-popover-menu--section:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ui-menu>.ui-multiselect-checkboxes:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ui-multiselect-menu>.ibo-popover-menu--section:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ui-multiselect-menu>.ui-multiselect-checkboxes:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ibo-input-select-icon--menu>.ibo-popover-menu--section:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ibo-input-select-icon--menu>.ui-multiselect-checkboxes:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .graph_config .toolkit_menu.graph>ul>li ul>.ibo-popover-menu--section:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .graph_config .toolkit_menu.graph>ul>li ul>.ui-multiselect-checkboxes:nth-child(odd),.graph_config .toolkit_menu.graph>ul>li .ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container ul>.ibo-popover-menu--section:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ibo-popover-menu>.ui-multiselect-checkboxes:nth-child(odd){background-color:#f8f9fa}:root{--ibo-top-bar--height: 54px;--ibo-top-bar--padding-left: 16px;--ibo-top-bar--padding-right: 16px;--ibo-top-bar--padding-y: 0;--ibo-top-bar--background-color: white;--ibo-top-bar--elements-spacing: 32px;--ibo-top-bar--quick-actions--margin-right: 32px}.ibo-top-bar{height:var(--ibo-top-bar--height);padding:var(--ibo-top-bar--padding-y) var(--ibo-top-bar--padding-right) var(--ibo-top-bar--padding-y) var(--ibo-top-bar--padding-left);background-color:var(--ibo-top-bar--background-color)}.ibo-top-bar .ibo-breadcrumbs{flex-grow:1;overflow-x:hidden}.ibo-top-bar--quick-actions{margin-right:var(--ibo-top-bar--quick-actions--margin-right)}.ibo-top-bar--toolbar-dashboard-title{max-width:350px}.ibo-top-bar--toolbar-dashboard-menu-toggler{display:flex;align-items:center}#ibo-center-container.ibo-center-container--with-side-content{display:flex;align-items:stretch}#ibo-center-container.ibo-center-container--with-side-content #ibo-main-content{flex-grow:1}.ibo-v-spacer{padding-top:1em}#ibo-side-content{background-color:white;border-left:1px solid #ccd4db}.ibo-details{margin-top:5px}.ibo-tab-container:not(.ibo-is-scrollable):not([data-status="loaded"]) .ibo-tab-container--tab-container:not(:first-child){display:none}.ibo-tab-container--tabs-list{position:relative;height:36px;background-color:#f8f9fa}.ibo-tab-container--tab-header,.ibo-tab-container--extra-tabs-container{color:#404b5a}.ibo-tab-container--tab-header:hover:not(.ui-state-disabled),.ibo-tab-container--extra-tabs-container:hover:not(.ui-state-disabled){color:#2c5382;background-color:#e1e7ec}.ibo-tab-container--tab-header.ui-tabs-active,.ui-tabs-active.ibo-tab-container--extra-tabs-container{color:#2c5382}.ibo-tab-container--tab-toggler,.ibo-tab-container--extra-tabs-list-toggler{padding-left:24px;padding-right:24px}.ibo-tab-container--extra-tabs-container{position:absolute;top:0;bottom:0;right:0;background-color:#f8f9fa}.ibo-tab-container--extra-tabs-list-toggler{padding-left:12px;padding-right:12px}.ibo-tab-container--extra-tabs-list{position:fixed;z-index:10;max-height:300px;display:flex;flex-direction:column;overflow-y:auto;background-color:#f8f9fa;border-radius:3px}.ibo-tab-container--extra-tab-toggler{padding:8px 16px;max-width:220px;color:#6e7a8a;overflow-x:clip}.ibo-tab-container--extra-tab-toggler:hover,.ibo-tab-container--extra-tab-toggler:active{color:#2c5382;background-color:#e1e7ec}.ibo-tab-container--extra-tab-toggler--tooltip-title{margin-bottom:16px}.ibo-tab-container--tab-container{padding:32px 32px;overflow-x:auto}.ibo-tab-container--tab-container-list.ibo-is-scrollable .ibo-tab-container--tab-container:not(:first-child:nth-last-child(2)) .ibo-tab-container--tab-container--label{display:block}.ibo-tab-container--tab-container-list.ibo-is-scrollable .ibo-tab-container--tab-container{min-height:auto}.ibo-tab-container--tab-container-list.ibo-is-scrollable .ibo-tab-container--tab-container:last-child:not(:only-child){min-height:60vh}.ibo-tab-container--tab-container--label{display:none;margin-bottom:20px;overflow-x:hidden}.ibo-tab-container--tab-container--label>span{position:relative;padding-left:20px;margin-left:40px;color:#929fb1}.ibo-tab-container--tab-container--label>span::before,.ibo-tab-container--tab-container--label>span::after{content:"";display:inline-block;position:absolute;top:calc(50% - (2px / 2));height:1px;width:10000px;border-top:2px solid #929fb1}.ibo-tab-container--tab-container--label>span::before{right:100%}.ibo-tab-container--tab-container--label>span::after{left:100%;margin-left:20px}.ibo-tab--temporary-remote-content{position:relative}.ibo-tab--temporary-remote-content--placeholder{position:relative;height:auto;max-height:300px;text-align:center}.ibo-tab--temporary-remote-content--placeholder>svg{max-width:calc(300px * 5.4);max-height:300px}.ibo-tab--temporary-remote-content--button{position:absolute;top:0;display:flex;justify-content:center;align-content:center;flex-direction:column;text-align:center;height:100%;width:100%;cursor:pointer;background-color:transparent;color:#404b5a}.ibo-tab--temporary-remote-content--button:hover{opacity:0.5;background-color:#212934;color:#e1e7ec}.ibo-multi-column{display:flex;flex-wrap:wrap;margin:0 -16px}.ibo-column{min-width:300px;flex-grow:1;flex-shrink:1;padding:0 16px;flex-basis:10%}.ibo-column:not(:last-child) .ibo-column:not(.ibo-without-margin){margin-bottom:48px}.ibo-mini-column{min-width:30px;flex-grow:1;flex-shrink:1;padding:0 16px;flex-basis:10%;display:flex;flex-direction:column}.ibo-mini-column>.ibo-button,.ui-dialog .ibo-mini-column>.ui-button,.ibo-mini-column>.ui-datepicker-current,.ibo-mini-column>.ui-datepicker-close{margin-left:0;margin-right:0}.ibo-mini-column:not(:last-child){margin-bottom:48px}.ibo-dashboard--top-bar{display:flex;justify-content:space-between;align-items:center;padding-bottom:20px}.ibo-dashboard--top-bar .ibo-dashboard--top-bar-toolbar{display:flex;align-items:center}.ibo-dashboard--selector{display:flex;align-items:center;margin-left:12px;margin-right:1}.ibo-dashboard--selector:hover{background-color:#f8f9fa;border-radius:4px}.ibo-dashboard--selector .selector-label{display:inline-block;margin-left:10px;margin-right:10px;vertical-align:super}.ibo-dashboard--grid{width:100%}.ibo-dashboard--grid-row{display:flex;flex-direction:row;justify-content:space-between;overflow:hidden}.ibo-dashboard--grid-row:not(:last-child){padding-bottom:calc(24px / 2)}.ibo-dashboard--grid-row:not(:first-child){padding-top:calc(24px / 2)}.ibo-dashboard--grid-column{display:flex;flex-flow:row wrap;align-items:flex-start;align-content:flex-start;width:calc(100% + (2 * 24px));margin:calc(-1 * 24px / 2) calc(-1 * 24px / 2);min-width:0}.ibo-dashboard--grid-column:not(:last-child){margin-right:0}.ibo-dashboard--grid-column:not(:first-child){margin-left:0}.ibo-dashboard--grid-column.edit_mode{margin:1px;border:2px #ccd4db dashed;width:100%;min-height:40px}.ibo-dashboard--switch{position:relative;display:inline-block;width:30px;height:24px;vertical-align:baseline}.ibo-dashboard--switch input{display:none}.ibo-dashboard--slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0}.ibo-dashboard--slider:before{content:"";font-size:0.83rem;color:#404b5a;position:absolute;right:5px;bottom:3px}.ibo-dashboard--slider:after{content:"";font-size:1.17rem;color:#dd6c20;position:absolute;left:6px;bottom:1px}input:checked+.ibo-dashboard--slider:before{content:""}input:checked+.ibo-dashboard--slider:after{content:""}.ibo-dashboard-editor--pane{flex-grow:1;padding:16px 30px 16px 15px;overflow:auto}.ibo-dashboard-editor--available-dashlet-icon{display:inline-block;height:34px;width:34px;margin:2px 5px;cursor:grab}.ibo-dashboard-editor--available-dashlet-icon:active{cursor:move}.ibo-dashboard-editor--properties,.ibo-dashboard--available-dashlets,.ibo-dashlet--properties{display:flex;flex-direction:column;padding-bottom:20px}.ibo-dashboard-editor--properties table,.ibo-dashboard--available-dashlets table,.ibo-dashlet--properties table{width:100%;text-align:left}.ibo-dashboard-editor--properties table td,.ibo-dashboard-editor--properties table th,.ibo-dashboard--available-dashlets table td,.ibo-dashboard--available-dashlets table th,.ibo-dashlet--properties table td,.ibo-dashlet--properties table th{margin-bottom:14px}.ibo-dashboard-editor--properties-title{padding-bottom:2rem}.ibo-dashboard-editor--layout-list{display:flex;justify-content:center;padding-bottom:12px}.ibo-dashboard-editor--layout-list>.ui-button{display:inline-block;height:auto;margin:0 15px 0 5px}.ibo-dashboard--available-dashlets--list{display:flex;justify-content:center;flex-wrap:wrap}#dashboard_editor{display:flex;flex-direction:row;padding:0}#dashboard_editor>.itop-dashboard{resize:horizontal;overflow:scroll;border-right:solid 1px #e1e7ec;padding:16px 15px 16px 30px}.ibo-dashboard-editor--delete-dashlet-icon{position:absolute;top:7px;right:9px;padding:2px 6px;z-index:21}.ibo-dashboard-editor .itop-dashboard a,.ibo-dashboard-editor .itop-dashboard .ibo-quick-create--compartment-results--element>.option:hover{cursor:not-allowed}.ibo-wizard-container{padding:10px 16px;background:#bee3f8;border-radius:3px;border-left:3px solid #3182ce}.ibo-object-details.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header .ibo-panel--header-left,.ibo-object-details.ibo-has-icon.ibo-has-medallion-icon>.ibo-object-summary--header .ibo-panel--header-left{margin-left:32px;padding-left:96px}.ibo-object-details.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header .ibo-panel--header-left .ibo-panel--icon,.ibo-object-details.ibo-has-icon.ibo-has-medallion-icon>.ibo-object-summary--header .ibo-panel--header-left .ibo-panel--icon{bottom:calc(-1 * 96px / 2 + -12px);width:96px;height:96px;min-width:96px;min-height:96px}.ibo-object-details.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header .ibo-panel--header-left .ibo-panel--titles,.ibo-object-details.ibo-has-icon.ibo-has-medallion-icon>.ibo-object-summary--header .ibo-panel--header-left .ibo-panel--titles{padding-left:32px}.ibo-object-details--status-dot{width:10px;height:10px;min-width:10px;min-height:10px;border-radius:100%}.ibo-object-details--status-dot+.ibo-object-details--status-label{margin-left:8px}.ibo-object-details--status+.ibo-object-details--object-class{margin-left:0.5rem;display:inline-flex}.ibo-object-details--status+.ibo-object-details--object-class::before{content:"("}.ibo-object-details--status+.ibo-object-details--object-class::after{content:")"}.ibo-object-details--tag{color:#404b5a}.ibo-object-details--tag:not(:first-child){margin-left:12px}.ibo-object-details--tag-icon{margin-right:6px;color:#6e7a8a}.ibo-object-details--object-class~.ibo-object-details--tag::before,.ibo-object-details--tag~.ibo-object-details--tag::before{content:" ";display:inline-block;vertical-align:middle;margin-right:12px;width:5px;height:5px;border-radius:100%;background-color:#404b5a}.ibo-object-details.ibo-has-sticky-header>.ibo-panel--header,.ibo-object-details.ibo-has-sticky-header>.ibo-object-summary--header{}.ibo-object-details.ibo-has-sticky-header>.ibo-panel--header.ibo-is-sticking .ibo-object-details--object-class,.ibo-object-details.ibo-has-sticky-header>.ibo-is-sticking.ibo-object-summary--header .ibo-object-details--object-class{display:none}.ibo-object-details.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header,.ibo-object-details.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-object-summary--header{}.ibo-object-details.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header.ibo-is-sticking .ibo-panel--header-left,.ibo-object-details.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-is-sticking.ibo-object-summary--header .ibo-panel--header-left{padding-left:48px}.ibo-object-details.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header.ibo-is-sticking .ibo-panel--header-right,.ibo-object-details.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-is-sticking.ibo-object-summary--header .ibo-panel--header-right{padding-right:8px}.ibo-object-details.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header.ibo-is-sticking .ibo-panel--titles,.ibo-object-details.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-is-sticking.ibo-object-summary--header .ibo-panel--titles{padding-left:32px}.ibo-object-summary.ibo-has-medallion-icon .ibo-panel--titles{padding-left:16px}.ibo-object-summary>.ibo-panel--body{display:flex;flex-direction:column;padding:0;max-height:40vh;box-shadow:0 3px 6px rgba(0, 0, 0, 0.1), 0 10px 20px rgba(0, 0, 0, 0.15)}.ibo-object-summary--header{margin:8px 0 0 0;padding:8px 0;background-color:#f8f9fa;border-bottom:solid 1px #ccd4db}.ibo-object-summary--header .ibo-panel--icon{overflow:hidden;background-color:#f8f9fa;border:1px solid #90a4ae;border-radius:100%}.ibo-object-summary--header .ibo-panel--header-left{margin-left:16px}.ibo-object-summary--header .ibo-panel--header-right{align-self:start;margin-right:16px;margin-left:8px}.ibo-object-summary--body{overflow:auto}.ibo-object-summary--content--attributes{display:table;width:calc(100% - (2 * 16px));margin:16px 16px 24px 16px}.ibo-object-summary--content--attributes--code,.ibo-object-summary--content--attributes--value{display:table-cell}.ibo-activity-panel{position:relative;display:flex;flex-direction:column;width:480px;height:100%;transition:width 0.2s ease-in-out}.ibo-activity-panel.ibo-is-expanded{width:60vw}.ibo-activity-panel.ibo-is-expanded .ibo-activity-panel--expand-icon{display:none}.ibo-activity-panel:not(.ibo-is-expanded) .ibo-activity-panel--reduce-icon{display:none}.ibo-activity-panel.ibo-is-closed{width:32px}.ibo-activity-panel.ibo-is-closed .ibo-activity-panel--header,.ibo-activity-panel.ibo-is-closed .ibo-activity-panel--body,.ibo-activity-panel.ibo-is-closed .ibo-activity-panel--add-caselog-entry-button{display:none}.ibo-activity-panel.ibo-is-closed .ibo-activity-panel--closed-cover{display:inherit}.ibo-activity-panel--header{position:relative;background-color:#f8f9fa}.ibo-activity-panel--header .ibo-activity-panel--togglers a,.ibo-activity-panel--header .ibo-activity-panel--togglers .ibo-quick-create--compartment-results--element>.option:hover{color:#404b5a}.ibo-activity-panel--togglers{display:flex;align-items:center}.ibo-activity-panel--actions{display:flex;align-items:center;flex-grow:0;position:sticky;padding-right:16px;background-color:#f8f9fa;color:#929fb1}.ibo-activity-panel--actions:hover{color:#404b5a}.ibo-activity-panel--actions>*:not(:first-child){margin-left:0.75rem}.ibo-activity-panel--tabs-togglers{display:flex;align-items:center;justify-content:safe center;flex-grow:1;padding-left:48px;overflow-x:auto}.ibo-activity-panel--tab-toggler.ibo-is-active .ibo-activity-panel--tab-title{background-color:#e1e7ec}.ibo-activity-panel--tab-toggler.ibo-is-active .ibo-activity-panel--tab-title-messages-count{display:none}.ibo-activity-panel--tab-toggler.ibo-is-draft .ibo-activity-panel--tab-title-draft-indicator{display:initial}.ibo-activity-panel--tab-toggler-for-caselog-1 .ibo-activity-panel--tab-title-decoration{background-color:#689f38}.ibo-activity-panel--tab-toggler-for-caselog-2 .ibo-activity-panel--tab-title-decoration{background-color:#b83280}.ibo-activity-panel--tab-toggler-for-caselog-3 .ibo-activity-panel--tab-title-decoration{background-color:#f6ae55}.ibo-activity-panel--tab-toggler-for-caselog-4 .ibo-activity-panel--tab-title-decoration{background-color:#3182ce}.ibo-activity-panel--tab-toggler-for-caselog-5 .ibo-activity-panel--tab-title-decoration{background-color:#80deea}.ibo-activity-panel--tab-toggler-for-caselog-6 .ibo-activity-panel--tab-title-decoration{background-color:#c5e1a5}.ibo-activity-panel--tab-toggler-for-caselog-7 .ibo-activity-panel--tab-title-decoration{background-color:#fbb6ce}.ibo-activity-panel--tab-title{padding:8px 16px}.ibo-activity-panel--tab-title:hover{background-color:#e1e7ec}.ibo-activity-panel--tab-title-decoration{display:inline-flex;margin-right:8px;width:12px;height:12px;border-radius:3px}.ibo-activity-panel--tab-title-messages-count{display:inline-block;margin-left:8px;background-color:#e1e7ec;padding:0 4px;border-radius:3px}.ibo-activity-panel--tab-title-messages-count[data-messages-count="0"]{display:none}.ibo-activity-panel--tab-title-draft-indicator{display:none;margin-left:8px}.ibo-activity-panel--tab-title-text{max-width:100px}.ibo-activity-panel--tab-toolbar{display:none;flex-direction:column;padding-left:10px;padding-right:10px;background-color:#e1e7ec}.ibo-activity-panel--tab-toolbar.ibo-is-active{display:flex}.ibo-activity-panel--tab-toolbar-actions{justify-content:space-between;flex-wrap:nowrap;margin:4px 0;height:32px}.ibo-activity-panel--tab-toolbar-left-actions .ibo-activity-panel--tab-toolbar-action:not(:first-child)::before{content:"-";margin:0 8px}.ibo-activity-panel--tab-toolbar-middle-actions .ibo-activity-panel--tab-toolbar-action>input{margin-right:8px}.ibo-activity-panel--tab-toolbar-middle-actions .ibo-activity-panel--tab-toolbar-action:not(:first-child){margin-left:18px}.ibo-activity-panel--tab-toolbar-right-actions .ibo-activity-panel--tab-toolbar-info{color:#212934}.ibo-activity-panel--tab-toolbar-right-actions .ibo-activity-panel--tab-toolbar-info>.ibo-activity-panel--tab-toolbar-info-icon{margin-left:8px}.ibo-activity-panel--tab-toolbar-right-actions .ibo-activity-panel--tab-toolbar-info:not(:first-child){margin-left:16px}.ibo-activity-panel--tab-toolbar-action{position:relative;color:#212934}.ibo-activity-panel--filter{cursor:pointer}.ibo-activity-panel--filter-options-toggler{padding-left:0.5rem;color:#212934}.ibo-activity-panel--filter-options-toggler.ibo-is-closed{transform:rotateX(180deg)}.ibo-activity-panel--filter-options-toggler.ibo-is-closed+.ibo-activity-panel--filter-options{display:none}.ibo-activity-panel--filter-options{position:absolute;z-index:1;display:flex;flex-direction:column;top:24px;left:-12px;max-width:200px;padding:8px 12px;background-color:#e1e7ec;border-radius:3px}.ibo-activity-panel--filter-option{cursor:pointer}.ibo-activity-panel--filter-option:not(:first-child){margin-top:8px}.ibo-activity-panel--filter-option-input{margin-right:0.5rem}.ibo-activity-panel--body{flex-grow:1;overflow:auto;padding:16px 16px}.ibo-activity-panel--body--placeholder{margin-top:16px}.ibo-activity-panel--body--placeholder-image>svg{width:250px;height:inherit}.ibo-activity-panel--body--placeholder-hint{margin-top:16px;color:#404b5a}.ibo-activity-panel--add-caselog-entry-button{position:absolute;z-index:1;right:12px;top:88px;width:36px;height:36px;background-color:#dd6c20;color:white;border-radius:100%;box-shadow:0 1px 2px rgba(0, 0, 0, 0.25), 0 1px 3px rgba(0, 0, 0, 0.12)}.ibo-activity-panel--add-caselog-entry-button>i{text-align:center;height:100%;width:100%;font-size:1.33rem;line-height:33px}.ibo-activity-panel--add-caselog-entry-button:hover{color:white;background-color:#ea7d1e;box-shadow:0 2px 4px rgba(0, 0, 0, 0.12), 0 3px 6px rgba(0, 0, 0, 0.15)}.ibo-activity-panel--add-caselog-entry-button:active{color:white;background-color:#c05621}.ibo-activity-panel--add-caselog-entry-button.ibo-is-hidden{display:none}.ibo-activity-panel .ibo-activity-panel--entry-forms-confirmation-dialog{display:none}.ibo-activity-panel--entry-forms-confirmation-explanation{margin-bottom:16px}.ibo-activity-panel--entry-forms-confirmation-preference-input{margin-right:0.5rem}.ibo-activity-panel--closed-cover{display:none;position:absolute;z-index:2;top:0;bottom:0;left:0;right:0;background-color:#f8f9fa;cursor:pointer}.ibo-activity-panel--closed-content-container{transform:rotateZ(-90deg);white-space:nowrap}.ibo-activity-panel--open-icon{margin-left:0.75rem}.ibo-caselog-entry-form{display:block;width:100%;background-color:#e1e7ec}.ibo-caselog-entry-form.ibo-is-closed{display:none}.ibo-caselog-entry-form--actions{display:flex;justify-content:space-between;margin-top:8px;margin-bottom:8px}.ibo-caselog-entry-form--lock-indicator{margin-top:12px}.ibo-caselog-entry-form--lock-icon{width:32px;min-width:32px;height:32px;min-height:32px;color:#fcfcfd;background-color:#404b5a;border-radius:100%}.ibo-caselog-entry-form--lock-message{margin-left:1rem}.ibo-caselog-entry-form--action-buttons--main-actions{}.ibo-caselog-entry-form--action-buttons--main-actions>.ibo-popover-menu,.ibo-caselog-entry-form--action-buttons--main-actions>.ui-menu,.ibo-caselog-entry-form--action-buttons--main-actions>.ui-multiselect-menu,.ibo-caselog-entry-form--action-buttons--main-actions>.ibo-input-select-icon--menu,.graph_config .toolkit_menu.graph>ul>li .ibo-caselog-entry-form--action-buttons--main-actions>ul{z-index:1}.ibo-activity-panel--entry-group:not(:last-child){margin-bottom:24px}.ibo-activity-entry{display:flex;flex-direction:row;align-items:flex-end}.ibo-activity-entry:not(:last-child) .ibo-activity-entry--medallion{visibility:hidden}.ibo-activity-entry:not(:last-child) .ibo-activity-entry--sub-information{margin-bottom:4px}.ibo-activity-entry.ibo-is-current-user{flex-direction:row-reverse;min-width:min-content}.ibo-activity-entry.ibo-is-current-user .ibo-activity-entry--medallion{margin-right:initial;margin-left:8px}.ibo-activity-entry.ibo-is-current-user .ibo-activity-entry--information{margin-right:0;margin-left:40px}.ibo-activity-entry.ibo-is-current-user .ibo-activity-entry--main-information{background-color:#ebf8ff}.ibo-activity-entry.ibo-is-current-user .ibo-activity-entry--sub-information{text-align:right}.ibo-activity-entry.ibo-is-current-user:last-child .ibo-activity-entry--main-information{border-bottom-right-radius:0;border-bottom-left-radius:5px}.ibo-activity-entry:not(.ibo-is-current-user){}.ibo-activity-entry:not(.ibo-is-current-user) .ibo-activity-entry--information{margin-right:40px;margin-left:0}.ibo-activity-entry:not(.ibo-is-current-user):last-child .ibo-activity-entry--main-information{border-bottom-right-radius:5px;border-bottom-left-radius:0}.ibo-activity-entry.ibo-is-closed .ibo-activity-entry--main-information{max-height:48px;overflow:hidden;cursor:pointer}.ibo-activity-entry.ibo-is-closed .ibo-activity-entry--main-information::after{content:"...";position:absolute;top:30px;left:0;padding-left:16px;width:100%;height:100%;background-color:inherit}.ibo-activity-entry--medallion{margin-right:8px;margin-bottom:18px;min-width:32px;width:32px;min-height:32px;height:32px;overflow:hidden;border-radius:100%}.ibo-activity-entry--medallion.ibo-has-image{background-color:#ebf8ff;box-shadow:inset 0 1px 2px 0 rgba(0, 0, 0, 0.25)}.ibo-activity-entry--medallion:not(.ibo-has-image){background-color:#546e7a;color:white;border:1px solid #e1e7ec}.ibo-activity-entry--medallion .ibo-activity-entry--author-picture{max-height:100%}.ibo-activity-entry--main-information{position:relative;display:flex;flex-direction:row;align-items:baseline;padding:12px 16px;color:#404b5a;background-color:#e1e7ec;border-radius:5px}.ibo-activity-entry--main-information-icon{margin-right:16px;color:#6e7a8a;font-size:1.33rem}.ibo-activity-entry--main-information-content{flex-grow:1;word-break:break-word}.ibo-activity-entry--main-information-content a,.ibo-activity-entry--main-information-content .ibo-quick-create--compartment-results--element>.option:hover{color:#2b6bb0}.ibo-activity-entry--main-information-content a:hover,.ibo-activity-entry--main-information-content .ibo-quick-create--compartment-results--element>.option:hover{color:#2a4265}.ibo-activity-entry--main-information-content a:active,.ibo-activity-entry--main-information-content .ibo-quick-create--compartment-results--element>.option:hover:active,.ibo-activity-entry--main-information-content a:focus,.ibo-activity-entry--main-information-content .ibo-quick-create--compartment-results--element>.option:hover:focus{color:#2a4265}.ibo-activity-entry--sub-information{margin-top:4px;text-align:left;color:#6e7a8a}.ibo-activity-entry--sub-information>*:not(:last-child):after{content:" ";display:inline-block;vertical-align:middle;margin-left:0.5rem;margin-right:0.5rem;width:4px;height:4px;border-radius:100%;background-color:#929fb1}.ibo-activity-panel--load-more-entries-container{position:relative}.ibo-activity-panel--load-more-entries-container:hover .ibo-activity-panel--load-all-entries{margin-left:84px}.ibo-activity-panel--load-more-entries-container:not(:hover) .ibo-activity-panel--load-all-entries{visibility:hidden}.ibo-activity-panel--load-entries-button{width:32px;height:32px;border-radius:100%;background-color:#e1e7ec;border:1px solid #ccd4db}.ibo-activity-panel--load-more-entries{z-index:1}.ibo-activity-panel--load-all-entries{position:absolute;z-index:0;top:0;margin-left:0;transition:all 0.1s ease-in-out}.ibo-caselog-entry{}.ibo-caselog-entry .ibo-activity-entry--main-information{padding-top:12px;padding-bottom:12px}.ibo-caselog-entry .ibo-activity-entry--main-information-icon{display:none}.ibo-caselog-entry .ibo-activity-entry--main-information::before{content:"";position:absolute;top:0;bottom:0;width:3px}.ibo-caselog-entry:not(.ibo-is-current-user) .ibo-activity-entry--main-information::before{left:0;border-top-left-radius:5px;border-bottom-left-radius:5px}.ibo-caselog-entry:not(.ibo-is-current-user):last-child .ibo-activity-entry--main-information::before{border-bottom-left-radius:0}.ibo-caselog-entry.ibo-is-current-user .ibo-activity-entry--main-information::before{right:0;border-top-right-radius:5px;border-bottom-right-radius:5px}.ibo-caselog-entry.ibo-is-current-user:last-child .ibo-activity-entry--main-information::before{border-bottom-right-radius:0}.ibo-caselog-entry.ibo-is-closed.ibo-is-current-user .ibo-activity-entry--main-information::after{width:calc(100% - 3px)}.ibo-caselog-entry.ibo-is-closed:not(.ibo-is-current-user) .ibo-activity-entry--main-information::after{margin-left:3px}.ibo-caselog-entry--entry-for-caselog-1 .ibo-activity-entry--main-information::before{background-color:#689f38}.ibo-caselog-entry--entry-for-caselog-2 .ibo-activity-entry--main-information::before{background-color:#b83280}.ibo-caselog-entry--entry-for-caselog-3 .ibo-activity-entry--main-information::before{background-color:#f6ae55}.ibo-caselog-entry--entry-for-caselog-4 .ibo-activity-entry--main-information::before{background-color:#3182ce}.ibo-caselog-entry--entry-for-caselog-5 .ibo-activity-entry--main-information::before{background-color:#80deea}.ibo-caselog-entry--entry-for-caselog-6 .ibo-activity-entry--main-information::before{background-color:#c5e1a5}.ibo-caselog-entry--entry-for-caselog-7 .ibo-activity-entry--main-information::before{background-color:#fbb6ce}.ibo-transition-entry--original-state-label{color:#404b5a;text-decoration:line-through}a.ibo-edits-entry--short-description,.ibo-quick-create--compartment-results--element>.ibo-edits-entry--short-description.option:hover{position:relative;display:block;color:inherit}.ibo-edits-entry--long-description-toggler-icon{position:absolute;top:3px;right:0;transition:all 0.2s ease-in-out}.ibo-edits-entry--long-description{display:none;margin-top:8px;list-style:inside}.ibo-edits-entry:not(.ibo-is-closed) .ibo-edits-entry--long-description-toggler-icon{transform:rotateX(180deg)}.ibo-edits-entry:not(.ibo-is-closed) .ibo-edits-entry--long-description{display:block}a.ibo-notification-entry--short-description,.ibo-quick-create--compartment-results--element>.ibo-notification-entry--short-description.option:hover{color:inherit}.ibo-notification-entry--long-description-toggler-icon{margin-left:12px;transition:all 0.2s ease-in-out}.ibo-notification-entry--long-description{display:none;margin-top:8px;list-style:inside}.ibo-notification-entry:not(.ibo-is-closed) .ibo-notification-entry--long-description-toggler-icon{transform:rotateX(180deg)}.ibo-notification-entry:not(.ibo-is-closed) .ibo-notification-entry--long-description{display:block}.ibo-extension-details{display:inline-flex;flex-direction:row;justify-content:space-between;align-items:center;width:100%}.ibo-extension-details--information{flex-grow:1;display:flex;flex-direction:column}.ibo-extension-details--actions{display:flex}.ibo-extension-details--information--metadata{color:#6e7a8a}.ibo-extension-details--information--metadata span+span:before{content:"-";padding-left:4px;padding-right:4px}.ibo-extension-details:has(> .ibo-extension-details--actions input:is([type="checkbox"], [type="radio"]):checked)>.ibo-extension-details--information>.ibo-extension-details--information--label .ibo-badge.unchecked{display:none}.ibo-extension-details:has(> .ibo-extension-details--actions input[type="checkbox"]:not(:checked))>.ibo-extension-details--information>.ibo-extension-details--information--label .ibo-badge.checked,.ibo-extension-details:has(> .ibo-extension-details--actions input[type="radio"]:not(:checked))>.ibo-extension-details--information>.ibo-extension-details--information--label .ibo-badge.checked{display:none}.ibo-extension-details--actions>button{padding:3px 9px}.ibo-extension-details--actions:has(.toggler-install:not(:disabled)) .ibo-popover-menu--section a[data-resource-id="force_uninstall"],.ibo-extension-details--actions:has(.toggler-install:not(:disabled)) .ui-multiselect-checkboxes a[data-resource-id="force_uninstall"],.ibo-extension-details--actions:has(.toggler-install:not(:disabled)) .ibo-popover-menu--section .ibo-quick-create--compartment-results--element>.option:hover[data-resource-id="force_uninstall"],.ibo-extension-details--actions:has(.toggler-install:not(:disabled)) .ui-multiselect-checkboxes .ibo-quick-create--compartment-results--element>.option:hover[data-resource-id="force_uninstall"]{display:none}.ibo-bulk--bulk-modify--incompatible-attribute:before{margin-right:4px;content:"";color:#429ae1}.ibo-block-csv textarea{width:100%;min-height:10em;margin-top:10px}.ibo-block-list--empty-text,.ibo-block-list--create-action{text-align:center}.ibo-block-list--create-icon{margin-right:0.5rem}.ibo-linked-set--bulk-tooltip-info:before{margin-right:4px;content:"";color:#429ae1}.ibo-table-preview{margin-top:20px;overflow-x:auto}.ibo-table-preview th{position:relative;padding:4px 24px 4px 4px;border-width:1px 1px 0;border-style:groove groove none;background:#f2f2f2}.ibo-table-preview td{padding-right:4px;padding-left:4px;border-width:0 1px;border-style:none groove}.ibo-table-preview tr:last-child td{border-bottom-width:1px;border-bottom-style:groove}.ibo-preview-header{margin-bottom:4px}.ibo-table-preview--remove-column{position:absolute;top:8px;right:8px;display:inline-block;cursor:pointer;font-size:8px}#form_part_interactive_fields_xlsx,#form_part_interactive_fields_csv,#form_part_interactive_fields_pdf{margin-top:24px}.ibo-welcome-popup--dialog.ui-dialog-content{padding:0 0;height:auto !important;max-height:80vh !important}.ibo-welcome-popup--messages-stack{min-width:300px;max-width:300px;padding:24px 16px;overflow-y:auto;background-color:#f8f9fa}.ibo-welcome-popup--messages-stack>*:not(:first-child){margin-top:12px}.ibo-welcome-popup--stack-item{padding:12px 16px;background-color:white;border:1px solid #d5dde5}.ibo-welcome-popup--stack-item.ibo-is-active{border-color:#929fb1}.ibo-welcome-popup--stack-item.ibo-is-acknowledged{opacity:0.6}.ibo-welcome-popup--stack-item.ibo-is-acknowledged.ibo-is-active{opacity:1}.ibo-welcome-popup--stack-item-icon{width:32px;height:32px;min-width:32px;min-height:32px;margin-right:12px;border-width:1px}.ibo-welcome-popup--message-content-wrapper{overflow:auto}.ibo-welcome-popup--message-content{display:flex;justify-content:space-between;align-items:center;padding:32px 48px}.ibo-welcome-popup--message-content .ibo-welcome-popup--message-illustration{margin-left:48px}.ibo-welcome-popup--message-content:not(.ibo-is-active){display:none}.ibo-welcome-popup--message-content.ibo-is-illustration-on-left-side{flex-direction:row-reverse}.ibo-welcome-popup--message-content.ibo-is-illustration-on-left-side .ibo-welcome-popup--message-illustration{margin-left:unset;margin-right:48px}.ibo-welcome-popup--message-title{margin-bottom:32px}.ibo-welcome-popup--message-illustration{display:flex;min-width:256px;aspect-ratio:1;background-size:contain}.ibo-welcome-popup--message-illustration>svg{height:auto}.ibo-user-rights{padding:4px 12px;border-radius:4px}.ibo-user-rights.ibo-is-success{background-color:#dcedc8;color:#235816;border:1px solid #8ac34a}.ibo-user-rights.ibo-is-failure{background-color:#fce8e8;color:#491d1d;border:1px solid #f56565}:root{--ibo-dm-class--User--main-color: #546e7a;--ibo-dm-class--User--complementary-color: white}.ibo-dm-class--User{--ibo-main-color: #546e7a;--ibo-main-color--100: #eaeef0;--ibo-main-color--900: #1f292d;--ibo-complementary-color: white}.ibo-dm-class-alt--User{--ibo-main-color: white;--ibo-complementary-color: #546e7a}:root{--ibo-dm-enum--User-status-enabled--main-color: #689f38;--ibo-dm-enum--User-status-enabled--complementary-color: white}.ibo-dm-enum--User-status-enabled{--ibo-main-color: #689f38;--ibo-main-color--100: #edf6e5;--ibo-main-color--900: #253914;--ibo-complementary-color: white}.ibo-dm-enum-alt--User-status-enabled{--ibo-main-color: white;--ibo-complementary-color: #689f38}:root{--ibo-dm-enum--User-status-disabled--main-color: #f6ae55;--ibo-dm-enum--User-status-disabled--complementary-color: white}.ibo-dm-enum--User-status-disabled{--ibo-main-color: #f6ae55;--ibo-main-color--100: #fdefdd;--ibo-main-color--900: #492a04;--ibo-complementary-color: white}.ibo-dm-enum-alt--User-status-disabled{--ibo-main-color: white;--ibo-complementary-color: #f6ae55}:root{--ibo-dm-class--Action--main-color: #546e7a;--ibo-dm-class--Action--complementary-color: white}.ibo-dm-class--Action{--ibo-main-color: #546e7a;--ibo-main-color--100: #eaeef0;--ibo-main-color--900: #1f292d;--ibo-complementary-color: white}.ibo-dm-class-alt--Action{--ibo-main-color: white;--ibo-complementary-color: #546e7a}:root{--ibo-dm-enum--Action-status-enabled--main-color: #689f38;--ibo-dm-enum--Action-status-enabled--complementary-color: white}.ibo-dm-enum--Action-status-enabled{--ibo-main-color: #689f38;--ibo-main-color--100: #edf6e5;--ibo-main-color--900: #253914;--ibo-complementary-color: white}.ibo-dm-enum-alt--Action-status-enabled{--ibo-main-color: white;--ibo-complementary-color: #689f38}:root{--ibo-dm-enum--Action-status-disabled--main-color: #e1e7ec;--ibo-dm-enum--Action-status-disabled--complementary-color: #6e7a8a}.ibo-dm-enum--Action-status-disabled{--ibo-main-color: #e1e7ec;--ibo-main-color--100: #e9eef1;--ibo-main-color--900: #1e272f;--ibo-complementary-color: #6e7a8a}.ibo-dm-enum-alt--Action-status-disabled{--ibo-main-color: #6e7a8a;--ibo-complementary-color: #e1e7ec}:root{--ibo-dm-enum--Action-status-test--main-color: #f6ae55;--ibo-dm-enum--Action-status-test--complementary-color: white}.ibo-dm-enum--Action-status-test{--ibo-main-color: #f6ae55;--ibo-main-color--100: #fdefdd;--ibo-main-color--900: #492a04;--ibo-complementary-color: white}.ibo-dm-enum-alt--Action-status-test{--ibo-main-color: white;--ibo-complementary-color: #f6ae55}.ibo-about-box--top-part{display:flex;flex-direction:row;align-content:center}.ibo-about-box--top-part>div{padding:16px 12px;margin:auto auto;width:50%}:root{--ibo-body-text-color: #212934;--ibo-body-background-color: #f2f2f2}html{height:100vh}body{display:flex;height:100vh;color:var(--ibo-body-text-color);background-color:var(--ibo-body-background-color)}#ibo-navigation-menu{z-index:20}#ibo-page-container{position:relative;z-index:10;height:100%;overflow:auto;flex-grow:1;display:flex;flex-direction:column}#ibo-top-bar,#ibo-main-content{padding-left:36px;padding-right:36px}#ibo-top-container{z-index:20;position:sticky;top:0;left:0;right:0}#ibo-center-container{position:relative;z-index:10;flex-grow:1;overflow:hidden}#ibo-center-container>*{height:100%}#ibo-main-content{padding-top:16px;padding-bottom:16px;overflow:auto}#ibo-main-content>.ibo-panel{margin-left:auto;margin-right:auto}.ibo-preferences--user-preferences--picture-placeholder{display:flex;flex-direction:row;flex-wrap:wrap}.ibo-preferences--user-preferences--picture-placeholder--image{height:54px;width:54px;border-radius:100%;margin:12px;border:solid 3px #d5dde5}.ibo-preferences--user-preferences--picture-placeholder--image>img{border-radius:100%;background-color:#d5dde5}.ibo-preferences--user-preferences--picture-placeholder--image.ibo-is-active{border-color:#2c5382}.ibo-preferences--user-preferences--picture-placeholder--image:hover{border-color:#3182ce}#ibo-form-for-user-interface-preferences>.ibo-keyboard-shortcut--shortcut{display:table;width:100%}#ibo-form-for-user-interface-preferences>.ibo-keyboard-shortcut--shortcut>*:not(.ibo-button){width:30%;display:table-cell}.ibo-keyboard-shortcut--input,.ibo-keyboard-shortcut--input:focus{display:inline-block;width:auto;text-transform:capitalize;text-align:center;color:#404b5a;background-color:transparent;border:1px solid #aebecd;border-bottom:2px solid #aebecd;border-radius:3px;padding:2px 4px;margin-bottom:5px}.ibo-keyboard-shortcut--input.ibo-is-focus,.ibo-keyboard-shortcut--input:focus.ibo-is-focus{text-transform:none;color:#9c4221;border-color:#dd6c20}#ibo-favorite-organizations .ibo-toolbar{float:right;vertical-align:top}#ibo-favorite-organizations .ibo-datatable--toolbar{padding-top:3px}#ibo-attachment--upload-file .ibo-input-file-select--container{display:inline-block}.ibo-attachment--datatable--icon-preview{max-height:44px;max-width:44px}.ibo-attachment--datatable tbody tr td{vertical-align:middle}.ibo-attachment--upload-file--drop-zone-hint{display:none}.ibo-drag-in{border:2px #ccd4db dashed}.ibo-drag-in .ibo-attachment--upload-file--drop-zone-hint{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%;max-height:200px;margin:22px 0;color:#6e7a8a}.ibo-drag-in .ibo-attachment--upload-file--drop-zone-hint>svg{margin-bottom:5px}.ibo-drag-in #ibo-attachment--upload-file--upload-button-container{display:none}.ibo-tab-container--tab-header.ibo-drag-in,.ibo-drag-in.ibo-tab-container--extra-tabs-container{border:none;background-color:#bee3f8;color:#2c5382}.ibo-tab-container--tab-header.ibo-drag-in>a::after,.ibo-drag-in.ibo-tab-container--extra-tabs-container>a::after,.ibo-quick-create--compartment-results--element.ibo-tab-container--tab-header>.option:hover::after,.ibo-quick-create--compartment-results--element.ibo-drag-in>.option:hover::after{content:"";padding-left:8px;color:#3182ce}.itop-simple-graph{margin-top:10px;border:1px dotted transparent;border-radius:5px}.itop-simple-graph.ibo-has-focus{border:1px dotted #404b5a}.graph_zoom{display:flex;float:right;align-items:center}.graph_zoom_slider{height:1.1em;display:inline-block;width:10em}.graph_zoom_plus,.graph_zoom_minus{cursor:pointer;display:inline-block;margin-left:0.5em;margin-right:0.5em}.graph_config{display:flex;align-items:center;flex-wrap:wrap}.graph_config .toolkit_menu.graph>ul>li{position:relative}.graph_config .toolkit_menu.graph>ul>li ul{z-index:1;position:absolute;display:none}.graph_separator{flex-grow:1}.ibo-simple-graph--grouping-threshold--container,.ibo-simple-graph--additional-context--container{margin-right:0.3em;display:flex;align-items:center}.ibo-simple-graph--grouping-threshold--container>*,.ibo-simple-graph--additional-context--container>*{margin-right:1em}#graph_grouping_threshold{width:auto;padding-right:0}.ibo-display-graph--search-box .sf_criterion_area{display:flex;flex-direction:column}.ibo-display-graph--search-box .sf_criterion_row{display:flex;flex-wrap:wrap;align-items:center}.ibo-display-graph--search-box .sf_criterion_row>div{align-items:center;display:flex;padding:0 15px}.ibo-display-graph--search-box .sf_criterion_row>div>input{margin-right:10px}.ibo-display-graph--search-box .sf_criterion_row>div .ibo-medallion-icon{display:flex;align-items:center}.ibo-display-graph--search-box #ReloadMovieBtn{align-self:flex-end}#impacted_objects_lists>div~div{margin-top:24px}#impacted_objects_lists_placeholder,#impacted_groups_placeholder{height:256px}.ibo-audit--audit-category--panel .ibo-panel--body tr.ibo-is-red td:last-of-type:before{background-color:#c53030}.ibo-audit--audit-category--panel .ibo-panel--body tr.ibo-is-orange td:last-of-type:before{background-color:#c05621}.ibo-audit--audit-category--panel .ibo-panel--body tr.ibo-is-green td:last-of-type:before{background-color:#558b2f}.ibo-audit--audit-category--panel .ibo-panel--body{padding:10px 16px}.ibo-audit--audit-category--panel .ibo-panel--body .ibo-datatable td:not(:nth-child(1)),.ibo-audit--audit-category--panel .ibo-panel--body .ibo-datatable th:not(:nth-child(1)){text-align:right;width:100px}.ibo-audit--audit-category--panel .ibo-panel--body .ibo-datatable--toolbar{display:none}.ibo-audit--audit-category--panel .ibo-panel--body tr td:last-of-type:before{content:"";height:12px;width:12px;border-radius:100%;display:inline-block;margin-right:5px;vertical-align:middle}.ibo-audit--dashboard{padding:18px 0}.ibo-dashboard--grid-row+.ibo-audit--error-alert{margin-top:24px}.ibo-audit--audit-line--csv-download{height:2.5em;vertical-align:middle}.ibo-data-synchro-source--replicas-status.ibo-is-grey{color:#212934;background-color:#ccd4db}.ibo-data-synchro-source--replicas-status.ibo-is-orange{color:#7b341e;background-color:#fbd38d}.ibo-data-synchro-source--replicas-status.ibo-is-bluegrey{color:#263238;background-color:#b0bec5}.ibo-data-synchro-source--replicas-status.ibo-is-red{color:#742a2a;background-color:#feb2b2}.ibo-data-synchro-source--replicas-status.ibo-is-blue{color:#2a4265;background-color:#bee3f8}.ibo-data-synchro-source--replicas-status.ibo-is-green{color:#33691e;background-color:#dcedc8}.ibo-data-synchro-source--replicas-status.ibo-is-cyan{color:#006164;background-color:#c9eef2}.ibo-data-synchro-source--replicas-status-separator{border-top:white}.ibo-data-synchro-source--replicas-status.ibo-is-light{opacity:0.5}.ibo-data-synchro-source--replicas-status.ibo-is-light:hover{opacity:1}.synoptics tr td{padding:10px;min-width:200px;vertical-align:middle;text-align:center}.synoptics tr td.arrow{min-width:100px;border-top:2px solid #fcfcfd}.ibo-data-synchro-source--replicas-status--warning{margin:0 5px 0 8px}.ibo-datamodel-viewer--parent--spacer{padding:0 8px}.ibo-datamodel-viewer--classes-list .selectize-input,.ibo-datamodel-viewer--classes-list .ibo-quick-create--input.selectize-control.single .selectize-input.input-active,.ibo-quick-create--input.selectize-control.single .ibo-datamodel-viewer--classes-list .selectize-input.input-active{background-color:white !important;background-image:none !important;color:#404b5a;box-shadow:none !important;border-color:#aebecd !important}#ibo-datamodel-viewer--attributes-table>tbody tr td:first-child{width:3px}.ibo-datamodel-viewer--origin-cell{vertical-align:middle}.ibo-datamodel-viewer--origin-cell>div{height:8px;width:8px;border-radius:100%}.ibo-datamodel-viewer--classes-list{position:relative;height:100%;width:350px;padding-left:24px;overflow-y:scroll}.ibo-datamodel-viewer--lifecycle--code{color:#6e7a8a}.ibo-datamodel-viewer--lifecycle--stimuli{color:#2a4265}.ibo-datamodel-viewer--lifecycle--attribute-option{color:#702459}.dataModelSchema g{cursor:pointer}.dataModelSchema g:hover rect:not(.liseret){fill:#ccd4db}.dataModelSchema text{fill:#212934;text-anchor:middle}#selfreferencing:hover~g>.selfattr{fill:#ccd4db}.tooltipD3{position:fixed;text-align:center;background:white;border:1px solid #6e7a8a;border-radius:3px;pointer-events:none;fill:#212934;text-anchor:middle}.tooltipD3 i{font-size:1rem}.tooltipD3 span{margin:3px}#tooltipD3_top{border-bottom:1px solid #6e7a8a;padding:3px}.ibo-datamodel-viewer--lifecycle-image{margin-bottom:16px}#tabs1-import .ibo-field--label{max-width:50%}div.ibo-csv-import--cell-modified{font-weight:bold;color:#2b6bb0}div.ibo-csv-import--cell-error{font-weight:bold;color:#c53030}div.ibo-csv-import--cell-message{padding-top:3px}tr.ibo-csv-import--row-unchanged td{border-bottom:1px #ccd4db solid}.wizContainer table tr.ibo-csv-import--row-error td{border-bottom:1px #ccd4db solid;background-color:#fed7d7}tr.ibo-csv-import--row-modified td{border-bottom:1px #ccd4db solid}tr.ibo-csv-import--row-added td{border-bottom:1px #ccd4db solid}.ibo-csv-import--download-file{font-size:4em;color:#f6ae55;margin:20px}.ibo-global-search--result--title>img{max-height:48px;max-width:48px;margin-right:8px}.ibo-run-query--highlight{background-color:#fbd38d}.ibo-oauth-wizard .ibo-panel--body .ibo-oauth-wizard--form--container{display:flex;flex-direction:row;flex-grow:1}.ibo-oauth-wizard .ibo-panel--body .ibo-oauth-wizard--illustration svg{max-height:384px}#ibo-oauth-wizard--conf--result{white-space:pre-wrap}.ibo-notifications--view-all--container{display:grid;grid-gap:24px}.ibo-notifications--view-all--container .ibo-object-summary .ibo-panel--title{font-size:1.5rem}.ibo-notifications--view-all--container .ibo-object-summary .ibo-panel--toolbar{min-width:96px}.ibo-notifications--view-all--container .ibo-object-summary>.ibo-panel--body{box-shadow:none;max-height:400px}.ibo-notifications--view-all--container .ibo-object-summary+.ibo-object-summary{margin-top:0}@media screen and (max-width:768px){.ibo-notifications--view-all--container{grid-template-columns:repeat(1, 1fr)}}@media screen and (min-width:1024px){.ibo-notifications--view-all--container{grid-template-columns:repeat(2, 1fr)}}@media screen and (min-width:1408px){.ibo-notifications--view-all--container{grid-template-columns:repeat(3, 1fr)}}.ibo-notifications--view-all--toolbar{justify-content:space-between}.ibo-notifications--view-all--toggler{display:flex;align-content:center}.ibo-notifications--view-all--item--read .ibo-panel--body::before{background-color:#e1e7ec}.ibo-notifications--view-all--item--unread .ibo-panel--body::before{background-color:#e53e3e}.ibo-notifications--view-all--container .ibo-notifications--view-all--read-action,.ibo-notifications--view-all--container .ibo-notifications--view-all--unread-action{margin-left:0 !important}.ibo-notifications--view-all--item--read .ibo-notifications--view-all--read-action{display:none}.ibo-notifications--view-all--item--unread .ibo-notifications--view-all--unread-action{display:none}.ibo-notifications--view-all--empty{flex-direction:column;margin-top:96px}.ibo-notifications--view-all--empty svg{max-width:30%;height:auto}.ibo-input-select--notification-item{display:flex !important;flex-direction:row}.ibo-input-select--notification-item--mixed-value{font-size:1rem;color:#9c4221;margin-left:4px}.ibo-alert+.ibo-alert{margin-top:4px}.ibo-alert+.ibo-block:not(.ibo-alert){margin-top:16px}.ibo-button+.ibo-button,.ui-dialog .ui-button+.ibo-button,.ui-dialog .ui-button+.ui-button,.ui-dialog .ui-button+.ui-datepicker-current,.ui-dialog .ui-button+.ui-datepicker-close,.ui-datepicker-current+.ibo-button,.ui-dialog .ui-datepicker-current+.ui-button,.ui-datepicker-current+.ui-datepicker-current,.ui-datepicker-current+.ui-datepicker-close,.ui-datepicker-close+.ibo-button,.ui-dialog .ui-datepicker-close+.ui-button,.ui-datepicker-close+.ui-datepicker-current,.ui-datepicker-close+.ui-datepicker-close,.ui-dialog .ibo-button+.ui-button,.ibo-button+.ui-datepicker-current,.ibo-button+.ui-datepicker-close{margin-left:4px}.ibo-button-group+.ibo-button-group,.ibo-button+.ibo-button-group,.ui-dialog .ui-button+.ibo-button-group,.ui-datepicker-current+.ibo-button-group,.ui-datepicker-close+.ibo-button-group,.ibo-button-group+.ibo-button,.ui-dialog .ibo-button-group+.ui-button,.ibo-button-group+.ui-datepicker-current,.ibo-button-group+.ui-datepicker-close{margin-left:4px}.ibo-collapsible-section+.ibo-collapsible-section{margin-top:12px}.ibo-collapsible-section+.ibo-block:not(.ibo-collapsible-section){margin-top:16px}.ibo-caselog-list .ibo-collapsible-section{margin:0;min-width:22em}.ibo-caselog-list .ibo-collapsible-section .ibo-collapsible-section--body{color:#212934;padding:8px;background-color:rgba(248, 249, 250, 0.5)}.ibo-alert--body .ibo-collapsible-section .ibo-collapsible-section--body{color:#212934;padding:8px}.ibo-alert--body>*+.ibo-collapsible-section{margin-top:8px}.ibo-datatable+.ibo-block{margin-top:4px}.ibo-panel .ibo-panel--body .ibo-datatable{width:100%}.display_block+.display_block{margin-top:24px}.display_block+.ibo-block:not(.display_block){margin-top:16px}.ibo-field+.ibo-field{margin-top:16px}.form_field+.form_field{margin-top:16px}.ibo-fieldset+.ibo-field,fieldset+.ibo-field{margin-top:32px}.ibo-field+.ibo-fieldset:not(.ibo-column),.ibo-field+fieldset:not(.ibo-column){margin-top:32px}.ibo-fieldset+.ibo-fieldset:not(.ibo-column),fieldset+.ibo-fieldset:not(.ibo-column),.ibo-fieldset+fieldset:not(.ibo-column){margin-top:48px}.ibo-multi-column+.ibo-fieldset,.ibo-multi-column+fieldset{margin-top:48px}.ibo-form+.ibo-form{margin-top:24px}select+label,label+select,label>select,input+label,label+input,label>input{margin-left:8px}.ibo-datatable .attribute-set .attribute-set-item{display:inline;margin:0;padding:4px 6px;box-shadow:0 1px 2px rgba(0, 0, 0, 0.25), 0 1px 3px rgba(0, 0, 0, 0.12)}.ibo-datatable .attribute-set .attribute-set-item+.attribute-set-item{margin-left:0.5rem}.ibo-object-details.ibo-has-medallion-icon>.ibo-panel--body>.ibo-tab-container:not(.ibo-is-vertical)>.ibo-tab-container--tabs-list{padding-left:calc(32px + 96px + 32px - 24px)}.tippy-box[data-theme~="object-summary"]{background-color:rgba(255, 255, 255, 0);color:#212934}.tippy-box[data-theme~="object-summary"] .tippy-arrow{display:none}.ibo-panel+.ibo-panel{margin-top:24px}.ibo-panel+.ibo-block:not(.ibo-panel){margin-top:16px}#ibo-main-content{}#ibo-main-content .ibo-panel.ibo-has-sticky-header{margin-bottom:200px}#ibo-main-content .ibo-panel.ibo-has-sticky-header>.ibo-sticky-sentinel-top{top:-16px;height:16px}#ibo-main-content .ibo-panel.ibo-has-sticky-header>.ibo-panel--header.ibo-is-sticking,#ibo-main-content .ibo-panel.ibo-has-sticky-header>.ibo-is-sticking.ibo-object-summary--header{top:-16px}.ui-dialog-content{}.ui-dialog-content .ibo-panel.ibo-has-sticky-header{}.ui-dialog-content .ibo-panel.ibo-has-sticky-header>.ibo-sticky-sentinel-top{top:-16px;height:16px}.ui-dialog-content .ibo-panel.ibo-has-sticky-header>.ibo-panel--header.ibo-is-sticking,.ui-dialog-content .ibo-panel.ibo-has-sticky-header>.ibo-is-sticking.ibo-object-summary--header{top:-16px}.ibo-pill:not(:last-child){margin-right:16px}.ibo-dashboard--grid-row .ibo-dashlet-header-static{margin-top:12px}.ibo-dashboard--grid-row:first-child .ibo-dashlet:first-child .ibo-dashlet-header-static{margin-top:0}.ibo-details .ibo-prop--apply>span,.ibo-details .ibo-prop--cancel>span{display:unset}.ibo-details .ibo-prop--apply{display:table-column}.ibo-activity-panel--tab-entry-form .ibo-caselog-entry-form{padding-bottom:14px;border-bottom:1px solid #aebecd}.ibo-panel{}.ibo-panel>.ibo-panel--body>.ibo-tab-container{margin-top:-24px;margin-left:-16px;margin-right:-16px;margin-bottom:-24px}.ibo-panel>.ibo-panel--body>.ibo-tab-container>.ibo-tab-container--tab-container-list{height:100%;overflow-y:auto;flex-grow:1}.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical{display:flex;flex-direction:row}.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tabs-list{padding-top:48px;flex-direction:column;height:auto;padding-left:unset;margin-right:unset;min-width:calc(32px + 90px + 32px)}.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tabs-list>.ibo-tab-container--tab-header,.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tabs-list>.ibo-tab-container--extra-tabs-container{height:48px;width:100%;justify-content:left}.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tabs-list>.ibo-tab-container--tab-header>.ibo-tab-container--tab-toggler,.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tabs-list>.ibo-tab-container--extra-tabs-container>.ibo-tab-container--tab-toggler,.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tabs-list>.ibo-tab-container--tab-header>.ibo-tab-container--extra-tabs-list-toggler,.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tabs-list>.ibo-tab-container--extra-tabs-container>.ibo-tab-container--extra-tabs-list-toggler{width:100%;justify-content:left}.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tab-container{flex-grow:1;margin-left:unset}.ibo-panel.ibo-has-sticky-header>.ibo-panel--body>.ibo-tab-container>.ibo-tab-container--tabs-list.ibo-is-sticking{position:fixed;z-index:10}.ibo-panel.ibo-has-sticky-header>.ibo-panel--body>.ibo-tab-container:not(.ibo-is-vertical)>.ibo-tab-container--tabs-list.ibo-is-sticking{padding-left:0}.ibo-panel.ibo-has-sticky-header>.ibo-panel--body>.ibo-tab-container:not(.ibo-is-vertical)>.ibo-tab-container--tabs-list.ibo-is-sticking .ibo-tab-container--tab-toggler,.ibo-panel.ibo-has-sticky-header>.ibo-panel--body>.ibo-tab-container:not(.ibo-is-vertical)>.ibo-tab-container--tabs-list.ibo-is-sticking .ibo-tab-container--extra-tabs-list-toggler,.ibo-panel.ibo-has-sticky-header>.ibo-panel--body>.ibo-tab-container:not(.ibo-is-vertical)>.ibo-tab-container--tabs-list.ibo-is-sticking .ibo-tab-container--extra-tabs-list-toggler{font-size:1rem}.ibo-block-list--medallion{flex-direction:column;align-items:center}.ibo-block-list--medallion>.ibo-medallion-icon--image{margin:0 auto}.ibo-block-list--medallion>.ibo-medallion-icon--image~.ibo-medallion-icon--description{margin-top:12px}.ibo-block-list--medallion>.ibo-medallion-icon--description{flex-grow:1;text-align:center}.ibo-datatable .ibo-field-badge{margin:0;padding:0;color:unset;background-color:unset}.ibo-datatable .ibo-field-badge::before{content:"";display:inline-flex;margin-right:0.5rem;width:10px;height:10px;min-width:10px;min-height:10px;background-color:var(--ibo-main-color)}.ibo-datatable .ibo-field-badge .ibo-field-badge--decoration{display:none}.ibo-datatable .ibo-field-badge .ibo-field-badge--decoration+.ibo-field-badge--label{margin-left:unset}.ui-dialog .blockUI.blockOverlay{background-color:white}.ibo-datatable .blockUI.blockOverlay{background-color:white}.ibo-datatable .blockUI.blockMsg{font-size:2em}.ibo-badge+.ibo-badge{margin-left:4px}.ibo-extension-details+.ibo-extension-details,.ibo-extension-details--information--description .ibo-extension-details{margin-top:8px}.ibo-svg-illustration--container>svg *[fill="#6c63ff"]{fill:#ea7d1e}.ibo-navigation-menu.ibo-is-active .ibo-navigation-menu--drawer{transform:translate3d(0, 0, 0)}.switch{position:relative;display:inline-block;width:36px;height:20px;vertical-align:baseline}.switch input{display:none}.slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#929fb1;transition:0.4s}.slider:before{position:absolute;content:"";height:15px;width:15px;left:3px;bottom:3px;background-color:#d5dde5;transition:0.4s}input:checked+.slider{background-color:#dd6c20}input:focus+.slider{box-shadow:0 0 1px #dd6c20}input:checked+.slider:before{transform:translateX(14.5px)}.slider.round{border-radius:20px}.slider.round:before{border-radius:7px}.center{text-align:center}.hidden{display:none}@keyframes progress_bar_color_ongoing{from{background-color:#FBD38D}to{background-color:#FEEBC8}}@-webkit-keyframes bg-pan-left{0%{background-position:100% 50%}100%{background-position:0 50%}}@keyframes bg-pan-left{0%{background-position:100% 50%}100%{background-position:0 50%}}body{display:flex;flex-direction:column;background-color:#f8f9fa;color:#212934;margin:0;padding:0;font-size:10pt;font-family:Tahoma, Verdana, Arial, Helvetica, serif;overflow-y:auto}h1{color:#555555;font-size:16pt}h2{color:#212934;font-size:14pt;font-weight:normal}h3{color:#1C94C4;font-size:12pt;font-weight:bold}a,.ibo-quick-create--compartment-results--element>.option:hover{color:#1c94c4;text-decoration:none}a:hover,.ibo-quick-create--compartment-results--element>.option:hover{color:#EA7D1E}.itop-setup--message{margin-top:16px}.next{width:100%;text-align:right}.v-spacer{padding-top:1em}button{margin-top:1em;padding-left:1em;padding-right:1em}p.info{padding-left:50px;background:url(../images/info-mid.png) no-repeat left -5px;min-height:48px}p.ok{padding-left:50px;background:url(../images/clean-mid.png) no-repeat left -8px;min-height:48px}p.warning{padding-left:50px;background:url(../images/messagebox_warning-mid.png) no-repeat left -5px;min-height:48px}p.error{padding-left:50px;background:url(../images/stop-mid.png) no-repeat left -5px;min-height:48px}label{cursor:pointer}td.label{text-align:left}label.read-only{color:#666;cursor:text}td.input{text-align:left}table.formTable{border:0}.wizlabel,.wizinput{color:#000;font-size:10pt}.wizhelp{color:#333;font-size:8pt}#progress{border:none;width:210px;height:26px;line-height:26px;text-align:center;margin:5px;box-shadow:inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important;border-radius:2px;background-color:#EDF2F7 !important}#progress .progress{color:#000000 !important;background-image:linear-gradient(270deg, #FBD38D 50%, #FEEBC8 55%, #FBD38D 80%) !important;animation:bg-pan-left 3s infinite both;background-size:600% 100%;border-radius:inherit}#progress .progress.progress-error{background-image:none !important;background-color:#F56565 !important;animation:none}h3.clickable{background:url(../images/plus.gif) no-repeat left;padding-left:16px;cursor:hand}h3.clickable.open{background:url(../images/minus.gif) no-repeat left;padding-left:16px;cursor:hand}.message{color:#1A202C;background-color:#F7FAFC;border-left:4px solid #4A5568;padding:10px;font-size:initial}.message>.message-title{font-weight:bold;margin-right:5px}.message.message-valid{color:#276749;background-color:#F0FFF4;border-color:#48BB78}.message.message-warning{color:#C05621;background-color:#FFFAF0;border-color:#ED8936}.message.message-error{color:#C53030;background-color:#FFF5F5;border-color:#E53E3E}*:not(.message)+.message{margin-top:6px}.text-valid{color:#276749}.text-warning{color:#C05621}.text-error{color:#C53030}fieldset{border:none;padding:0;margin:15px 0 0 0}fieldset>legend{margin-bottom:7px;padding-bottom:7px;width:100%;color:#3C3C3C;font-size:11pt;font-weight:bold;border-bottom:1px solid #D2D2D2}.module-selection-banner img{max-height:48px}.module-selection-body{overflow:auto;box-shadow:inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important;background-color:#F7FAFC;padding:10px}.module-selection-body .wiz-choice:not(:checked)~label .checked{display:none}.module-selection-body .wiz-choice:checked~label .unchecked{display:none}.ibo-extension-details:has(> .ibo-extension-details--actions>input:checked) .ibo-extension-details:has(#itop-ticket-mgmt-simple-ticket-enhanced-portal:not(:checked), #itop-ticket-mgmt-itil-enhanced-portal:not(:checked)) .ibo-extension-details--information--description::after{content:"Legacy portal is no longer part of iTop, by leaving this option unchecked your portal users won't be able to access iTop anymore.";display:block;margin-top:0.5em;font-weight:bold;color:#e60000b8}.ibo-extension-details--information--metadata{color:#404b5a}.choice-disabled{color:#6e7a8a}body{font-size:1.17rem;font-family:"Raleway"}#ibo_setup_container{width:800px;margin-left:auto;margin-right:auto;height:100%;display:flex;flex-direction:column;padding:20px 0}#ibo_setup_container pre{white-space:pre-wrap}#ibo_setup_container .ibo-title h2{margin-bottom:15px}#ibo_setup_container .ibo-setup--header{background-color:#fff;padding:0 20px;border:3px solid #ccd4db;height:80px;border-bottom:none;border-radius:3px 3px 0 0}#ibo_setup_container .ibo-setup--header .ibo-title--icon{border:0;vertical-align:middle;margin-right:20px}#ibo_setup_container .ibo-setup--body{display:flex;flex-direction:column;background-color:#fff;padding:20px;border:3px solid #ccd4db;border-top:none;flex-grow:1;overflow:auto;border-radius:0 0 3px 3px}#ibo_setup_container .ibo-setup--body .ibo-setup--wizard{width:100%;display:flex;flex-direction:column;height:100%}#ibo_setup_container .ibo-setup--body .ibo-setup--wizard .ibo-setup--wizard--content{overflow:auto}#ibo_setup_container .ibo-setup--body .ibo-setup--wizard .ibo-setup--wizard--buttons-container{margin-top:auto}#ibo_setup_container .ibo-setup--body .ibo-setup--wizard .ibo-setup--wizard--buttons-container tr{display:flex;justify-content:flex-end}#ibo_setup_container .ibo-setup--body .ibo-setup--wizard .ibo-setup--wizard--buttons-container button{margin-left:8px}#ibo_setup_container .ibo-setup--body .itop-setup--message{margin-top:16px}#ibo_setup_container .ibo-setup--body .ibo-setup--button-bar{margin-top:16px}#ibo_setup_container .ibo-setup--body .ibo-setup--button-bar .ibo-setup--button-spacer{flex-grow:1}#ibo_setup_container .ibo-setup--body .ibo-setup--js-error{overflow:auto;max-height:100px;color:#9b2c2c;font-size:1rem}#ibo_setup_container .ibo-setup--body .ibo-setup--upgrade-info{margin-top:5px}#ibo_setup_container .ibo-setup--body .ibo-fieldset,#ibo_setup_container .ibo-setup--body fieldset{margin-top:12px}#ibo_setup_container .ibo-setup--body .ibo-fieldset~.ibo-fieldset,#ibo_setup_container .ibo-setup--body fieldset~.ibo-fieldset,#ibo_setup_container .ibo-setup--body .ibo-fieldset~fieldset,#ibo_setup_container .ibo-setup--body fieldset~fieldset{margin-top:12px}#ibo_setup_container .ibo-setup--body .ibo-field{margin-top:5px}#ibo_setup_container .ibo-setup--body .ibo-setup--small-field-label .ibo-field--label{width:15%}#ibo_setup_container .ibo-setup--body .ibo-field--comments{font-size:1rem;color:#6e7a8a;text-align:left;width:100%;padding-left:10px}#ibo_setup_container .ibo-setup--body .ibo-alert{padding:7px 20px}#ibo_setup_container .ibo-setup--body .ibo-setup--small-message{font-size:1rem;color:#6e7a8a}#ibo_setup_container .ibo-setup--body .ibo-collapsible-section{margin:10px 0 0 0}#ibo_setup_container .ibo-setup--body .ibo-collapsible-section.ibo-setup--small .ibo-collapsible-section--header .ibo-collapsible-section--title{font-size:1.17rem;font-weight:400;color:#6e7a8a}#ibo_setup_container .ibo-setup--body .ibo-collapsible-section .ibo-collapsible-section--body{max-height:400px;overflow:auto}#ibo_setup_container .ibo-setup--body .ibo-input,#ibo_setup_container .ibo-setup--body .ui-autocomplete-input,#ibo_setup_container .ibo-setup--body .ui-multiselect,#ibo_setup_container .ibo-setup--body .dataTables_length select,.dataTables_length #ibo_setup_container .ibo-setup--body select,#ibo_setup_container .ibo-setup--body .ui_tpicker_hour_slider>select,#ibo_setup_container .ibo-setup--body .ui_tpicker_minute_slider>select,#ibo_setup_container .ibo-setup--body .ui_tpicker_second_slider>select,#ibo_setup_container .ibo-setup--body select.ibo-input-select-placeholder,#ibo_setup_container .ibo-setup--body .ibo-datatableconfig--attributes-panel--per-page--input,#ibo_setup_container .ibo-setup--body .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content #ibo_setup_container .ibo-setup--body input[type="text"],#ibo_setup_container .ibo-setup--body .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper #ibo_setup_container .ibo-setup--body input[type="text"]{width:auto;display:inline-block}#ibo_setup_container .ibo-setup--body table td{white-space:nowrap;line-height:2.5rem;padding-right:8px;padding-bottom:1rem}#ibo_setup_container .ibo-setup--body .setup-content-title,#ibo_setup_container .ibo-setup--body h2{margin-bottom:18px}.ibo-setup--button-bar{margin-top:16px}.ibo-setup--button-bar .ibo-setup--full-width{width:100%}.ibo-setup--button-bar .ibo-setup--full-width{width:100%}.ibo-setup-summary-title,.ibo-setup-summary-title:visited,.ibo-setup-summary-title:hover{font-size:1.17rem;color:inherit}#ibo-setup-licenses--components-list{background-color:#f2f2f2;padding:12px;box-shadow:inset 0px 2px 4px 1px rgba(0, 0, 0, 0.15)}.setup-prefix-toggler--input--container,.setup-tls--input--container,.setup-disk-location--input--container,.setup-backup--input--container{display:flex;line-height:2.5rem;margin:1rem 0}.setup-prefix-toggler--input--container input,.setup-tls--input--container input,.setup-disk-location--input--container input,.setup-backup--input--container input{margin:0 8px}.setup-disk-location--input--container input,.setup-backup--input--container input{flex-grow:1}.collapsable-options{margin-bottom:18px}.collapsable-options [data-role="setup-collapsable-options--toggler"]::before{margin-right:8px;cursor:pointer}.collapsable-options:not(.setup-is-opened) [data-role="setup-collapsable-options--toggler"]::before{content:""}.collapsable-options.setup-is-opened [data-role="setup-collapsable-options--toggler"]::before{content:""}.setup-input--hint--icon{color:#6e7a8a}.setup-invalid-field--icon{color:#c53030;margin-left:8px}.setup-accept-licenses{margin-top:18px}.module-selection-banner{display:flex}.module-selection-banner>img{margin-right:12px}.setup-end-placeholder{display:flex;flex-direction:row;align-items:center}.setup-end-placeholder>div{padding:0px 15px}.setup-end-placeholder a,.setup-end-placeholder .ibo-quick-create--compartment-results--element>.option:hover{display:flex;flex-direction:column;align-items:center}.setup-end-placeholder a svg,.setup-end-placeholder .ibo-quick-create--compartment-results--element>.option:hover svg{max-height:150px;margin-bottom:15px;width:auto}.setup-extension--icon{margin-right:5px;color:#2b6bb0;font-size:1.33rem}.setup-extension--missing .setup-extension--icon{color:#a00000}.setup-extension-tag{display:inline-flex;background-color:grey;border-radius:8px;padding-left:3px;padding-right:3px;margin-right:3px}.setup-extension-tag.installed{background-color:#9eff9e}.setup-extension-tag.notinstalled{background-color:#ed9eff}.setup-extension-tag.tobeinstalled{background-color:#9ef0ff}.setup-extension-tag.tobeuninstalled{background-color:#ff9e9e}.setup-extension-tag.notuninstallable{background-color:#ffc98c}.setup-extension-tag.removed{background-color:#969594}.ibo-extension-details{align-items:flex-start}.ibo-extension-details--actions input{margin:0.2em 0.5em;width:12px}:not(.ibo-badge)~.ibo-badge{margin-left:0.5em}.ibo-extension-details--information--label i{font-size:0.9em;margin-left:0.3em}.setup--wizard-choice--label+.setup--wizard-choice--more-info{margin-left:0.5rem}#params_summary{overflow:auto}#params_summary div{width:100%;margin-top:0;padding-top:0.5em;padding-left:0}#params_summary div ul{margin-left:0;padding-left:40px}#params_summary div.closed ul{display:none}#params_summary div li{list-style:none;width:100%;margin-left:0;padding-left:0em}.title{padding-left:20px;font-weight:bold;cursor:pointer}#params_summary div.closed .title::before{margin-right:5px;content:""}#params_summary div:not(.closed) .title::before{margin-right:5px;content:""}#progress_content{height:200px;overflow:auto;text-align:center}#fresh_content{border:0;min-height:300px;min-width:600px;display:none;margin-left:auto;margin-right:auto} \ No newline at end of file +.ck .ck-widget_with-resizer{position:relative}.ck .ck-widget__resizer{display:none;left:0;pointer-events:none;position:absolute;top:0}.ck-focused .ck-widget_with-resizer.ck-widget_selected>.ck-widget__resizer{display:block}.ck .ck-widget__resizer__handle{pointer-events:all;position:absolute}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-right,.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-left{cursor:nwse-resize}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-left,.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-right{cursor:nesw-resize}:root{--ck-resizer-size:10px;--ck-resizer-offset:calc(var(--ck-resizer-size)/-2 - 2px);--ck-resizer-border-width:1px}.ck .ck-widget__resizer{outline:1px solid var(--ck-color-resizer)}.ck .ck-widget__resizer__handle{background:var(--ck-color-focus-border);border:var(--ck-resizer-border-width) solid #fff;border-radius:var(--ck-resizer-border-radius);height:var(--ck-resizer-size);width:var(--ck-resizer-size)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-left{left:var(--ck-resizer-offset);top:var(--ck-resizer-offset)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-right{right:var(--ck-resizer-offset);top:var(--ck-resizer-offset)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-right{bottom:var(--ck-resizer-offset);right:var(--ck-resizer-offset)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-left{bottom:var(--ck-resizer-offset);left:var(--ck-resizer-offset)}.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position{display:inline;pointer-events:none;position:relative}.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position span{position:absolute;width:0}.ck.ck-editor__editable .ck-widget:-webkit-drag>.ck-widget__selection-handle,.ck.ck-editor__editable .ck-widget:-webkit-drag>.ck-widget__type-around{display:none}.ck.ck-clipboard-drop-target-line{pointer-events:none;position:absolute}:root{--ck-clipboard-drop-target-dot-width:12px;--ck-clipboard-drop-target-dot-height:8px;--ck-clipboard-drop-target-color:var(--ck-color-focus-border)}.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position span{background:var(--ck-clipboard-drop-target-color);border:1px solid var(--ck-clipboard-drop-target-color);bottom:calc(var(--ck-clipboard-drop-target-dot-height)*-.5);margin-left:-1px;top:calc(var(--ck-clipboard-drop-target-dot-height)*-.5)}.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position span:after{border-color:var(--ck-clipboard-drop-target-color) transparent transparent transparent;border-style:solid;border-width:calc(var(--ck-clipboard-drop-target-dot-height)) calc(var(--ck-clipboard-drop-target-dot-width)*.5) 0 calc(var(--ck-clipboard-drop-target-dot-width)*.5);content:"";display:block;height:0;left:50%;position:absolute;top:calc(var(--ck-clipboard-drop-target-dot-height)*-.5);transform:translateX(-50%);width:0}.ck.ck-editor__editable .ck-widget.ck-clipboard-drop-target-range{outline:var(--ck-widget-outline-thickness) solid var(--ck-clipboard-drop-target-color) !important}.ck.ck-editor__editable .ck-widget:-webkit-drag{zoom:0.6;outline:none !important}.ck.ck-clipboard-drop-target-line{background:var(--ck-clipboard-drop-target-color);border:1px solid var(--ck-clipboard-drop-target-color);height:0;margin-top:-1px}.ck.ck-clipboard-drop-target-line:before{border-style:solid;content:"";height:0;position:absolute;top:calc(var(--ck-clipboard-drop-target-dot-width)*-.5);width:0}[dir=ltr] .ck.ck-clipboard-drop-target-line:before{border-color:transparent transparent transparent var(--ck-clipboard-drop-target-color);border-width:calc(var(--ck-clipboard-drop-target-dot-width)*.5) 0 calc(var(--ck-clipboard-drop-target-dot-width)*.5) var(--ck-clipboard-drop-target-dot-height);left:-1px}[dir=rtl] .ck.ck-clipboard-drop-target-line:before{border-color:transparent var(--ck-clipboard-drop-target-color) transparent transparent;border-width:calc(var(--ck-clipboard-drop-target-dot-width)*.5) var(--ck-clipboard-drop-target-dot-height) calc(var(--ck-clipboard-drop-target-dot-width)*.5) 0;right:-1px}.ck-content .text-tiny,.ibo-is-html-content .text-tiny{font-size:0.7em}.ck-content .text-small,.ibo-is-html-content .text-small{font-size:0.85em}.ck-content .text-big,.ibo-is-html-content .text-big{font-size:1.4em}.ck-content .text-huge,.ibo-is-html-content .text-huge{font-size:1.8em}.ck.ck-heading_heading1{font-size:20px}.ck.ck-heading_heading2{font-size:17px}.ck.ck-heading_heading3{font-size:14px}.ck[class*=ck-heading_heading]{font-weight:700}.ck.ck-dropdown.ck-heading-dropdown .ck-dropdown__button .ck-button__label{width:8em}.ck.ck-dropdown.ck-heading-dropdown .ck-dropdown__panel .ck-list__item{min-width:18em}:root{--ck-highlight-marker-yellow:#fdfd77;--ck-highlight-marker-green:#62f962;--ck-highlight-marker-pink:#fc7899;--ck-highlight-marker-blue:#72ccfd;--ck-highlight-pen-red:#e71313;--ck-highlight-pen-green:#128a00}.ck-content .marker-yellow{background-color:var(--ck-highlight-marker-yellow)}.ck-content .marker-green{background-color:var(--ck-highlight-marker-green)}.ck-content .marker-pink{background-color:var(--ck-highlight-marker-pink)}.ck-content .marker-blue{background-color:var(--ck-highlight-marker-blue)}.ck-content .pen-red{background-color:transparent;color:var(--ck-highlight-pen-red)}.ck-content .pen-green,.ibo-is-html-content .pen-green{background-color:transparent;color:var(--ck-highlight-pen-green)}.ck-editor__editable .ck-horizontal-line{display:flow-root}.ck-content hr,.ibo-is-html-content hr{background:#dedede;border:0;height:4px;margin:15px 0}:root{--ck-html-object-embed-unfocused-outline-width:1px}.ck-widget.html-object-embed{background-color:var(--ck-color-base-foreground);font-size:var(--ck-font-size-base);min-width:calc(76px + var(--ck-spacing-standard));padding:var(--ck-spacing-small);padding-top:calc(var(--ck-font-size-tiny) + var(--ck-spacing-large))}.ck-widget.html-object-embed:not(.ck-widget_selected):not(:hover){outline:var(--ck-html-object-embed-unfocused-outline-width) dashed var(--ck-color-widget-blurred-border)}.ck-widget.html-object-embed:before{background:#999;border-radius:0 0 var(--ck-border-radius) var(--ck-border-radius);color:var(--ck-color-base-background);content:attr(data-html-object-embed-label);font-family:var(--ck-font-face);font-size:var(--ck-font-size-tiny);font-style:normal;font-weight:400;left:var(--ck-spacing-standard);padding:calc(var(--ck-spacing-tiny) + var(--ck-html-object-embed-unfocused-outline-width)) var(--ck-spacing-small) var(--ck-spacing-tiny);position:absolute;top:0;transition:background var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve)}.ck-widget.html-object-embed .ck-widget__type-around .ck-widget__type-around__button.ck-widget__type-around__button_before{margin-left:50px}.ck-widget.html-object-embed .html-object-embed__content{pointer-events:none}div.ck-widget.html-object-embed{margin:1em auto}span.ck-widget.html-object-embed{display:inline-block}.ck.ck-text-alternative-form{display:flex;flex-direction:row;flex-wrap:nowrap}.ck.ck-text-alternative-form .ck-labeled-field-view{display:inline-block}.ck.ck-text-alternative-form .ck-label{display:none}@media screen and (max-width:600px){.ck.ck-text-alternative-form{flex-wrap:wrap}.ck.ck-text-alternative-form .ck-labeled-field-view{flex-basis:100%}.ck.ck-text-alternative-form .ck-button{flex-basis:50%}}.ck-vertical-form .ck-button:after{bottom:-1px;content:"";position:absolute;right:-1px;top:-1px;width:0;z-index:1}.ck-vertical-form .ck-button:focus:after{display:none}@media screen and (max-width:600px){.ck.ck-responsive-form .ck-button:after{bottom:-1px;content:"";position:absolute;right:-1px;top:-1px;width:0;z-index:1}.ck.ck-responsive-form .ck-button:focus:after{display:none}}.ck-vertical-form>.ck-button:nth-last-child(2):after{border-right:1px solid var(--ck-color-base-border)}.ck.ck-responsive-form{padding:var(--ck-spacing-large)}.ck.ck-responsive-form:focus{outline:none}[dir=ltr] .ck.ck-responsive-form>:not(:first-child),[dir=rtl] .ck.ck-responsive-form>:not(:last-child){margin-left:var(--ck-spacing-standard)}@media screen and (max-width:600px){.ck.ck-responsive-form{padding:0;width:calc(var(--ck-input-width)*.8)}.ck.ck-responsive-form .ck-labeled-field-view{margin:var(--ck-spacing-large) var(--ck-spacing-large) 0}.ck.ck-responsive-form .ck-labeled-field-view .ck-input-number,.ck.ck-responsive-form .ck-labeled-field-view .ck-input-text{min-width:0;width:100%}.ck.ck-responsive-form .ck-labeled-field-view .ck-labeled-field-view__error{white-space:normal}.ck.ck-responsive-form>.ck-button:nth-last-child(2):after{border-right:1px solid var(--ck-color-base-border)}.ck.ck-responsive-form>.ck-button:last-child,.ck.ck-responsive-form>.ck-button:nth-last-child(2){border-radius:0;margin-top:var(--ck-spacing-large);padding:var(--ck-spacing-standard)}.ck.ck-responsive-form>.ck-button:last-child:not(:focus),.ck.ck-responsive-form>.ck-button:nth-last-child(2):not(:focus){border-top:1px solid var(--ck-color-base-border)}[dir=ltr] .ck.ck-responsive-form>.ck-button:last-child,[dir=ltr] .ck.ck-responsive-form>.ck-button:nth-last-child(2),[dir=rtl] .ck.ck-responsive-form>.ck-button:last-child,[dir=rtl] .ck.ck-responsive-form>.ck-button:nth-last-child(2){margin-left:0}[dir=rtl] .ck.ck-responsive-form>.ck-button:last-child:last-of-type,[dir=rtl] .ck.ck-responsive-form>.ck-button:nth-last-child(2):last-of-type{border-right:1px solid var(--ck-color-base-border)}}.ck.ck-editor__editable img.image_placeholder{background-size:100% 100%}.ck.ck-image-insert-url .ck-image-insert-url__action-row{display:grid;grid-template-columns:repeat(2, 1fr)}:root{--ck-image-insert-insert-by-url-width:250px}.ck.ck-image-insert-url{--ck-input-width:100%}.ck.ck-image-insert-url .ck-image-insert-url__action-row{grid-column-gap:var(--ck-spacing-large);margin-top:var(--ck-spacing-large)}.ck.ck-image-insert-url .ck-image-insert-url__action-row .ck-button-cancel,.ck.ck-image-insert-url .ck-image-insert-url__action-row .ck-button-save{justify-content:center;min-width:auto}.ck.ck-image-insert-url .ck-image-insert-url__action-row .ck-button .ck-button__label{color:var(--ck-color-text)}.ck.ck-image-insert-form>.ck.ck-button{display:block;padding:var(--ck-list-button-padding);width:100%}[dir=ltr] .ck.ck-image-insert-form>.ck.ck-button{text-align:left}[dir=rtl] .ck.ck-image-insert-form>.ck.ck-button{text-align:right}.ck.ck-image-insert-form>.ck.ck-collapsible:not(:first-child){border-top:1px solid var(--ck-color-base-border)}.ck.ck-image-insert-form>.ck.ck-collapsible:not(:last-child){border-bottom:1px solid var(--ck-color-base-border)}.ck.ck-image-insert-form>.ck.ck-collapsible,.ck.ck-image-insert-form>.ck.ck-image-insert-url{min-width:var(--ck-image-insert-insert-by-url-width)}.ck.ck-image-insert-form>.ck.ck-image-insert-url{padding:var(--ck-spacing-large)}.ck.ck-image-insert-form:focus{outline:none}.ck-content .image,.ibo-is-html-content .image{clear:both;display:table;margin:0.9em auto;min-width:50px;text-align:center}.ck-content .image img,.ibo-is-html-content .image img{display:block;height:auto;margin:0 auto;max-width:100%;min-width:100%}.ck-content .image-inline,.ibo-is-html-content .image-inline{align-items:flex-start;display:inline-flex;max-width:100%}.ck-content .image-inline picture,.ibo-is-html-content .image-inline picture{display:flex}.ck-content .image-inline img,.ibo-is-html-content .image-inline img,.ck-content .image-inline picture,.ibo-is-html-content .image-inline picture{flex-grow:1;flex-shrink:1;max-width:100%}.ck.ck-editor__editable .image>figcaption.ck-placeholder:before{overflow:hidden;padding-left:inherit;padding-right:inherit;text-overflow:ellipsis;white-space:nowrap}.ck.ck-editor__editable .image{z-index:1}.ck.ck-editor__editable .image.ck-widget_selected{z-index:2}.ck.ck-editor__editable .image-inline{z-index:1}.ck.ck-editor__editable .image-inline.ck-widget_selected{z-index:2}.ck.ck-editor__editable .image-inline.ck-widget_selected ::selection{display:none}.ck.ck-editor__editable .image-inline img{height:auto}.ck.ck-editor__editable td .image-inline img,.ck.ck-editor__editable th .image-inline img{max-width:none}:root{--ck-color-image-caption-background:#f7f7f7;--ck-color-image-caption-text:#333;--ck-color-image-caption-highlighted-background:#fd0}.ck-content .image>figcaption{background-color:var(--ck-color-image-caption-background);caption-side:bottom;color:var(--ck-color-image-caption-text);display:table-caption;font-size:0.75em;outline-offset:-1px;padding:0.6em;word-break:break-word}@media (forced-colors:active){.ck-content .image>figcaption,.ibo-is-html-content .image>figcaption{background-color:unset;color:unset}}@media (forced-colors:none){.ck.ck-editor__editable .image>figcaption.image__caption_highlighted{animation:ck-image-caption-highlight 0.6s ease-out}}@media (prefers-reduced-motion:reduce){.ck.ck-editor__editable .image>figcaption.image__caption_highlighted{animation:none}}@keyframes ck-image-caption-highlight{0%{background-color:var(--ck-color-image-caption-highlighted-background)}to{background-color:var(--ck-color-image-caption-background)}}.ck.ck-editor__editable .image,.ck.ck-editor__editable .image-inline{position:relative}.ck.ck-editor__editable .image .ck-progress-bar,.ck.ck-editor__editable .image-inline .ck-progress-bar{left:0;position:absolute;top:0}.ck.ck-editor__editable .image-inline.ck-appear,.ck.ck-editor__editable .image.ck-appear{animation:fadeIn 0.7s}@media (prefers-reduced-motion:reduce){.ck.ck-editor__editable .image-inline.ck-appear,.ck.ck-editor__editable .image.ck-appear{animation:none;opacity:1}}.ck.ck-editor__editable .image .ck-progress-bar,.ck.ck-editor__editable .image-inline .ck-progress-bar{background:var(--ck-color-upload-bar-background);height:2px;transition:width 0.1s;width:0}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.ck-image-upload-complete-icon{border-radius:50%;display:block;position:absolute;right:min(var(--ck-spacing-medium), 6%);top:min(var(--ck-spacing-medium), 6%);z-index:1}.ck-image-upload-complete-icon:after{content:"";position:absolute}:root{--ck-color-image-upload-icon:#fff;--ck-color-image-upload-icon-background:#008a00;--ck-image-upload-icon-size:20;--ck-image-upload-icon-width:2px;--ck-image-upload-icon-is-visible:clamp(0px,100% - 50px,1px)}.ck-image-upload-complete-icon{animation-delay:0ms,3s;animation-duration:0.5s, 0.5s;animation-fill-mode:forwards, forwards;animation-name:ck-upload-complete-icon-show, ck-upload-complete-icon-hide;background:var(--ck-color-image-upload-icon-background);font-size:calc(1px*var(--ck-image-upload-icon-size));height:calc(var(--ck-image-upload-icon-is-visible)*var(--ck-image-upload-icon-size));opacity:0;overflow:hidden;width:calc(var(--ck-image-upload-icon-is-visible)*var(--ck-image-upload-icon-size))}.ck-image-upload-complete-icon:after{animation-delay:0.5s;animation-duration:0.5s;animation-fill-mode:forwards;animation-name:ck-upload-complete-icon-check;border-right:var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);border-top:var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);box-sizing:border-box;height:0;left:25%;opacity:0;top:50%;transform:scaleX(-1) rotate(135deg);transform-origin:left top;width:0}@media (prefers-reduced-motion:reduce){.ck-image-upload-complete-icon{animation-duration:0ms}.ck-image-upload-complete-icon:after{animation:none;height:0.45em;opacity:1;width:0.3em}}@keyframes ck-upload-complete-icon-show{0%{opacity:0}to{opacity:1}}@keyframes ck-upload-complete-icon-hide{0%{opacity:1}to{opacity:0}}@keyframes ck-upload-complete-icon-check{0%{height:0;opacity:1;width:0}33%{height:0;width:0.3em}to{height:0.45em;opacity:1;width:0.3em}}.ck .ck-upload-placeholder-loader{align-items:center;display:flex;justify-content:center;left:0;position:absolute;top:0}.ck .ck-upload-placeholder-loader:before{content:"";position:relative}:root{--ck-color-upload-placeholder-loader:#b3b3b3;--ck-upload-placeholder-loader-size:32px;--ck-upload-placeholder-image-aspect-ratio:2.8}.ck .ck-image-upload-placeholder{margin:0;width:100%}.ck .ck-image-upload-placeholder.image-inline{width:calc(var(--ck-upload-placeholder-loader-size)*2*var(--ck-upload-placeholder-image-aspect-ratio))}.ck .ck-image-upload-placeholder img{aspect-ratio:var(--ck-upload-placeholder-image-aspect-ratio)}.ck .ck-upload-placeholder-loader{height:100%;width:100%}.ck .ck-upload-placeholder-loader:before{animation:ck-upload-placeholder-loader 1s linear infinite;border-radius:50%;border-right:2px solid transparent;border-top:3px solid var(--ck-color-upload-placeholder-loader);height:var(--ck-upload-placeholder-loader-size);width:var(--ck-upload-placeholder-loader-size)}@keyframes ck-upload-placeholder-loader{to{transform:rotate(1turn)}}.ck.ck-image-custom-resize-form{align-items:flex-start;display:flex;flex-direction:row;flex-wrap:nowrap}.ck.ck-image-custom-resize-form .ck-labeled-field-view{display:inline-block}.ck.ck-image-custom-resize-form .ck-label{display:none}@media screen and (max-width:600px){.ck.ck-image-custom-resize-form{flex-wrap:wrap}.ck.ck-image-custom-resize-form .ck-labeled-field-view{flex-basis:100%}.ck.ck-image-custom-resize-form .ck-button{flex-basis:50%}}.ck-content img.image_resized,.ibo-is-html-content img.image_resized{height:auto}.ck-content .image.image_resized,.ibo-is-html-content .image.image_resized{box-sizing:border-box;display:block;max-width:100%}.ck-content .image.image_resized img,.ibo-is-html-content .image.image_resized img{width:100%}.ck-content .image.image_resized>figcaption,.ibo-is-html-content .image.image_resized>figcaption{display:block}.ck.ck-editor__editable td .image-inline.image_resized img,.ck.ck-editor__editable th .image-inline.image_resized img{max-width:100%}[dir=ltr] .ck.ck-button.ck-button_with-text.ck-resize-image-button .ck-button__icon{margin-right:var(--ck-spacing-standard)}[dir=rtl] .ck.ck-button.ck-button_with-text.ck-resize-image-button .ck-button__icon{margin-left:var(--ck-spacing-standard)}.ck.ck-dropdown .ck-button.ck-resize-image-button .ck-button__label{width:4em}:root{--ck-image-style-spacing:1.5em;--ck-inline-image-style-spacing:calc(var(--ck-image-style-spacing)/2)}.ck-content .image-style-block-align-left,.ck-content .image-style-block-align-right{max-width:calc(100% - var(--ck-image-style-spacing))}.ck-content .image-style-align-left,.ck-content .image-style-align-right{clear:none}.ck-content .image-style-side{float:right;margin-left:var(--ck-image-style-spacing);max-width:50%}.ck-content .image-style-align-left,.ibo-is-html-content .image-style-align-left{float:left;margin-right:var(--ck-image-style-spacing)}.ck-content .image-style-align-center,.ibo-is-html-content .image-style-align-center{margin-left:auto;margin-right:auto}.ck-content .image-style-align-right,.ibo-is-html-content .image-style-align-right{float:right;margin-left:var(--ck-image-style-spacing)}.ck-content .image-style-block-align-right,.ibo-is-html-content .image-style-block-align-right{margin-left:auto;margin-right:0}.ck-content .image-style-block-align-left,.ibo-is-html-content .image-style-block-align-left{margin-left:0;margin-right:auto}.ck-content p+.image-style-align-left,.ibo-is-html-content p+.image-style-align-left,.ck-content p+.image-style-align-right,.ibo-is-html-content p+.image-style-align-right,.ck-content p+.image-style-side,.ibo-is-html-content p+.image-style-side{margin-top:0}.ck-content .image-inline.image-style-align-left,.ibo-is-html-content .image-inline.image-style-align-left,.ck-content .image-inline.image-style-align-right,.ibo-is-html-content .image-inline.image-style-align-right{margin-bottom:var(--ck-inline-image-style-spacing);margin-top:var(--ck-inline-image-style-spacing)}.ck-content .image-inline.image-style-align-left,.ibo-is-html-content .image-inline.image-style-align-left{margin-right:var(--ck-inline-image-style-spacing)}.ck-content .image-inline.image-style-align-right,.ibo-is-html-content .image-inline.image-style-align-right{margin-left:var(--ck-inline-image-style-spacing)}.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__action:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover),.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__action:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover){background-color:var(--ck-color-button-on-background)}.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__action:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover):after,.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__action:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover):after{display:none}.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open:hover>.ck-splitbutton__action:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open:hover>.ck-splitbutton__arrow:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open:hover>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover){background-color:var(--ck-color-button-on-hover-background)}.ck .ck-link_selected{background:var(--ck-color-link-selected-background)}.ck .ck-link_selected span.image-inline{outline:var(--ck-widget-outline-thickness) solid var(--ck-color-link-selected-background)}.ck .ck-fake-link-selection{background:var(--ck-color-link-fake-selection)}.ck .ck-fake-link-selection_collapsed{border-right:1px solid var(--ck-color-base-text);height:100%;margin-right:-1px;outline:1px solid rgba(255, 255, 255, 0.5)}.ck.ck-link-form{align-items:flex-start;display:flex}.ck.ck-link-form .ck-label{display:none}@media screen and (max-width:600px){.ck.ck-link-form{flex-wrap:wrap}.ck.ck-link-form .ck-labeled-field-view{flex-basis:100%}.ck.ck-link-form .ck-button{flex-basis:50%}}.ck.ck-link-form_layout-vertical{display:block}.ck.ck-link-form_layout-vertical .ck-button.ck-button-cancel,.ck.ck-link-form_layout-vertical .ck-button.ck-button-save{margin-top:var(--ck-spacing-medium)}.ck.ck-link-form_layout-vertical{min-width:var(--ck-input-width);padding:0}.ck.ck-link-form_layout-vertical .ck-labeled-field-view{margin:var(--ck-spacing-large) var(--ck-spacing-large) var(--ck-spacing-small)}.ck.ck-link-form_layout-vertical .ck-labeled-field-view .ck-input-text{min-width:0;width:100%}.ck.ck-link-form_layout-vertical>.ck-button{border-radius:0;margin:0;padding:var(--ck-spacing-standard);width:50%}.ck.ck-link-form_layout-vertical>.ck-button:not(:focus){border-top:1px solid var(--ck-color-base-border)}[dir=ltr] .ck.ck-link-form_layout-vertical>.ck-button,[dir=rtl] .ck.ck-link-form_layout-vertical>.ck-button{margin-left:0}[dir=rtl] .ck.ck-link-form_layout-vertical>.ck-button:last-of-type{border-right:1px solid var(--ck-color-base-border)}.ck.ck-link-form_layout-vertical .ck.ck-list{margin:var(--ck-spacing-standard) var(--ck-spacing-large)}.ck.ck-link-form_layout-vertical .ck.ck-list .ck-button.ck-switchbutton{padding:0;width:100%}.ck.ck-link-form_layout-vertical .ck.ck-list .ck-button.ck-switchbutton:hover{background:none}.ck.ck-link-actions{display:flex;flex-direction:row;flex-wrap:nowrap}.ck.ck-link-actions .ck-link-actions__preview{display:inline-block}.ck.ck-link-actions .ck-link-actions__preview .ck-button__label{overflow:hidden}@media screen and (max-width:600px){.ck.ck-link-actions{flex-wrap:wrap}.ck.ck-link-actions .ck-link-actions__preview{flex-basis:100%}.ck.ck-link-actions .ck-button:not(.ck-link-actions__preview){flex-basis:50%}}.ck.ck-link-actions .ck-button.ck-link-actions__preview{padding-left:0;padding-right:0}.ck.ck-link-actions .ck-button.ck-link-actions__preview .ck-button__label{color:var(--ck-color-link-default);cursor:pointer;max-width:var(--ck-input-width);min-width:3em;padding:0 var(--ck-spacing-medium);text-align:center;text-overflow:ellipsis}.ck.ck-link-actions .ck-button.ck-link-actions__preview .ck-button__label:hover{text-decoration:underline}.ck.ck-link-actions .ck-button.ck-link-actions__preview,.ck.ck-link-actions .ck-button.ck-link-actions__preview:active,.ck.ck-link-actions .ck-button.ck-link-actions__preview:focus,.ck.ck-link-actions .ck-button.ck-link-actions__preview:hover{background:none}.ck.ck-link-actions .ck-button.ck-link-actions__preview:active{box-shadow:none}.ck.ck-link-actions .ck-button.ck-link-actions__preview:focus .ck-button__label{text-decoration:underline}[dir=ltr] .ck.ck-link-actions .ck-button:not(:first-child),[dir=rtl] .ck.ck-link-actions .ck-button:not(:last-child){margin-left:var(--ck-spacing-standard)}@media screen and (max-width:600px){.ck.ck-link-actions .ck-button.ck-link-actions__preview{margin:var(--ck-spacing-standard) var(--ck-spacing-standard) 0}.ck.ck-link-actions .ck-button.ck-link-actions__preview .ck-button__label{max-width:100%;min-width:0}[dir=ltr] .ck.ck-link-actions .ck-button:not(.ck-link-actions__preview),[dir=rtl] .ck.ck-link-actions .ck-button:not(.ck-link-actions__preview){margin-left:0}}.ck.ck-editor__editable a span.image-inline:after,.ck.ck-editor__editable .ibo-quick-create--compartment-results--element>.option:hover span.image-inline:after,.ck.ck-editor__editable figure.image>a:after,.ck.ck-editor__editable .ibo-quick-create--compartment-results--elementfigure>.option:hover:after,.ck.ck-editor__editable .ibo-quick-create--compartment-results--element>figure.image>.option:hover:after{display:block;position:absolute}:root{--ck-link-image-indicator-icon-size:20;--ck-link-image-indicator-icon-is-visible:clamp(0px,100% - 50px,1px)}.ck.ck-editor__editable a span.image-inline:after,.ck.ck-editor__editable figure.image>a:after{background-color:rgba(0,0,0,.4);background-image:url("data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjAgMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0iI2ZmZiIgZD0ibTExLjA3NyAxNSAuOTkxLTEuNDE2YS43NS43NSAwIDEgMSAxLjIyOS44NmwtMS4xNDggMS42NGEuNzQ4Ljc0OCAwIDAgMS0uMjE3LjIwNiA1LjI1MSA1LjI1MSAwIDAgMS04LjUwMy01Ljk1NS43NDEuNzQxIDAgMCAxIC4xMi0uMjc0bDEuMTQ3LTEuNjM5YS43NS43NSAwIDEgMSAxLjIyOC44Nkw0LjkzMyAxMC43bC4wMDYuMDAzYTMuNzUgMy43NSAwIDAgMCA2LjEzMiA0LjI5NGwuMDA2LjAwNHptNS40OTQtNS4zMzVhLjc0OC43NDggMCAwIDEtLjEyLjI3NGwtMS4xNDcgMS42MzlhLjc1Ljc1IDAgMSAxLTEuMjI4LS44NmwuODYtMS4yM2EzLjc1IDMuNzUgMCAwIDAtNi4xNDQtNC4zMDFsLS44NiAxLjIyOWEuNzUuNzUgMCAwIDEtMS4yMjktLjg2bDEuMTQ4LTEuNjRhLjc0OC43NDggMCAwIDEgLjIxNy0uMjA2IDUuMjUxIDUuMjUxIDAgMCAxIDguNTAzIDUuOTU1em0tNC41NjMtMi41MzJhLjc1Ljc1IDAgMCAxIC4xODQgMS4wNDVsLTMuMTU1IDQuNTA1YS43NS43NSAwIDEgMS0xLjIyOS0uODZsMy4xNTUtNC41MDZhLjc1Ljc1IDAgMCAxIDEuMDQ1LS4xODR6Ii8+PC9zdmc+");background-position:50%;background-repeat:no-repeat;background-size:14px;border-radius:100%;content:"";height:calc(var(--ck-link-image-indicator-icon-is-visible)*var(--ck-link-image-indicator-icon-size));overflow:hidden;right:min(var(--ck-spacing-medium), 6%);top:min(var(--ck-spacing-medium), 6%);width:calc(var(--ck-link-image-indicator-icon-is-visible)*var(--ck-link-image-indicator-icon-size))}.ck-editor__editable .ck-list-bogus-paragraph{display:block}.ck-content ol,.ibo-is-html-content ol{list-style-type:decimal}.ck-content ol ol,.ibo-is-html-content ol ol{list-style-type:lower-latin}.ck-content ol ol ol,.ibo-is-html-content ol ol ol{list-style-type:lower-roman}.ck-content ol ol ol ol,.ibo-is-html-content ol ol ol ol{list-style-type:upper-latin}.ck-content ol ol ol ol ol,.ibo-is-html-content ol ol ol ol ol{list-style-type:upper-roman}.ck-content ul,.ibo-is-html-content ul{list-style-type:disc}.ck-content ul ul,.ibo-is-html-content ul ul{list-style-type:circle}.ck-content ul ul ul,.ibo-is-html-content ul ul ul,.ck-content ul ul ul ul,.ibo-is-html-content ul ul ul ul{list-style-type:square}.ck.ck-list-properties.ck-list-properties_without-styles{padding:var(--ck-spacing-large)}.ck.ck-list-properties.ck-list-properties_without-styles>*{min-width:14em}.ck.ck-list-properties.ck-list-properties_without-styles>*+*{margin-top:var(--ck-spacing-standard)}.ck.ck-list-properties.ck-list-properties_with-numbered-properties>.ck-list-styles-list{grid-template-columns:repeat(4, auto)}.ck.ck-list-properties.ck-list-properties_with-numbered-properties>.ck-collapsible{border-top:1px solid var(--ck-color-base-border)}.ck.ck-list-properties.ck-list-properties_with-numbered-properties>.ck-collapsible>.ck-collapsible__children>*{width:100%}.ck.ck-list-properties.ck-list-properties_with-numbered-properties>.ck-collapsible>.ck-collapsible__children>*+*{margin-top:var(--ck-spacing-standard)}.ck.ck-list-properties .ck.ck-numbered-list-properties__start-index .ck-input{min-width:auto;width:100%}.ck.ck-list-properties .ck.ck-numbered-list-properties__reversed-order{background:transparent;margin-bottom:calc(var(--ck-spacing-tiny)*-1);padding-left:0;padding-right:0}.ck.ck-list-properties .ck.ck-numbered-list-properties__reversed-order:active,.ck.ck-list-properties .ck.ck-numbered-list-properties__reversed-order:hover{background:none;border-color:transparent;box-shadow:none}.ck.ck-list-styles-list{display:grid}:root{--ck-list-style-button-size:44px}.ck.ck-list-styles-list{column-gap:var(--ck-spacing-medium);grid-template-columns:repeat(3, auto);padding:var(--ck-spacing-large);row-gap:var(--ck-spacing-medium)}.ck.ck-list-styles-list .ck-button{box-sizing:content-box;margin:0;padding:0}.ck.ck-list-styles-list .ck-button,.ck.ck-list-styles-list .ck-button .ck-icon{height:var(--ck-list-style-button-size);width:var(--ck-list-style-button-size)}:root{--ck-todo-list-checkmark-size:16px}.ck-content .todo-list{list-style:none}.ck-content .todo-list li{margin-bottom:5px;position:relative}.ck-content .todo-list li .todo-list,.ibo-is-html-content .todo-list li .todo-list{margin-top:5px}.ck-content .todo-list .todo-list__label>input,.ibo-is-html-content .todo-list .todo-list__label>input{-webkit-appearance:none;border:0;display:inline-block;height:var(--ck-todo-list-checkmark-size);left:-25px;margin-left:0;margin-right:-15px;position:relative;right:0;vertical-align:middle;width:var(--ck-todo-list-checkmark-size)}.ck-content[dir=rtl] .todo-list .todo-list__label>input,.ibo-is-html-content[dir=rtl] .todo-list .todo-list__label>input{left:0;margin-left:-15px;margin-right:0;right:-25px}.ck-content .todo-list .todo-list__label>input:before,.ibo-is-html-content .todo-list .todo-list__label>input:before{border:1px solid #333;border-radius:2px;box-sizing:border-box;content:"";display:block;height:100%;position:absolute;transition:box-shadow 0.25s ease-in-out;width:100%}@media (prefers-reduced-motion:reduce){.ck-content .todo-list .todo-list__label>input:before,.ibo-is-html-content .todo-list .todo-list__label>input:before{transition:none}}.ck-content .todo-list .todo-list__label>input:after,.ibo-is-html-content .todo-list .todo-list__label>input:after{border-color:transparent;border-style:solid;border-width:0 calc(var(--ck-todo-list-checkmark-size)/8) calc(var(--ck-todo-list-checkmark-size)/8) 0;box-sizing:content-box;content:"";display:block;height:calc(var(--ck-todo-list-checkmark-size)/2.6);left:calc(var(--ck-todo-list-checkmark-size)/3);pointer-events:none;position:absolute;top:calc(var(--ck-todo-list-checkmark-size)/5.3);transform:rotate(45deg);width:calc(var(--ck-todo-list-checkmark-size)/5.3)}.ck-content .todo-list .todo-list__label>input[checked]:before,.ibo-is-html-content .todo-list .todo-list__label>input[checked]:before{background:#26ab33;border-color:#26ab33}.ck-content .todo-list .todo-list__label>input[checked]:after,.ibo-is-html-content .todo-list .todo-list__label>input[checked]:after{border-color:#fff}.ck-content .todo-list .todo-list__label .todo-list__label__description,.ibo-is-html-content .todo-list .todo-list__label .todo-list__label__description{vertical-align:middle}.ck-content .todo-list .todo-list__label.todo-list__label_without-description input[type=checkbox],.ibo-is-html-content .todo-list .todo-list__label.todo-list__label_without-description input[type=checkbox]{position:absolute}.ck-editor__editable.ck-content .todo-list .todo-list__label>input,.ck-editor__editable.ibo-is-html-content .todo-list .todo-list__label>input,.ck-editor__editable.ck-content .todo-list .todo-list__label>span[contenteditable=false]>input,.ck-editor__editable.ibo-is-html-content .todo-list .todo-list__label>span[contenteditable=false]>input{cursor:pointer}.ck-editor__editable.ck-content .todo-list .todo-list__label>input:hover:before,.ck-editor__editable.ibo-is-html-content .todo-list .todo-list__label>input:hover:before,.ck-editor__editable.ck-content .todo-list .todo-list__label>span[contenteditable=false]>input:hover:before,.ck-editor__editable.ibo-is-html-content .todo-list .todo-list__label>span[contenteditable=false]>input:hover:before{box-shadow:0 0 0 5px rgba(0, 0, 0, 0.1)}.ck-editor__editable.ck-content .todo-list .todo-list__label>span[contenteditable=false]>input,.ck-editor__editable.ibo-is-html-content .todo-list .todo-list__label>span[contenteditable=false]>input{-webkit-appearance:none;border:0;display:inline-block;height:var(--ck-todo-list-checkmark-size);left:-25px;margin-left:0;margin-right:-15px;position:relative;right:0;vertical-align:middle;width:var(--ck-todo-list-checkmark-size)}.ck-editor__editable.ck-content[dir=rtl] .todo-list .todo-list__label>span[contenteditable=false]>input,.ck-editor__editable.ibo-is-html-content[dir=rtl] .todo-list .todo-list__label>span[contenteditable=false]>input{left:0;margin-left:-15px;margin-right:0;right:-25px}.ck-editor__editable.ck-content .todo-list .todo-list__label>span[contenteditable=false]>input:before,.ck-editor__editable.ibo-is-html-content .todo-list .todo-list__label>span[contenteditable=false]>input:before{border:1px solid #333;border-radius:2px;box-sizing:border-box;content:"";display:block;height:100%;position:absolute;transition:box-shadow 0.25s ease-in-out;width:100%}@media (prefers-reduced-motion:reduce){.ck-editor__editable.ck-content .todo-list .todo-list__label>span[contenteditable=false]>input:before,.ck-editor__editable.ibo-is-html-content .todo-list .todo-list__label>span[contenteditable=false]>input:before{transition:none}}.ck-editor__editable.ck-content .todo-list .todo-list__label>span[contenteditable=false]>input:after,.ck-editor__editable.ibo-is-html-content .todo-list .todo-list__label>span[contenteditable=false]>input:after{border-color:transparent;border-style:solid;border-width:0 calc(var(--ck-todo-list-checkmark-size)/8) calc(var(--ck-todo-list-checkmark-size)/8) 0;box-sizing:content-box;content:"";display:block;height:calc(var(--ck-todo-list-checkmark-size)/2.6);left:calc(var(--ck-todo-list-checkmark-size)/3);pointer-events:none;position:absolute;top:calc(var(--ck-todo-list-checkmark-size)/5.3);transform:rotate(45deg);width:calc(var(--ck-todo-list-checkmark-size)/5.3)}.ck-editor__editable.ck-content .todo-list .todo-list__label>span[contenteditable=false]>input[checked]:before,.ck-editor__editable.ibo-is-html-content .todo-list .todo-list__label>span[contenteditable=false]>input[checked]:before{background:#26ab33;border-color:#26ab33}.ck-editor__editable.ck-content .todo-list .todo-list__label>span[contenteditable=false]>input[checked]:after,.ck-editor__editable.ibo-is-html-content .todo-list .todo-list__label>span[contenteditable=false]>input[checked]:after{border-color:#fff}.ck-editor__editable.ck-content .todo-list .todo-list__label.todo-list__label_without-description input[type=checkbox],.ck-editor__editable.ibo-is-html-content .todo-list .todo-list__label.todo-list__label_without-description input[type=checkbox]{position:absolute}:root{--ck-mention-list-max-height:300px}.ck.ck-mentions{max-height:var(--ck-mention-list-max-height);overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.ck.ck-mentions>.ck-list__item{flex-shrink:0;overflow:hidden}:root{--ck-color-mention-background:rgba(153,0,48,.1);--ck-color-mention-text:#990030}.ck-content .mention{background:var(--ck-color-mention-background);color:var(--ck-color-mention-text)}:root{--ck-color-selector-focused-cell-background:rgba(158,201,250,.3)}.ck-widget.table td.ck-editor__nested-editable.ck-editor__nested-editable_focused,.ck-widget.table td.ck-editor__nested-editable:focus,.ck-widget.table th.ck-editor__nested-editable.ck-editor__nested-editable_focused,.ck-widget.table th.ck-editor__nested-editable:focus{background:var(--ck-color-selector-focused-cell-background);border-style:none;outline:1px solid var(--ck-color-focus-border);outline-offset:-1px}.ck .ck-insert-table-dropdown__grid{display:flex;flex-direction:row;flex-wrap:wrap}:root{--ck-insert-table-dropdown-padding:10px;--ck-insert-table-dropdown-box-height:11px;--ck-insert-table-dropdown-box-width:12px;--ck-insert-table-dropdown-box-margin:1px}.ck .ck-insert-table-dropdown__grid{padding:var(--ck-insert-table-dropdown-padding) var(--ck-insert-table-dropdown-padding) 0;width:calc(var(--ck-insert-table-dropdown-box-width)*10 + var(--ck-insert-table-dropdown-box-margin)*20 + var(--ck-insert-table-dropdown-padding)*2)}.ck .ck-insert-table-dropdown__label,.ck[dir=rtl] .ck-insert-table-dropdown__label{text-align:center}.ck .ck-insert-table-dropdown-grid-box{border:1px solid var(--ck-color-base-border);border-radius:1px;margin:var(--ck-insert-table-dropdown-box-margin);min-height:var(--ck-insert-table-dropdown-box-height);min-width:var(--ck-insert-table-dropdown-box-width);outline:none;transition:none}@media (prefers-reduced-motion:reduce){.ck .ck-insert-table-dropdown-grid-box{transition:none}}.ck .ck-insert-table-dropdown-grid-box:focus{box-shadow:none}.ck .ck-insert-table-dropdown-grid-box.ck-on{background:var(--ck-color-focus-outer-shadow);border-color:var(--ck-color-focus-border)}:root{--ck-table-selected-cell-background:rgba(158,207,250,.3)}.ck.ck-editor__editable .table table td.ck-editor__editable_selected,.ck.ck-editor__editable .table table th.ck-editor__editable_selected{box-shadow:unset;caret-color:transparent;outline:unset;position:relative}.ck.ck-editor__editable .table table td.ck-editor__editable_selected:after,.ck.ck-editor__editable .table table th.ck-editor__editable_selected:after{background-color:var(--ck-table-selected-cell-background);bottom:0;content:"";left:0;pointer-events:none;position:absolute;right:0;top:0}.ck.ck-editor__editable .table table td.ck-editor__editable_selected ::selection,.ck.ck-editor__editable .table table td.ck-editor__editable_selected:focus,.ck.ck-editor__editable .table table th.ck-editor__editable_selected ::selection,.ck.ck-editor__editable .table table th.ck-editor__editable_selected:focus{background-color:transparent}.ck.ck-editor__editable .table table td.ck-editor__editable_selected .ck-widget,.ck.ck-editor__editable .table table th.ck-editor__editable_selected .ck-widget{outline:unset}.ck.ck-editor__editable .table table td.ck-editor__editable_selected .ck-widget>.ck-widget__selection-handle,.ck.ck-editor__editable .table table th.ck-editor__editable_selected .ck-widget>.ck-widget__selection-handle{display:none}.ck-content .table,.ibo-is-html-content .table{display:table;margin:0.9em auto}.ck-content .table table,.ibo-is-html-content .table table{border:1px double #b3b3b3;border-collapse:collapse;border-spacing:0;height:100%;width:100%}.ck-content .table table td,.ibo-is-html-content .table table td,.ck-content .table table th,.ibo-is-html-content .table table th{border:1px solid #bfbfbf;min-width:2em;padding:0.4em}.ck-content .table table th,.ibo-is-html-content .table table th{background:rgba(0, 0, 0, 0.05);font-weight:700}.ck-content[dir=rtl] .table th,.ibo-is-html-content[dir=rtl] .table th{text-align:right}.ck-content[dir=ltr] .table th,.ibo-is-html-content[dir=ltr] .table th{text-align:left}.ck-editor__editable .ck-table-bogus-paragraph{display:inline-block;width:100%}.ck.ck-input-color{display:flex;flex-direction:row-reverse;width:100%}.ck.ck-input-color>input.ck.ck-input-text{flex-grow:1;min-width:auto}.ck.ck-input-color>div.ck.ck-dropdown{min-width:auto}.ck.ck-input-color>div.ck.ck-dropdown>.ck-input-color__button .ck-dropdown__arrow{display:none}.ck.ck-input-color .ck.ck-input-color__button{display:flex}.ck.ck-input-color .ck.ck-input-color__button .ck.ck-input-color__button__preview{overflow:hidden;position:relative}.ck.ck-input-color .ck.ck-input-color__button .ck.ck-input-color__button__preview>.ck.ck-input-color__button__preview__no-color-indicator{display:block;position:absolute}[dir=ltr] .ck.ck-input-color>.ck.ck-input-text{border-bottom-right-radius:0;border-top-right-radius:0}[dir=rtl] .ck.ck-input-color>.ck.ck-input-text{border-bottom-left-radius:0;border-top-left-radius:0}.ck.ck-input-color>.ck.ck-input-text:focus{z-index:0}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button{padding:0}[dir=ltr] .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button{border-bottom-left-radius:0;border-top-left-radius:0}[dir=ltr] .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button:not(:focus){border-left:1px solid transparent}[dir=rtl] .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button{border-bottom-right-radius:0;border-top-right-radius:0}[dir=rtl] .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button:not(:focus){border-right:1px solid transparent}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button.ck-disabled{background:var(--ck-color-input-disabled-background)}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview{border-radius:0}.ck-rounded-corners .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview,.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview{border:1px solid var(--ck-color-input-border);height:20px;width:20px}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview>.ck.ck-input-color__button__preview__no-color-indicator{background:red;border-radius:2px;height:150%;left:50%;top:-30%;transform:rotate(45deg);transform-origin:50%;width:8%}.ck.ck-input-color .ck.ck-input-color__remove-color{border-bottom-left-radius:0;border-bottom-right-radius:0;padding:calc(var(--ck-spacing-standard)/2) var(--ck-spacing-standard);width:100%}.ck.ck-input-color .ck.ck-input-color__remove-color:not(:focus){border-bottom:1px solid var(--ck-color-input-border)}[dir=ltr] .ck.ck-input-color .ck.ck-input-color__remove-color{border-top-right-radius:0}[dir=rtl] .ck.ck-input-color .ck.ck-input-color__remove-color{border-top-left-radius:0}.ck.ck-input-color .ck.ck-input-color__remove-color .ck.ck-icon{margin-right:var(--ck-spacing-standard)}[dir=rtl] .ck.ck-input-color .ck.ck-input-color__remove-color .ck.ck-icon{margin-left:var(--ck-spacing-standard);margin-right:0}.ck.ck-form__row{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-between}.ck.ck-form__row>:not(.ck-label){flex-grow:1}.ck.ck-form__row.ck-table-form__action-row .ck-button-cancel,.ck.ck-form__row.ck-table-form__action-row .ck-button-save{justify-content:center}.ck.ck-form__row{padding:var(--ck-spacing-standard) var(--ck-spacing-large) 0}[dir=ltr] .ck.ck-form__row>:not(.ck-label)+*{margin-left:var(--ck-spacing-large)}[dir=rtl] .ck.ck-form__row>:not(.ck-label)+*{margin-right:var(--ck-spacing-large)}.ck.ck-form__row>.ck-label{min-width:100%;width:100%}.ck.ck-form__row.ck-table-form__action-row{margin-top:var(--ck-spacing-large)}.ck.ck-form__row.ck-table-form__action-row .ck-button .ck-button__label{color:var(--ck-color-text)}.ck.ck-form{padding:0 0 var(--ck-spacing-large)}.ck.ck-form:focus{outline:none}.ck.ck-form .ck.ck-input-text{min-width:100%;width:0}.ck.ck-form .ck.ck-dropdown{min-width:100%}.ck.ck-form .ck.ck-dropdown .ck-dropdown__button:not(:focus){border:1px solid var(--ck-color-base-border)}.ck.ck-form .ck.ck-dropdown .ck-dropdown__button .ck-button__label{width:100%}.ck.ck-table-form .ck-form__row.ck-table-form__background-row,.ck.ck-table-form .ck-form__row.ck-table-form__border-row{flex-wrap:wrap}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row{align-items:center;flex-wrap:wrap}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-labeled-field-view{align-items:center;display:flex;flex-direction:column-reverse}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-labeled-field-view .ck.ck-dropdown,.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimension-operator{flex-grow:0}.ck.ck-table-form .ck.ck-labeled-field-view{position:relative}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{bottom:calc(var(--ck-table-properties-error-arrow-size)*-1);left:50%;position:absolute;transform:translate(-50%, 100%);z-index:1}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status:after{content:"";left:50%;position:absolute;top:calc(var(--ck-table-properties-error-arrow-size)*-1);transform:translateX(-50%)}:root{--ck-table-properties-error-arrow-size:6px;--ck-table-properties-min-error-width:150px}.ck.ck-table-form .ck-form__row.ck-table-form__border-row .ck-labeled-field-view>.ck-label{font-size:var(--ck-font-size-tiny);text-align:center}.ck.ck-table-form .ck-form__row.ck-table-form__border-row .ck-table-form__border-style,.ck.ck-table-form .ck-form__row.ck-table-form__border-row .ck-table-form__border-width{max-width:80px;min-width:80px;width:80px}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row{padding:0}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimensions-row__height,.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimensions-row__width{margin:0}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimension-operator{align-self:flex-end;display:inline-block;height:var(--ck-ui-component-min-height);line-height:var(--ck-ui-component-min-height);margin:0 var(--ck-spacing-small)}.ck.ck-table-form .ck.ck-labeled-field-view{padding-top:var(--ck-spacing-standard)}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{border-radius:0}.ck-rounded-corners .ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status,.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{background:var(--ck-color-base-error);color:var(--ck-color-base-background);min-width:var(--ck-table-properties-min-error-width);padding:var(--ck-spacing-small) var(--ck-spacing-medium);text-align:center}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status:after{border-color:transparent transparent var(--ck-color-base-error) transparent;border-style:solid;border-width:0 var(--ck-table-properties-error-arrow-size) var(--ck-table-properties-error-arrow-size) var(--ck-table-properties-error-arrow-size)}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{animation:ck-table-form-labeled-view-status-appear 0.15s ease both}@media (prefers-reduced-motion:reduce){.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{animation:none}}.ck.ck-table-form .ck.ck-labeled-field-view .ck-input.ck-error:not(:focus)+.ck.ck-labeled-field-view__status{display:none}@keyframes ck-table-form-labeled-view-status-appear{0%{opacity:0}to{opacity:1}}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__alignment-row{flex-wrap:wrap}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__alignment-row .ck.ck-toolbar:first-of-type{flex-grow:0.57}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__alignment-row .ck.ck-toolbar:last-of-type{flex-grow:0.43}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__alignment-row .ck.ck-toolbar .ck-button{flex-grow:1}.ck.ck-table-cell-properties-form{width:320px}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__padding-row{align-self:flex-end;padding:0;width:25%}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__alignment-row .ck.ck-toolbar{background:none;margin-top:var(--ck-spacing-standard)}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row{align-content:baseline;flex-basis:0;flex-wrap:wrap}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row .ck.ck-toolbar .ck-toolbar__items{flex-wrap:nowrap}.ck.ck-table-properties-form{width:320px}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row{align-self:flex-end;padding:0}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row .ck.ck-toolbar{background:none;margin-top:var(--ck-spacing-standard)}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row .ck.ck-toolbar .ck-toolbar__items>*{width:40px}:root{--ck-color-selector-caption-background:#f7f7f7;--ck-color-selector-caption-text:#333;--ck-color-selector-caption-highlighted-background:#fd0}.ck-content .table>figcaption{background-color:var(--ck-color-selector-caption-background);caption-side:top;color:var(--ck-color-selector-caption-text);display:table-caption;font-size:0.75em;outline-offset:-1px;padding:0.6em;text-align:center;word-break:break-word}@media (forced-colors:active){.ck-content .table>figcaption,.ibo-is-html-content .table>figcaption{background-color:unset;color:unset}}@media (forced-colors:none){.ck.ck-editor__editable .table>figcaption.table__caption_highlighted{animation:ck-table-caption-highlight 0.6s ease-out}}.ck.ck-editor__editable .table>figcaption.ck-placeholder:before{overflow:hidden;padding-left:inherit;padding-right:inherit;text-overflow:ellipsis;white-space:nowrap}@keyframes ck-table-caption-highlight{0%{background-color:var(--ck-color-selector-caption-highlighted-background)}to{background-color:var(--ck-color-selector-caption-background)}}:root{--ck-color-selector-column-resizer-hover:var(--ck-color-base-active);--ck-table-column-resizer-width:7px;--ck-table-column-resizer-position-offset:calc(var(--ck-table-column-resizer-width)*-0.5 - 0.5px)}.ck-content .table .ck-table-resized{table-layout:fixed}.ck-content .table table{overflow:hidden}.ck-content .table td,.ck-content .table th{overflow-wrap:break-word;position:relative}.ck.ck-editor__editable .table .ck-table-column-resizer{bottom:0;cursor:col-resize;position:absolute;right:var(--ck-table-column-resizer-position-offset);top:0;user-select:none;width:var(--ck-table-column-resizer-width);z-index:var(--ck-z-default)}.ck.ck-editor__editable .table[draggable] .ck-table-column-resizer,.ck.ck-editor__editable.ck-column-resize_disabled .table .ck-table-column-resizer{display:none}.ck.ck-editor__editable .table .ck-table-column-resizer:hover,.ck.ck-editor__editable .table .ck-table-column-resizer__active{background-color:var(--ck-color-selector-column-resizer-hover);bottom:-999999px;opacity:0.25;top:-999999px}.ck.ck-editor__editable[dir=rtl] .table .ck-table-column-resizer{left:var(--ck-table-column-resizer-position-offset);right:unset}.ck-source-editing-area{overflow:hidden;position:relative}.ck-source-editing-area textarea,.ck-source-editing-area:after{border:1px solid transparent;font-family:monospace;font-size:var(--ck-font-size-normal);line-height:var(--ck-line-height-base);margin:0;padding:var(--ck-spacing-large);white-space:pre-wrap}.ck-source-editing-area:after{content:attr(data-value) " ";display:block;visibility:hidden}.ck-source-editing-area textarea{border-color:var(--ck-color-base-border);border-radius:0;box-sizing:border-box;height:100%;outline:none;overflow:hidden;position:absolute;resize:none;width:100%}.ck-rounded-corners .ck-source-editing-area textarea,.ck-source-editing-area textarea.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0;border-top-right-radius:0}.ck-source-editing-area textarea:not([readonly]):focus{border:var(--ck-focus-ring);box-shadow:var(--ck-inner-shadow), 0 0;outline:none}:root{--ck-color-list-button-on-background:#eff0ef;--ck-color-list-button-on-background-focus:#eff0ef;--ck-color-list-button-hover-background:#eff0ef;--ck-color-list-button-on-text:#000;--ck-color-image-caption-background:transparent;--ck-spacing-small:0.35rem;--ck-ui-component-min-height:1rem;--ck-icon-size:1.3rem;--ck-z-default:9999;--ck-z-panel:calc(var(--ck-z-default) + 999);--ck-z-dialog:calc(var(--ck-z-panel) + 9999);--ck-text-tiny-font-size:0.7rem;--ck-text-small-font-size:0.85rem;--ck-text-big-font-size:1.4rem;--ck-text-huge-font-size:1.8rem}.text-tiny{font-size:var(--ck-text-tiny-font-size)}.text-small{font-size:var(--ck-text-small-font-size)}.text-big{font-size:var(--ck-text-big-font-size)}.text-huge{font-size:var(--ck-text-huge-font-size)}.ck-editor{z-index:0}.ck-content .image img{margin-left:0;margin-right:0;min-width:inherit}.ck-content .image-style-align-left,.ibo-is-html-content .image-style-align-left,.ck-content .image-style-align-right,.ibo-is-html-content .image-style-align-right{display:block;float:unset}.ck-content .image-style-align-left,.ibo-is-html-content .image-style-align-left{margin-right:0;text-align:left}.ck-content .image-style-align-right,.ibo-is-html-content .image-style-align-right{margin-left:0;text-align:right}.ck-content figure,.ibo-is-html-content figure{margin-left:0;margin-right:0}.ck-content figure table,.ibo-is-html-content figure table{text-align:initial}.ck-content .table,.ibo-is-html-content .table{margin-left:0;margin-right:0}.ck-content .table table th,.ibo-is-html-content .table table th{background-color:#f4f4f4}.ck-content .marker-yellow,.ibo-is-html-content .marker-yellow{background-color:#fdfd77}.ck-content .marker-green,.ibo-is-html-content .marker-green{background-color:#62f962}.ck-content .marker-pink,.ibo-is-html-content .marker-pink{background-color:#fc7899}.ck-content .marker-blue,.ibo-is-html-content .marker-blue{background-color:#72ccfd}.ck{--ck-color-list-button-on-background: #e1e7ec;--ck-color-list-button-on-background-focus: #e1e7ec;--ck-color-list-button-hover-background: #e1e7ec;--ck-color-list-button-on-text: #212934;--ck-text-tiny-font-size: 0.67rem;--ck-text-small-font-size: 0.83rem;--ck-text-big-font-size: 1.33rem;--ck-text-huge-font-size: 1.83rem;--ck-color-image-caption-text: #212934}.ck-editor{width:100% !important;display:inline-grid;z-index:1}.ck-editor .ck-editor__main{overflow:auto}.ck.ck-content,.ck.ibo-is-html-content{color:#212934}.ck.ck-content .table table,.ck.ibo-is-html-content .table table{width:100% !important}.ck-editor__editable_inline:not(.ck-comment__input *){height:200px}.ck-content pre[data-language],.ibo-is-html-content pre[data-language]{padding:0 !important}.ck-content pre[data-language] code,.ibo-is-html-content pre[data-language] code{display:block;background:#212934 !important;padding:0.9rem !important;color:white !important}.ck-maximize_editor_main .ck-source-editing-area textarea{overflow:auto !important}.ck-mentions .ck-button{line-height:1.6rem;padding:4px 8px !important}.c3 path:not(.c3-legend-item-tile),.c3 line:not(.c3-legend-item-tile){stroke:#212934 !important}.c3-chart-arc path:not(.c3-legend-item-tile){stroke:white !important}.c3-axis{fill:#212934 !important}.c3-tooltip th{background-color:#aebecd !important;color:white !important}.c3-tooltip td{background-color:#929fb1 !important}.c3-legend-background{fill:white !important;stroke:#f2f2f2 !important}.c3-tooltip{background-color:#aebecd !important}.c3-tooltip tr{border:1px solid #CCC}.c3-legend-item{fill:#212934 !important}.tippy-content{white-space:pre-line}.ui-dialog{box-sizing:content-box;display:flex;flex-direction:column;position:absolute;top:0;left:0;background-color:white;border-radius:5px;overflow:hidden;outline:0;z-index:21}.ui-dialog .ui-dialog-titlebar{padding:0.4em 30px;position:relative;background-color:white;height:50px;border-bottom:solid 1px #e1e7ec;display:flex;flex-direction:row;align-items:center;justify-content:space-between}.ui-dialog .ui-dialog-title{float:left;margin:0.1em 0;width:100%;padding-right:24px}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:0;top:0.4em;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{box-sizing:content-box;position:relative;padding:16px 30px;overflow:auto}.ui-dialog .ui-dialog-buttonpane{margin-top:auto;text-align:left;border-width:1px 0 0 0;background-image:none;padding:0.4em 30px;position:relative;background-color:white;border-top:solid 1px #e1e7ec;height:50px}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:0.5em 0.4em 0.5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se{width:7px;height:7px;right:0;bottom:0}.ui-dialog .ui-resizable-sw{width:7px;height:7px;left:0;bottom:0}.ui-dialog .ui-resizable-ne{width:7px;height:7px;right:0;top:0}.ui-dialog .ui-resizable-nw{width:7px;height:7px;left:0;top:0}.ui-dialog .ui-button>.ui-icon{background-image:none;float:unset;margin:auto}.ui-dialog .ui-button>.ui-icon.ui-icon-closethick::after{content:"";font-family:"Font Awesome 5 Free";font-weight:600;text-indent:0;position:absolute;left:0px;width:100%;top:4px}.ui-button-icon-only{text-indent:-9999px;white-space:nowrap}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-widget-overlay.ui-front{position:fixed;top:0;left:0;width:100%;height:100%;opacity:0.6;filter:alpha(opacity=60);background-color:#37474f}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-layout-pane{overflow:auto}.ui-datepicker{display:none;background-color:white;border-radius:5px;box-shadow:0 1px 2px rgba(0, 0, 0, 0.25), 0 1px 3px rgba(0, 0, 0, 0.12);z-index:32 !important;padding:0 8px 5px 8px}.ui-datepicker .ui-datepicker-header{position:relative;margin:8px 8px 4px 8px;padding-top:24px}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:0}.ui-datepicker .ui-datepicker-prev{left:0}.ui-datepicker .ui-datepicker-next{right:0}.ui-datepicker .ui-datepicker-title{display:flex;justify-content:space-evenly}.ui-datepicker .ui-datepicker-title select{flex-grow:1}.ui-datepicker .ui-datepicker-year{margin-left:8px}.ui-datepicker .ui-datepicker-calendar{margin:0 8px 8px 8px}.ui-datepicker th{padding:0.7em 0.3em;text-align:center;font-weight:bold}.ui-datepicker td{padding:1px}.ui-datepicker td span,.ui-datepicker td a,.ui-datepicker td .ibo-quick-create--compartment-results--element>.option:hover{display:block;padding:0.2em 0;text-align:center;width:23px;border-radius:100%;color:#c05621}.ui-datepicker td span.ui-state-active,.ui-datepicker td a.ui-state-active,.ui-datepicker td .ibo-quick-create--compartment-results--element>.ui-state-active.option:hover{background-color:#c05621;color:floralwhite}.ui-datepicker td span.ui-state-highlight:not(.ui-state-active),.ui-datepicker td a.ui-state-highlight:not(.ui-state-active),.ui-datepicker td .ibo-quick-create--compartment-results--element>.ui-state-highlight.option:hover:not(.ui-state-active){background-color:#feebc8}.ui-datepicker td span.ui-state-hover:not(.ui-state-active),.ui-datepicker td a.ui-state-hover:not(.ui-state-active),.ui-datepicker td .ibo-quick-create--compartment-results--element>.ui-state-hover.option:hover:not(.ui-state-active){color:#7b341e}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:0.7em 0 0 0;padding:0 0.2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:0.5em 0.2em 0.4em;cursor:pointer;padding:0.2em 0.6em 0.3em 0.6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto 0.4em}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current{float:right}.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-slider{position:relative;text-align:left;background-color:#f8f9fa;border:solid 1px #929fb1;border-radius:3px}.ui-slider .ui-slider-handle{background-color:white;border:solid 1px #929fb1;border-radius:3px;position:absolute;z-index:2;width:1.4em;height:1.4em;-ms-touch-action:none;touch-action:none;cursor:pointer}.ui-slider .ui-slider-handle:hover,.ui-slider .ui-slider-handle:active{border:solid 1px #c05621}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:0.7em;display:block;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle{filter:inherit}.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:0.8em}.ui-slider-horizontal .ui-slider-handle{top:-0.2em;margin-left:-0.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:0.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-0.3em;margin-left:0;margin-bottom:-0.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default;z-index:100}.ui-autocomplete .ui-menu-item{padding:0}.ui-autocomplete-input{width:auto;display:inline}.ui-helper-hidden-accessible{clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-tabs-tab.ui-state-disabled a,.ui-tabs-tab.ui-state-disabled .ibo-quick-create--compartment-results--element>.option:hover{cursor:not-allowed !important}.ui-multiselect{width:auto !important;padding-left:0.7em !important;padding-right:1.5em !important;text-align:left;white-space:nowrap;overflow:hidden;display:grid}button.ui-multiselect>span{overflow:hidden}.ui-multiselect span.ui-icon{float:right}.ui-multiselect-single .ui-multiselect-checkboxes input{position:absolute !important;top:auto !important;left:-9999px}.ui-multiselect-single .ui-multiselect-checkboxes label{padding:5px !important}.ui-multiselect-header{margin-bottom:3px;padding:3px 0}.ui-multiselect-header ul{padding-left:24px}.ui-multiselect-header ul li{float:left;padding:0 10px 0 0}.ui-multiselect-header span.ui-icon{float:left}.ui-multiselect-header li.ui-multiselect-close{float:right;text-align:right;padding-right:0}.ui-multiselect-menu{display:none;padding:3px;position:absolute;z-index:10000;text-align:left}.ui-multiselect-checkboxes{position:relative;overflow-y:scroll !important}.ui-multiselect-checkboxes label{display:flex;align-items:center;cursor:pointer;padding:3px 1px}.ui-multiselect-checkboxes label input{margin-right:5px;position:relative;top:1px}.ui-multiselect-checkboxes li{clear:both;padding-right:3px}.ui-multiselect-checkboxes li.ui-multiselect-optgroup-label{text-align:center}.ui-multiselect-checkboxes li.ui-multiselect-optgroup-label a,.ui-multiselect-checkboxes li.ui-multiselect-optgroup-label .ibo-quick-create--compartment-results--element>.option:hover{display:block;padding:3px;margin:1px 0;text-decoration:none}.ui-dialog-titlebar.ui-multiselect-header{padding-left:20px;padding-right:20px}.ui-dialog-titlebar.ui-multiselect-header ul{padding-left:0;width:100%}.ui-dialog-titlebar.ui-multiselect-header a,.ui-dialog-titlebar.ui-multiselect-header .ibo-quick-create--compartment-results--element>.option:hover{color:#212934;font-weight:normal}.ui-multiselect,.ui-multiselect-menu,.ui-multiselect-header{background-color:#f8f9fa}button.ui-multiselect{padding-right:10px !important}button.ui-multiselect .fas{float:right;padding-left:10px}.dataTables_paginate{color:#404b5a}.dataTables_paginate a.paginate_button,.dataTables_paginate .ibo-quick-create--compartment-results--element>.paginate_button.option:hover{display:inline-flex;justify-content:center;align-items:center;padding:0 5px;min-width:20px;height:20px;border-radius:3px}.dataTables_paginate a.paginate_button:hover,.dataTables_paginate .ibo-quick-create--compartment-results--element>.paginate_button.option:hover{background-color:#f8f9fa}.dataTables_paginate a.paginate_button.disabled,.dataTables_paginate .ibo-quick-create--compartment-results--element>.paginate_button.disabled.option:hover{color:#929fb1;background-color:transparent;cursor:default}.dataTables_paginate a.paginate_button.current,.dataTables_paginate .ibo-quick-create--compartment-results--element>.paginate_button.current.option:hover{color:#212934;background-color:#e1e7ec;box-shadow:inset 0px 1px 0px rgba(0, 0, 0, 0.15)}.dataTables_length select{}.dataTables_length select[aria-controls]{display:inline-flex;width:unset;min-width:50px;height:20px;padding:0 4px}.dataTables_scrollHead{}.dataTables_scrollHead thead tr th{cursor:pointer}.dataTables_scrollHead thead tr th.sorting::after{position:absolute;right:calc((12px - 8px) / 2);content:"";opacity:0.3;line-height:inherit}.dataTables_scrollHead thead tr th.sorting_asc:after{content:"";opacity:1}.dataTables_scrollHead thead tr th.sorting_desc:after{content:"";opacity:1}.dataTables_scrollHeadInner{border-bottom:1px solid #ccd4db}.dataTable th,.dataTable td{position:relative;padding:10px 12px}.dataTable tr:nth-child(odd){background-color:white}.dataTable tr:nth-child(even){background-color:#f2f2f2}.dataTable tr.ibo-is-red{background-color:#fce8e8}.dataTable tr.ibo-is-danger{background-color:#fed7d7}.dataTable tr.ibo-is-alert{background-color:#fed7d7}.dataTable tr.ibo-is-orange{background-color:floralwhite}.dataTable tr.ibo-is-warning{background-color:#feebc8}.dataTable tr.ibo-is-blue{background-color:#bee3f8}.dataTable tr.ibo-is-info{background-color:#bee3f8}.dataTable tr.ibo-is-green{background-color:#dcedc8}.dataTable tr.ibo-is-success{background-color:#c5e1a5}.dataTable tr.ibo-is-red td:first-child::before{content:"";position:absolute;left:0;top:0;width:3px;height:100%;background-color:#feb2b2}.dataTable tr.ibo-is-danger td:first-child::before{content:"";position:absolute;left:0;top:0;width:3px;height:100%;background-color:#fc8181}.dataTable tr.ibo-is-alert td:first-child::before{content:"";position:absolute;left:0;top:0;width:3px;height:100%;background-color:#fc8181}.dataTable tr.ibo-is-orange td:first-child::before{content:"";position:absolute;left:0;top:0;width:3px;height:100%;background-color:#fbd38d}.dataTable tr.ibo-is-warning td:first-child::before{content:"";position:absolute;left:0;top:0;width:3px;height:100%;background-color:#f6ae55}.dataTable tr.ibo-is-blue td:first-child::before{content:"";position:absolute;left:0;top:0;width:3px;height:100%;background-color:#63b4ed}.dataTable tr.ibo-is-info td:first-child::before{content:"";position:absolute;left:0;top:0;width:3px;height:100%;background-color:#63b4ed}.dataTable tr.ibo-is-green td:first-child::before{content:"";position:absolute;left:0;top:0;width:3px;height:100%;background-color:#aed581}.dataTable tr.ibo-is-success td:first-child::before{content:"";position:absolute;left:0;top:0;width:3px;height:100%;background-color:#aed581}.treeview,.treeview ul{padding:0;margin:0;list-style:none}.treeview div.hitarea{height:15px;width:15px;margin-left:-15px;float:left;cursor:pointer}.treeview li{margin:0;padding:3px 0 3px 16px}.treeview a.selected,.treeview .ibo-quick-create--compartment-results--element>.selected.option:hover{background-color:#f8f9fa}#treecontrol{margin:1em 0}.treeview .hover{color:#dd6c20;cursor:pointer}.treeview li{background:url("..//images/tv-item.gif") 0 0 no-repeat}.treeview .collapsable{background-image:url("..//images/tv-collapsable.gif")}.treeview .expandable{background-image:url("..//images/tv-expandable.gif")}.treeview .last{background-image:url("..//images/tv-item-last.gif")}.treeview .lastCollapsable{background-image:url("..//images/tv-collapsable-last.gif")}.treeview .lastExpandable{background-image:url("..//images/tv-expandable-last.gif")}.filetree li{padding:3px 0 1px 16px}.filetree span.folder,.filetree span.file{padding-left:16px;display:block;height:15px}.filetree span.folder{background:url("..//images/tv-folder.gif") 0 0 no-repeat}.filetree span.file{background:url("..//images/tv-file.gif") 0 0 no-repeat}.blockUI.blockOverlay{background-color:#f2f2f2}.blockUI.blockMsg{font-size:6em;text-align:center;color:#6e7a8a;border:none;background-color:transparent}.mfp-bg{z-index:1100}.mfp-wrap{z-index:1101}.selectize-dropdown,.selectize-input,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active,.selectize-input input,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active input{color:#212934}.selectize-control.single .selectize-input,.selectize-control.single .ibo-quick-create--input.selectize-control.single .selectize-input.input-active,.ibo-quick-create--input.selectize-control.single .selectize-control.single .selectize-input.input-active{box-shadow:unset;background-color:white;background-image:unset;background-repeat:unset}.selectize-input,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active,.selectize-control.single .selectize-input.input-active,.selectize-control.single .ibo-quick-create--input.selectize-control.single .selectize-input.input-active,.ibo-quick-create--input.selectize-control.single .selectize-control.single .selectize-input.input-active{background:unset;background-color:white;cursor:text;display:inline-flex}.selectize-control.single .selectize-input.dropdown-active:after,.selectize-control.single .ibo-quick-create--input.selectize-control.single .dropdown-active.selectize-input.input-active:after,.ibo-quick-create--input.selectize-control.single .selectize-control.single .dropdown-active.selectize-input.input-active:after{margin-top:unset;border-width:unset;border-color:unset}.selectize-control.single .selectize-input:after,.selectize-control.single .ibo-quick-create--input.selectize-control.single .selectize-input.input-active:after,.ibo-quick-create--input.selectize-control.single .selectize-control.single .selectize-input.input-active:after,.selectize-control.single .selectize-input:not(.no-arrow):after,.selectize-control.single .ibo-quick-create--input.selectize-control.single .selectize-input.input-active:not(.no-arrow):after,.ibo-quick-create--input.selectize-control.single .selectize-control.single .selectize-input.input-active:not(.no-arrow):after{content:unset}.selectize-input::after,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active::after{content:unset}.selectize-input>*,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active>*{display:inline-flex}.selectize-control.single .selectize-input,.selectize-control.single .ibo-quick-create--input.selectize-control.single .selectize-input.input-active,.ibo-quick-create--input.selectize-control.single .selectize-control.single .selectize-input.input-active,.selectize-dropdown.single{border-color:#aebecd}.selectize-dropdown{background-color:white;color:#212934}.selectize-dropdown .selected,.selectize-dropdown .active,.selectize-dropdown .active:not(.selected){background:#ebf8ff;color:#212934}.selectize-dropdown [data-selectable],.selectize-dropdown .optgroup-header{padding:5px 8px}.selectize-dropdown .option{opacity:1}.selectize-add-option{display:inline-flex;justify-content:center;align-items:flex-end;position:absolute;right:0;padding-bottom:10px;height:100%;width:24px;z-index:1;color:#212934}.selectize-input .attribute-set-item>*,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active .attribute-set-item>*{display:inline}.selectize-input .attribute-set-item.item-add::before,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active .attribute-set-item.item-add::before,.selectize-input .attribute-set-item.item-remove::before,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active .attribute-set-item.item-remove::before{margin-right:4px}.selectize-input .attribute-set-item.item-add,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active .attribute-set-item.item-add{background-color:#dcedc8 !important}.selectize-input .attribute-set-item.item-add::before,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active .attribute-set-item.item-add::before{color:#33691e;content:""}.selectize-input .attribute-set-item.item-remove,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active .attribute-set-item.item-remove{background-color:#fce8e8 !important}.selectize-input .attribute-set-item.item-remove::before,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active .attribute-set-item.item-remove::before{color:#9b2c2c;content:""}.selectize-input .attribute-set-item.item-ignore-partial,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active .attribute-set-item.item-ignore-partial{background-color:#e1e7ec !important}.selectize-input.selectize-input-error,.ibo-quick-create--input.selectize-control.single .selectize-input-error.selectize-input.input-active{border:1px solid #e53e3e}.toastify.on{opacity:1}.toast-close{background:transparent;border:0;color:inherit;cursor:pointer;font-family:inherit;padding:0;margin-left:8px}.toastify-right{right:16px}.toastify-left{left:16px}.toastify-top{top:-150px}.toastify-bottom{bottom:-150px}.toastify-rounded{border-radius:25px}.toastify-avatar{width:1.5em;height:1.5em;margin:-7px 5px;border-radius:2px}.toastify-center{margin-left:auto;margin-right:auto;left:0;right:0;max-width:fit-content;max-width:-moz-fit-content}@media only screen and (max-width:360px){.toastify-right,.toastify-left{margin-left:auto;margin-right:auto;left:0;right:0;max-width:fit-content}}:root{--ibo-scrollbar--scrollbar-width: 8px;--ibo-scrollbar--scrollbar-height: 8px;--ibo-scrollbar--scrollbar-track-background-color: rgba(255, 255, 255, 0);--ibo-scrollbar--scrollbar-track-border-radius: 5px;--ibo-scrollbar--scrollbar-thumb-background-color: #d5dde5;--ibo-scrollbar--scrollbar-thumb-border: none;--ibo-scrollbar--scrollbar-thumb-border-radius: 5px}*,*::before,*::after{box-sizing:border-box}*{scrollbar-width:thin;scrollbar-color:var(--ibo-scrollbar--scrollbar-thumb-background-color) var(--ibo-scrollbar--scrollbar-track-background-color)}*::-webkit-scrollbar{width:var(--ibo-scrollbar--scrollbar-width);height:var(--ibo-scrollbar--scrollbar-height)}*::-webkit-scrollbar-track{background-color:var(--ibo-scrollbar--scrollbar-track-background-color);border-radius:var(--ibo-scrollbar--scrollbar-track-border-radius)}* ::-webkit-scrollbar-thumb{background-color:var(--ibo-scrollbar--scrollbar-thumb-background-color);border:var(--ibo-scrollbar--scrollbar-thumb-border);border-radius:var(--ibo-scrollbar--scrollbar-thumb-border-radius)}html{font-size:12px}a,.ibo-quick-create--compartment-results--element>.option:hover{color:var(--ibo-hyperlink-color);text-decoration:var(--ibo-hyperlink-text-decoration)}a:hover,.ibo-quick-create--compartment-results--element>.option:hover,a:active,.ibo-quick-create--compartment-results--element>.option:hover:active,a:visited,.ibo-quick-create--compartment-results--element>.option:hover:visited{text-decoration:var(--ibo-hyperlink-text-decoration)}a:hover,.ibo-quick-create--compartment-results--element>.option:hover{color:var(--ibo-hyperlink-color--on-hover);text-decoration:var(--ibo-hyperlink-text-decoration--on-hover)}a:active,.ibo-quick-create--compartment-results--element>.option:hover:active{color:var(--ibo-hyperlink-color--on-active);text-decoration:var(--ibo-hyperlink-text-decoration--on-active)}.ibo-alert.ibo-is-primary{background-color:#feebc8;color:#7b341e}.ibo-alert.ibo-is-primary a,.ibo-alert.ibo-is-primary .ibo-quick-create--compartment-results--element>.option:hover{color:#7b341e}.ibo-alert.ibo-is-primary::before{background-color:#c05621}.ibo-alert.ibo-is-secondary,.ui-dialog .ibo-alert.ui-button,.ibo-alert.ui-datepicker-current,.ibo-alert.ui-datepicker-close{background-color:#e1e7ec;color:#212934}.ibo-alert.ibo-is-secondary a,.ui-dialog .ibo-alert.ui-button a,.ui-dialog .ibo-alert.ui-button .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ui-datepicker-current a,.ibo-alert.ui-datepicker-current .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ui-datepicker-close a,.ibo-alert.ui-datepicker-close .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-secondary .ibo-quick-create--compartment-results--element>.option:hover{color:#212934}.ibo-alert.ibo-is-secondary::before,.ui-dialog .ibo-alert.ui-button::before,.ibo-alert.ui-datepicker-current::before,.ibo-alert.ui-datepicker-close::before{background-color:#6e7a8a}.ibo-alert.ibo-is-neutral,.ui-dialog .ibo-alert.ui-button.ui-dialog-titlebar-close{background-color:#e1e7ec;color:#212934}.ibo-alert.ibo-is-neutral a,.ui-dialog .ibo-alert.ui-button.ui-dialog-titlebar-close a,.ibo-alert.ibo-is-neutral .ibo-quick-create--compartment-results--element>.option:hover,.ui-dialog .ibo-alert.ui-button.ui-dialog-titlebar-close .ibo-quick-create--compartment-results--element>.option:hover{color:#212934}.ibo-alert.ibo-is-neutral::before,.ui-dialog .ibo-alert.ui-button.ui-dialog-titlebar-close::before{background-color:#6e7a8a}.ibo-toast.ibo-is-information,.ibo-alert.ibo-is-information{background-color:#bee3f8;color:#2a4265}.ibo-toast.ibo-is-information a,.ibo-toast.ibo-is-information .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-information a,.ibo-alert.ibo-is-information .ibo-quick-create--compartment-results--element>.option:hover{color:#2a4265}.ibo-toast.ibo-is-information::before,.ibo-alert.ibo-is-information::before{background-color:#2b6bb0}.ibo-toast.ibo-is-success,.ibo-alert.ibo-is-success{background-color:#dcedc8;color:#33691e}.ibo-toast.ibo-is-success a,.ibo-toast.ibo-is-success .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-success a,.ibo-alert.ibo-is-success .ibo-quick-create--compartment-results--element>.option:hover{color:#33691e}.ibo-toast.ibo-is-success::before,.ibo-alert.ibo-is-success::before{background-color:#689f38}.ibo-alert.ibo-is-failure{background-color:#fed7d7;color:#742a2a}.ibo-alert.ibo-is-failure a,.ibo-alert.ibo-is-failure .ibo-quick-create--compartment-results--element>.option:hover{color:#742a2a}.ibo-alert.ibo-is-failure::before{background-color:#c53030}.ibo-toast.ibo-is-warning,.ibo-alert.ibo-is-warning{background-color:#feebc8;color:#7b341e}.ibo-toast.ibo-is-warning a,.ibo-toast.ibo-is-warning .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-warning a,.ibo-alert.ibo-is-warning .ibo-quick-create--compartment-results--element>.option:hover{color:#7b341e}.ibo-toast.ibo-is-warning::before,.ibo-alert.ibo-is-warning::before{background-color:#c05621}.ibo-toast.ibo-is-error,.ibo-alert.ibo-is-danger{background-color:#fed7d7;color:#742a2a}.ibo-toast.ibo-is-error a,.ibo-toast.ibo-is-error .ibo-quick-create--compartment-results--element>.option:hover,.ibo-alert.ibo-is-danger a,.ibo-alert.ibo-is-danger .ibo-quick-create--compartment-results--element>.option:hover{color:#742a2a}.ibo-toast.ibo-is-error::before,.ibo-alert.ibo-is-danger::before{background-color:#c53030}.ibo-alert.ibo-is-grey{background-color:#e1e7ec;color:#212934}.ibo-alert.ibo-is-grey a,.ibo-alert.ibo-is-grey .ibo-quick-create--compartment-results--element>.option:hover{color:#212934}.ibo-alert.ibo-is-grey::before{background-color:#6e7a8a}.ibo-alert.ibo-is-blue-grey{background-color:#b0bec5;color:#263238}.ibo-alert.ibo-is-blue-grey a,.ibo-alert.ibo-is-blue-grey .ibo-quick-create--compartment-results--element>.option:hover{color:#263238}.ibo-alert.ibo-is-blue-grey::before{background-color:#455a64}.ibo-alert.ibo-is-blue{background-color:#bee3f8;color:#2a4265}.ibo-alert.ibo-is-blue a,.ibo-alert.ibo-is-blue .ibo-quick-create--compartment-results--element>.option:hover{color:#2a4265}.ibo-alert.ibo-is-blue::before{background-color:#2b6bb0}.ibo-alert.ibo-is-cyan{background-color:#c9eef2;color:#006164}.ibo-alert.ibo-is-cyan a,.ibo-alert.ibo-is-cyan .ibo-quick-create--compartment-results--element>.option:hover{color:#006164}.ibo-alert.ibo-is-cyan::before{background-color:#2b6bb0}.ibo-alert.ibo-is-green{background-color:#dcedc8;color:#33691e}.ibo-alert.ibo-is-green a,.ibo-alert.ibo-is-green .ibo-quick-create--compartment-results--element>.option:hover{color:#33691e}.ibo-alert.ibo-is-green::before{background-color:#689f38}.ibo-alert.ibo-is-orange{background-color:#feebc8;color:#7b341e}.ibo-alert.ibo-is-orange a,.ibo-alert.ibo-is-orange .ibo-quick-create--compartment-results--element>.option:hover{color:#7b341e}.ibo-alert.ibo-is-orange::before{background-color:#c05621}.ibo-alert.ibo-is-red{background-color:#fed7d7;color:#742a2a}.ibo-alert.ibo-is-red a,.ibo-alert.ibo-is-red .ibo-quick-create--compartment-results--element>.option:hover{color:#742a2a}.ibo-alert.ibo-is-red::before{background-color:#c53030}.ibo-alert.ibo-is-pink{background-color:#fed7e2;color:#702459}.ibo-alert.ibo-is-pink a,.ibo-alert.ibo-is-pink .ibo-quick-create--compartment-results--element>.option:hover{color:#702459}.ibo-alert.ibo-is-pink::before{background-color:#b83280}.ibo-alert{position:relative;padding:18px 20px;min-height:30px;border-radius:3px;overflow:hidden}.ibo-alert::before{display:block;position:absolute;top:0;left:0;content:"";width:4px;height:100%}.ibo-alert .ibo-alert--title{cursor:pointer}.ibo-alert.ibo-is-opened .ibo-alert--minimize-button,.ibo-alert.ibo-input-select-icon--menu .ibo-alert--minimize-button{display:block}.ibo-alert.ibo-is-opened .ibo-alert--maximize-button,.ibo-alert.ibo-input-select-icon--menu .ibo-alert--maximize-button{display:none}.ibo-alert:not(.ibo-is-opened){padding:5px 20px}.ibo-alert:not(.ibo-is-opened) .ibo-alert--title{padding-bottom:0}.ibo-alert:not(.ibo-is-opened) .ibo-alert--minimize-button{display:none}.ibo-alert:not(.ibo-is-opened) .ibo-alert--maximize-button{display:block}.ibo-alert:not(.ibo-is-opened) .ibo-alert--body{display:none}.ibo-alert--title+.ibo-alert--body{margin-top:4px}.ibo-alert--action-button{position:absolute;cursor:pointer;top:5px}.ibo-alert--action-button:hover i{opacity:0.8}.ibo-alert--action-button.ibo-alert--maximize-button,.ibo-alert--action-button.ibo-alert--minimize-button{right:30px}.ibo-alert--action-button.ibo-alert--close-button{right:10px}.ibo-button.ibo-is-regular.ibo-is-neutral,.ui-dialog .ibo-is-regular.ibo-is-neutral.ui-button,.ui-dialog .ibo-is-neutral.ui-button,.ui-dialog .ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-current,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-close,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ibo-is-regular.ibo-is-neutral.ui-datepicker-current,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-neutral.ui-datepicker-current,.ibo-is-neutral.ui-datepicker-current.ui-datepicker-close,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ibo-is-regular.ibo-is-neutral.ui-datepicker-close,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ibo-is-neutral.ui-datepicker-close.ui-datepicker-current,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-neutral.ui-datepicker-close,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-button.ibo-is-neutral.ui-button,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close,.ibo-button.ibo-is-neutral.ui-datepicker-current,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-button.ibo-is-neutral.ui-datepicker-close,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-regular.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:#f8f9fa;color:#212934;box-shadow:0px 2px 0px #d5dde5}.ibo-button.ibo-is-regular.ibo-is-neutral:hover,.ui-dialog .ibo-is-regular.ibo-is-neutral.ui-button:hover,.ui-dialog .ibo-is-neutral.ui-button:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-close:hover,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-neutral.ui-datepicker-current:hover,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button:hover,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-neutral.ui-datepicker-current:hover,.ibo-is-neutral.ui-datepicker-current.ui-datepicker-close:hover,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-neutral.ui-datepicker-close:hover,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button:hover,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-neutral.ui-datepicker-close.ui-datepicker-current:hover,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-neutral.ui-datepicker-close:hover,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-button.ibo-is-neutral.ui-button:hover,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:hover,.ibo-button.ibo-is-neutral.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-button.ibo-is-neutral.ui-datepicker-close:hover,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-regular.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close:hover,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:#e1e7ec;color:#212934;box-shadow:0px 2px 0px #d5dde5}.ibo-button.ibo-is-regular.ibo-is-neutral:active,.ui-dialog .ibo-is-regular.ibo-is-neutral.ui-button:active,.ui-dialog .ibo-is-neutral.ui-button:active,.ui-dialog .ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-current:active,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-close:active,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ibo-is-regular.ibo-is-neutral.ui-datepicker-current:active,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button:active,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-neutral.ui-datepicker-current:active,.ibo-is-neutral.ui-datepicker-current.ui-datepicker-close:active,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ibo-is-regular.ibo-is-neutral.ui-datepicker-close:active,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button:active,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ibo-is-neutral.ui-datepicker-close.ui-datepicker-current:active,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-neutral.ui-datepicker-close:active,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-button.ibo-is-neutral.ui-button:active,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:active,.ibo-button.ibo-is-neutral.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-button.ibo-is-neutral.ui-datepicker-close:active,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-regular.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close:active,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:#e1e7ec;color:#212934;box-shadow:inset 0px 2px 0px #d5dde5 , 0px 2px 0px #e1e7ec}.ibo-button.ibo-is-regular.ibo-is-neutral:disabled,.ui-dialog .ibo-is-regular.ibo-is-neutral.ui-button:disabled,.ui-dialog .ibo-is-neutral.ui-button:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-close:disabled,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-neutral.ui-datepicker-current:disabled,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button:disabled,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-neutral.ui-datepicker-current:disabled,.ibo-is-neutral.ui-datepicker-current.ui-datepicker-close:disabled,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-neutral.ui-datepicker-close:disabled,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button:disabled,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-neutral.ui-datepicker-close.ui-datepicker-current:disabled,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-neutral.ui-datepicker-close:disabled,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ibo-is-neutral.ui-button:disabled,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:disabled,.ibo-button.ibo-is-neutral.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-button.ibo-is-neutral.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-regular.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close:disabled,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:#d5dde5;color:#6e7a8a;box-shadow:inset 0px 2px 0px #d5dde5}.ibo-button.ibo-is-regular.ibo-is-primary,.ui-dialog .ibo-is-regular.ibo-is-primary.ui-button,.ui-dialog .ibo-is-primary.ui-button,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-current,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-close,.ibo-is-regular.ibo-is-primary.ui-datepicker-current,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button,.ibo-is-primary.ui-datepicker-current,.ibo-is-primary.ui-datepicker-current.ui-datepicker-close,.ibo-is-regular.ibo-is-primary.ui-datepicker-close,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button,.ibo-is-primary.ui-datepicker-close.ui-datepicker-current,.ibo-is-primary.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-primary.ui-button,.ibo-button.ibo-is-primary.ui-datepicker-current,.ibo-button.ibo-is-primary.ui-datepicker-close{background-color:#00838f;color:white;box-shadow:0px 2px 0px #003636}.ibo-button.ibo-is-regular.ibo-is-primary:hover,.ui-dialog .ibo-is-regular.ibo-is-primary.ui-button:hover,.ui-dialog .ibo-is-primary.ui-button:hover,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-primary.ui-datepicker-current:hover,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button:hover,.ibo-is-primary.ui-datepicker-current:hover,.ibo-is-primary.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-primary.ui-datepicker-close:hover,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button:hover,.ibo-is-primary.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-primary.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-primary.ui-button:hover,.ibo-button.ibo-is-primary.ui-datepicker-current:hover,.ibo-button.ibo-is-primary.ui-datepicker-close:hover{background-color:#006164;color:white;box-shadow:0px 2px 0px #003636}.ibo-button.ibo-is-regular.ibo-is-primary:active,.ui-dialog .ibo-is-regular.ibo-is-primary.ui-button:active,.ui-dialog .ibo-is-primary.ui-button:active,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-close:active,.ibo-is-regular.ibo-is-primary.ui-datepicker-current:active,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button:active,.ibo-is-primary.ui-datepicker-current:active,.ibo-is-primary.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-regular.ibo-is-primary.ui-datepicker-close:active,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button:active,.ibo-is-primary.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-primary.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-primary.ui-button:active,.ibo-button.ibo-is-primary.ui-datepicker-current:active,.ibo-button.ibo-is-primary.ui-datepicker-close:active{background-color:#006164;color:white;box-shadow:inset 0px 2px 0px #003636 , 0px 2px 0px #006164}.ibo-button.ibo-is-regular.ibo-is-primary:disabled,.ui-dialog .ibo-is-regular.ibo-is-primary.ui-button:disabled,.ui-dialog .ibo-is-primary.ui-button:disabled,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-primary.ui-datepicker-current:disabled,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button:disabled,.ibo-is-primary.ui-datepicker-current:disabled,.ibo-is-primary.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-primary.ui-datepicker-close:disabled,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button:disabled,.ibo-is-primary.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-primary.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-primary.ui-button:disabled,.ibo-button.ibo-is-primary.ui-datepicker-current:disabled,.ibo-button.ibo-is-primary.ui-datepicker-close:disabled{background-color:#d5dde5;color:#6e7a8a;box-shadow:inset 0px 2px 0px #d5dde5}.ibo-button.ibo-is-regular.ibo-is-secondary,.ui-dialog .ibo-is-regular.ibo-is-secondary.ui-button,.ui-dialog .ibo-is-secondary.ui-button,.ui-dialog .ui-button,.ui-dialog .ui-button.ui-datepicker-current,.ui-dialog .ui-button.ui-datepicker-close,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-current,.ui-dialog .ui-button.ui-datepicker-current.ui-datepicker-close,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-close,.ui-dialog .ui-button.ui-datepicker-close.ui-datepicker-current,.ui-dialog .ibo-is-regular.ui-button,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-current,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-close,.ibo-is-regular.ibo-is-secondary.ui-datepicker-current,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button,.ui-dialog .ui-datepicker-current.ui-button,.ui-dialog .ui-datepicker-current.ui-button.ui-datepicker-close,.ibo-is-secondary.ui-datepicker-current,.ui-datepicker-current,.ui-datepicker-current.ui-datepicker-close,.ibo-is-secondary.ui-datepicker-current.ui-datepicker-close,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button,.ibo-is-regular.ui-datepicker-current,.ibo-is-regular.ui-datepicker-current.ui-datepicker-close,.ibo-is-regular.ibo-is-secondary.ui-datepicker-close,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button,.ui-dialog .ui-datepicker-close.ui-button,.ui-dialog .ui-datepicker-close.ui-button.ui-datepicker-current,.ibo-is-secondary.ui-datepicker-close.ui-datepicker-current,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button,.ui-datepicker-close.ui-datepicker-current,.ibo-is-secondary.ui-datepicker-close,.ui-datepicker-close,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button,.ibo-is-regular.ui-datepicker-close.ui-datepicker-current,.ibo-is-regular.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-secondary.ui-button,.ui-dialog .ibo-button.ui-button,.ui-dialog .ibo-button.ui-button.ui-datepicker-current,.ui-dialog .ibo-button.ui-button.ui-datepicker-close,.ibo-button.ibo-is-secondary.ui-datepicker-current,.ui-dialog .ibo-button.ui-datepicker-current.ui-button,.ibo-button.ui-datepicker-current,.ibo-button.ui-datepicker-current.ui-datepicker-close,.ibo-button.ibo-is-secondary.ui-datepicker-close,.ui-dialog .ibo-button.ui-datepicker-close.ui-button,.ibo-button.ui-datepicker-close.ui-datepicker-current,.ibo-button.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-regular.ui-button,.ibo-button.ibo-is-regular.ui-datepicker-current,.ibo-button.ibo-is-regular.ui-datepicker-close{background-color:#f8f9fa;color:#212934;box-shadow:0px 2px 0px #d5dde5}.ibo-button.ibo-is-regular.ibo-is-secondary:hover,.ui-dialog .ibo-is-regular.ibo-is-secondary.ui-button:hover,.ui-dialog .ibo-is-secondary.ui-button:hover,.ui-dialog .ui-button:hover,.ui-dialog .ui-button.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-datepicker-close:hover,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-datepicker-current.ui-datepicker-close:hover,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-close:hover,.ui-dialog .ui-button.ui-datepicker-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-regular.ui-button:hover,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-secondary.ui-datepicker-current:hover,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button:hover,.ui-dialog .ui-datepicker-current.ui-button:hover,.ui-dialog .ui-datepicker-current.ui-button.ui-datepicker-close:hover,.ibo-is-secondary.ui-datepicker-current:hover,.ui-datepicker-current:hover,.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-secondary.ui-datepicker-current.ui-datepicker-close:hover,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button:hover,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button:hover,.ibo-is-regular.ui-datepicker-current:hover,.ibo-is-regular.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-secondary.ui-datepicker-close:hover,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button:hover,.ui-dialog .ui-datepicker-close.ui-button:hover,.ui-dialog .ui-datepicker-close.ui-button.ui-datepicker-current:hover,.ibo-is-secondary.ui-datepicker-close.ui-datepicker-current:hover,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button:hover,.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-secondary.ui-datepicker-close:hover,.ui-datepicker-close:hover,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button:hover,.ibo-is-regular.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-regular.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-secondary.ui-button:hover,.ui-dialog .ibo-button.ui-button:hover,.ui-dialog .ibo-button.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-button.ui-datepicker-close:hover,.ibo-button.ibo-is-secondary.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-datepicker-current.ui-button:hover,.ibo-button.ui-datepicker-current:hover,.ibo-button.ui-datepicker-current.ui-datepicker-close:hover,.ibo-button.ibo-is-secondary.ui-datepicker-close:hover,.ui-dialog .ibo-button.ui-datepicker-close.ui-button:hover,.ibo-button.ui-datepicker-close.ui-datepicker-current:hover,.ibo-button.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-regular.ui-button:hover,.ibo-button.ibo-is-regular.ui-datepicker-current:hover,.ibo-button.ibo-is-regular.ui-datepicker-close:hover{background-color:#e1e7ec;color:#212934;box-shadow:0px 2px 0px #d5dde5}.ibo-button.ibo-is-regular.ibo-is-secondary:active,.ui-dialog .ibo-is-regular.ibo-is-secondary.ui-button:active,.ui-dialog .ibo-is-secondary.ui-button:active,.ui-dialog .ui-button:active,.ui-dialog .ui-button.ui-datepicker-current:active,.ui-dialog .ui-button.ui-datepicker-close:active,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-current:active,.ui-dialog .ui-button.ui-datepicker-current.ui-datepicker-close:active,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-close:active,.ui-dialog .ui-button.ui-datepicker-close.ui-datepicker-current:active,.ui-dialog .ibo-is-regular.ui-button:active,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-close:active,.ibo-is-regular.ibo-is-secondary.ui-datepicker-current:active,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button:active,.ui-dialog .ui-datepicker-current.ui-button:active,.ui-dialog .ui-datepicker-current.ui-button.ui-datepicker-close:active,.ibo-is-secondary.ui-datepicker-current:active,.ui-datepicker-current:active,.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-secondary.ui-datepicker-current.ui-datepicker-close:active,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button:active,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button:active,.ibo-is-regular.ui-datepicker-current:active,.ibo-is-regular.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-regular.ibo-is-secondary.ui-datepicker-close:active,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button:active,.ui-dialog .ui-datepicker-close.ui-button:active,.ui-dialog .ui-datepicker-close.ui-button.ui-datepicker-current:active,.ibo-is-secondary.ui-datepicker-close.ui-datepicker-current:active,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button:active,.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-secondary.ui-datepicker-close:active,.ui-datepicker-close:active,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button:active,.ibo-is-regular.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-regular.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-secondary.ui-button:active,.ui-dialog .ibo-button.ui-button:active,.ui-dialog .ibo-button.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-button.ui-datepicker-close:active,.ibo-button.ibo-is-secondary.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-datepicker-current.ui-button:active,.ibo-button.ui-datepicker-current:active,.ibo-button.ui-datepicker-current.ui-datepicker-close:active,.ibo-button.ibo-is-secondary.ui-datepicker-close:active,.ui-dialog .ibo-button.ui-datepicker-close.ui-button:active,.ibo-button.ui-datepicker-close.ui-datepicker-current:active,.ibo-button.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-regular.ui-button:active,.ibo-button.ibo-is-regular.ui-datepicker-current:active,.ibo-button.ibo-is-regular.ui-datepicker-close:active{background-color:#e1e7ec;color:#212934;box-shadow:inset 0px 2px 0px #d5dde5 , 0px 2px 0px #e1e7ec}.ibo-button.ibo-is-regular.ibo-is-secondary:disabled,.ui-dialog .ibo-is-regular.ibo-is-secondary.ui-button:disabled,.ui-dialog .ibo-is-secondary.ui-button:disabled,.ui-dialog .ui-button:disabled,.ui-dialog .ui-button.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-datepicker-close:disabled,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-datepicker-current.ui-datepicker-close:disabled,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-close:disabled,.ui-dialog .ui-button.ui-datepicker-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-regular.ui-button:disabled,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-secondary.ui-datepicker-current:disabled,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button:disabled,.ui-dialog .ui-datepicker-current.ui-button:disabled,.ui-dialog .ui-datepicker-current.ui-button.ui-datepicker-close:disabled,.ibo-is-secondary.ui-datepicker-current:disabled,.ui-datepicker-current:disabled,.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-secondary.ui-datepicker-current.ui-datepicker-close:disabled,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button:disabled,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button:disabled,.ibo-is-regular.ui-datepicker-current:disabled,.ibo-is-regular.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-secondary.ui-datepicker-close:disabled,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button:disabled,.ui-dialog .ui-datepicker-close.ui-button:disabled,.ui-dialog .ui-datepicker-close.ui-button.ui-datepicker-current:disabled,.ibo-is-secondary.ui-datepicker-close.ui-datepicker-current:disabled,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button:disabled,.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-secondary.ui-datepicker-close:disabled,.ui-datepicker-close:disabled,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button:disabled,.ibo-is-regular.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-regular.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-secondary.ui-button:disabled,.ui-dialog .ibo-button.ui-button:disabled,.ui-dialog .ibo-button.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-button.ui-datepicker-close:disabled,.ibo-button.ibo-is-secondary.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-datepicker-current.ui-button:disabled,.ibo-button.ui-datepicker-current:disabled,.ibo-button.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-button.ibo-is-secondary.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ui-datepicker-close.ui-button:disabled,.ibo-button.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-button.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-regular.ui-button:disabled,.ibo-button.ibo-is-regular.ui-datepicker-current:disabled,.ibo-button.ibo-is-regular.ui-datepicker-close:disabled{background-color:#d5dde5;color:#6e7a8a;box-shadow:inset 0px 2px 0px #d5dde5}.ibo-button.ibo-is-regular.ibo-is-danger,.ui-dialog .ibo-is-regular.ibo-is-danger.ui-button,.ui-dialog .ibo-is-danger.ui-button,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-current,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-close,.ibo-is-regular.ibo-is-danger.ui-datepicker-current,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button,.ibo-is-danger.ui-datepicker-current,.ibo-is-danger.ui-datepicker-current.ui-datepicker-close,.ibo-is-regular.ibo-is-danger.ui-datepicker-close,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button,.ibo-is-danger.ui-datepicker-close.ui-datepicker-current,.ibo-is-danger.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-danger.ui-button,.ibo-button.ibo-is-danger.ui-datepicker-current,.ibo-button.ibo-is-danger.ui-datepicker-close{background-color:#c53030;color:white;box-shadow:0px 2px 0px #742a2a}.ibo-button.ibo-is-regular.ibo-is-danger:hover,.ui-dialog .ibo-is-regular.ibo-is-danger.ui-button:hover,.ui-dialog .ibo-is-danger.ui-button:hover,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-danger.ui-datepicker-current:hover,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button:hover,.ibo-is-danger.ui-datepicker-current:hover,.ibo-is-danger.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-danger.ui-datepicker-close:hover,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button:hover,.ibo-is-danger.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-danger.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-danger.ui-button:hover,.ibo-button.ibo-is-danger.ui-datepicker-current:hover,.ibo-button.ibo-is-danger.ui-datepicker-close:hover{background-color:#9b2c2c;color:white;box-shadow:0px 2px 0px #742a2a}.ibo-button.ibo-is-regular.ibo-is-danger:active,.ui-dialog .ibo-is-regular.ibo-is-danger.ui-button:active,.ui-dialog .ibo-is-danger.ui-button:active,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-close:active,.ibo-is-regular.ibo-is-danger.ui-datepicker-current:active,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button:active,.ibo-is-danger.ui-datepicker-current:active,.ibo-is-danger.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-regular.ibo-is-danger.ui-datepicker-close:active,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button:active,.ibo-is-danger.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-danger.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-danger.ui-button:active,.ibo-button.ibo-is-danger.ui-datepicker-current:active,.ibo-button.ibo-is-danger.ui-datepicker-close:active{background-color:#9b2c2c;color:white;box-shadow:inset 0px 2px 0px #742a2a , 0px 2px 0px #9b2c2c}.ibo-button.ibo-is-regular.ibo-is-danger:disabled,.ui-dialog .ibo-is-regular.ibo-is-danger.ui-button:disabled,.ui-dialog .ibo-is-danger.ui-button:disabled,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-danger.ui-datepicker-current:disabled,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button:disabled,.ibo-is-danger.ui-datepicker-current:disabled,.ibo-is-danger.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-danger.ui-datepicker-close:disabled,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button:disabled,.ibo-is-danger.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-danger.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-danger.ui-button:disabled,.ibo-button.ibo-is-danger.ui-datepicker-current:disabled,.ibo-button.ibo-is-danger.ui-datepicker-close:disabled{background-color:#d5dde5;color:#6e7a8a;box-shadow:inset 0px 2px 0px #d5dde5}.ibo-button.ibo-is-regular.ibo-is-success,.ui-dialog .ibo-is-regular.ibo-is-success.ui-button,.ui-dialog .ibo-is-success.ui-button,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-current,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-close,.ibo-is-regular.ibo-is-success.ui-datepicker-current,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button,.ibo-is-success.ui-datepicker-current,.ibo-is-success.ui-datepicker-current.ui-datepicker-close,.ibo-is-regular.ibo-is-success.ui-datepicker-close,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button,.ibo-is-success.ui-datepicker-close.ui-datepicker-current,.ibo-is-success.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-success.ui-button,.ibo-button.ibo-is-success.ui-datepicker-current,.ibo-button.ibo-is-success.ui-datepicker-close{background-color:#558b2f;color:white;box-shadow:0px 2px 0px #235816}.ibo-button.ibo-is-regular.ibo-is-success:hover,.ui-dialog .ibo-is-regular.ibo-is-success.ui-button:hover,.ui-dialog .ibo-is-success.ui-button:hover,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-success.ui-datepicker-current:hover,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button:hover,.ibo-is-success.ui-datepicker-current:hover,.ibo-is-success.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-success.ui-datepicker-close:hover,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button:hover,.ibo-is-success.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-success.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-success.ui-button:hover,.ibo-button.ibo-is-success.ui-datepicker-current:hover,.ibo-button.ibo-is-success.ui-datepicker-close:hover{background-color:#33691e;color:white;box-shadow:0px 2px 0px #235816}.ibo-button.ibo-is-regular.ibo-is-success:active,.ui-dialog .ibo-is-regular.ibo-is-success.ui-button:active,.ui-dialog .ibo-is-success.ui-button:active,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-close:active,.ibo-is-regular.ibo-is-success.ui-datepicker-current:active,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button:active,.ibo-is-success.ui-datepicker-current:active,.ibo-is-success.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-regular.ibo-is-success.ui-datepicker-close:active,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button:active,.ibo-is-success.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-success.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-success.ui-button:active,.ibo-button.ibo-is-success.ui-datepicker-current:active,.ibo-button.ibo-is-success.ui-datepicker-close:active{background-color:#33691e;color:white;box-shadow:inset 0px 2px 0px #235816 , 0px 2px 0px #33691e}.ibo-button.ibo-is-regular.ibo-is-success:disabled,.ui-dialog .ibo-is-regular.ibo-is-success.ui-button:disabled,.ui-dialog .ibo-is-success.ui-button:disabled,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-success.ui-datepicker-current:disabled,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button:disabled,.ibo-is-success.ui-datepicker-current:disabled,.ibo-is-success.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-success.ui-datepicker-close:disabled,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button:disabled,.ibo-is-success.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-success.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-success.ui-button:disabled,.ibo-button.ibo-is-success.ui-datepicker-current:disabled,.ibo-button.ibo-is-success.ui-datepicker-close:disabled{background-color:#d5dde5;color:#6e7a8a;box-shadow:inset 0px 2px 0px #d5dde5}.ibo-button.ibo-is-regular.ibo-is-red,.ui-dialog .ibo-is-regular.ibo-is-red.ui-button,.ui-dialog .ibo-is-red.ui-button,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-current,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-close,.ibo-is-regular.ibo-is-red.ui-datepicker-current,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button,.ibo-is-red.ui-datepicker-current,.ibo-is-red.ui-datepicker-current.ui-datepicker-close,.ibo-is-regular.ibo-is-red.ui-datepicker-close,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button,.ibo-is-red.ui-datepicker-close.ui-datepicker-current,.ibo-is-red.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-red.ui-button,.ibo-button.ibo-is-red.ui-datepicker-current,.ibo-button.ibo-is-red.ui-datepicker-close{background-color:#c53030;color:white;box-shadow:0px 2px 0px #742a2a}.ibo-button.ibo-is-regular.ibo-is-red:hover,.ui-dialog .ibo-is-regular.ibo-is-red.ui-button:hover,.ui-dialog .ibo-is-red.ui-button:hover,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-red.ui-datepicker-current:hover,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button:hover,.ibo-is-red.ui-datepicker-current:hover,.ibo-is-red.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-red.ui-datepicker-close:hover,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button:hover,.ibo-is-red.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-red.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-red.ui-button:hover,.ibo-button.ibo-is-red.ui-datepicker-current:hover,.ibo-button.ibo-is-red.ui-datepicker-close:hover{background-color:#9b2c2c;color:white;box-shadow:0px 2px 0px #742a2a}.ibo-button.ibo-is-regular.ibo-is-red:active,.ui-dialog .ibo-is-regular.ibo-is-red.ui-button:active,.ui-dialog .ibo-is-red.ui-button:active,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-close:active,.ibo-is-regular.ibo-is-red.ui-datepicker-current:active,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button:active,.ibo-is-red.ui-datepicker-current:active,.ibo-is-red.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-regular.ibo-is-red.ui-datepicker-close:active,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button:active,.ibo-is-red.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-red.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-red.ui-button:active,.ibo-button.ibo-is-red.ui-datepicker-current:active,.ibo-button.ibo-is-red.ui-datepicker-close:active{background-color:#9b2c2c;color:white;box-shadow:inset 0px 2px 0px #742a2a , 0px 2px 0px #9b2c2c}.ibo-button.ibo-is-regular.ibo-is-red:disabled,.ui-dialog .ibo-is-regular.ibo-is-red.ui-button:disabled,.ui-dialog .ibo-is-red.ui-button:disabled,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-red.ui-datepicker-current:disabled,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button:disabled,.ibo-is-red.ui-datepicker-current:disabled,.ibo-is-red.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-red.ui-datepicker-close:disabled,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button:disabled,.ibo-is-red.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-red.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-red.ui-button:disabled,.ibo-button.ibo-is-red.ui-datepicker-current:disabled,.ibo-button.ibo-is-red.ui-datepicker-close:disabled{background-color:#d5dde5;color:#6e7a8a;box-shadow:inset 0px 2px 0px #d5dde5}.ibo-button.ibo-is-regular.ibo-is-green,.ui-dialog .ibo-is-regular.ibo-is-green.ui-button,.ui-dialog .ibo-is-green.ui-button,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-current,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-close,.ibo-is-regular.ibo-is-green.ui-datepicker-current,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button,.ibo-is-green.ui-datepicker-current,.ibo-is-green.ui-datepicker-current.ui-datepicker-close,.ibo-is-regular.ibo-is-green.ui-datepicker-close,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button,.ibo-is-green.ui-datepicker-close.ui-datepicker-current,.ibo-is-green.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-green.ui-button,.ibo-button.ibo-is-green.ui-datepicker-current,.ibo-button.ibo-is-green.ui-datepicker-close{background-color:#558b2f;color:white;box-shadow:0px 2px 0px #235816}.ibo-button.ibo-is-regular.ibo-is-green:hover,.ui-dialog .ibo-is-regular.ibo-is-green.ui-button:hover,.ui-dialog .ibo-is-green.ui-button:hover,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-green.ui-datepicker-current:hover,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button:hover,.ibo-is-green.ui-datepicker-current:hover,.ibo-is-green.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-green.ui-datepicker-close:hover,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button:hover,.ibo-is-green.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-green.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-green.ui-button:hover,.ibo-button.ibo-is-green.ui-datepicker-current:hover,.ibo-button.ibo-is-green.ui-datepicker-close:hover{background-color:#33691e;color:white;box-shadow:0px 2px 0px #235816}.ibo-button.ibo-is-regular.ibo-is-green:active,.ui-dialog .ibo-is-regular.ibo-is-green.ui-button:active,.ui-dialog .ibo-is-green.ui-button:active,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-close:active,.ibo-is-regular.ibo-is-green.ui-datepicker-current:active,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button:active,.ibo-is-green.ui-datepicker-current:active,.ibo-is-green.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-regular.ibo-is-green.ui-datepicker-close:active,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button:active,.ibo-is-green.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-green.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-green.ui-button:active,.ibo-button.ibo-is-green.ui-datepicker-current:active,.ibo-button.ibo-is-green.ui-datepicker-close:active{background-color:#33691e;color:white;box-shadow:inset 0px 2px 0px #235816 , 0px 2px 0px #33691e}.ibo-button.ibo-is-regular.ibo-is-green:disabled,.ui-dialog .ibo-is-regular.ibo-is-green.ui-button:disabled,.ui-dialog .ibo-is-green.ui-button:disabled,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-green.ui-datepicker-current:disabled,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button:disabled,.ibo-is-green.ui-datepicker-current:disabled,.ibo-is-green.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-green.ui-datepicker-close:disabled,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button:disabled,.ibo-is-green.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-green.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-green.ui-button:disabled,.ibo-button.ibo-is-green.ui-datepicker-current:disabled,.ibo-button.ibo-is-green.ui-datepicker-close:disabled{background-color:#d5dde5;color:#6e7a8a;box-shadow:inset 0px 2px 0px #d5dde5}.ibo-button.ibo-is-regular.ibo-is-cyan,.ui-dialog .ibo-is-regular.ibo-is-cyan.ui-button,.ui-dialog .ibo-is-cyan.ui-button,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-current,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-close,.ibo-is-regular.ibo-is-cyan.ui-datepicker-current,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button,.ibo-is-cyan.ui-datepicker-current,.ibo-is-cyan.ui-datepicker-current.ui-datepicker-close,.ibo-is-regular.ibo-is-cyan.ui-datepicker-close,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button,.ibo-is-cyan.ui-datepicker-close.ui-datepicker-current,.ibo-is-cyan.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-cyan.ui-button,.ibo-button.ibo-is-cyan.ui-datepicker-current,.ibo-button.ibo-is-cyan.ui-datepicker-close{background-color:#00838f;color:white;box-shadow:0px 2px 0px #003636}.ibo-button.ibo-is-regular.ibo-is-cyan:hover,.ui-dialog .ibo-is-regular.ibo-is-cyan.ui-button:hover,.ui-dialog .ibo-is-cyan.ui-button:hover,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-cyan.ui-datepicker-current:hover,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button:hover,.ibo-is-cyan.ui-datepicker-current:hover,.ibo-is-cyan.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-cyan.ui-datepicker-close:hover,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button:hover,.ibo-is-cyan.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-cyan.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-cyan.ui-button:hover,.ibo-button.ibo-is-cyan.ui-datepicker-current:hover,.ibo-button.ibo-is-cyan.ui-datepicker-close:hover{background-color:#006164;color:white;box-shadow:0px 2px 0px #003636}.ibo-button.ibo-is-regular.ibo-is-cyan:active,.ui-dialog .ibo-is-regular.ibo-is-cyan.ui-button:active,.ui-dialog .ibo-is-cyan.ui-button:active,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-close:active,.ibo-is-regular.ibo-is-cyan.ui-datepicker-current:active,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button:active,.ibo-is-cyan.ui-datepicker-current:active,.ibo-is-cyan.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-regular.ibo-is-cyan.ui-datepicker-close:active,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button:active,.ibo-is-cyan.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-cyan.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-cyan.ui-button:active,.ibo-button.ibo-is-cyan.ui-datepicker-current:active,.ibo-button.ibo-is-cyan.ui-datepicker-close:active{background-color:#006164;color:white;box-shadow:inset 0px 2px 0px #003636 , 0px 2px 0px #006164}.ibo-button.ibo-is-regular.ibo-is-cyan:disabled,.ui-dialog .ibo-is-regular.ibo-is-cyan.ui-button:disabled,.ui-dialog .ibo-is-cyan.ui-button:disabled,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-cyan.ui-datepicker-current:disabled,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button:disabled,.ibo-is-cyan.ui-datepicker-current:disabled,.ibo-is-cyan.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-cyan.ui-datepicker-close:disabled,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button:disabled,.ibo-is-cyan.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-cyan.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-cyan.ui-button:disabled,.ibo-button.ibo-is-cyan.ui-datepicker-current:disabled,.ibo-button.ibo-is-cyan.ui-datepicker-close:disabled{background-color:#d5dde5;color:#6e7a8a;box-shadow:inset 0px 2px 0px #d5dde5}.ibo-button.ibo-is-alternative.ibo-is-neutral,.ui-dialog .ibo-is-alternative.ibo-is-neutral.ui-button,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-current,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-close,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-neutral.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-alternative.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:transparent;color:#212934;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-neutral:hover,.ui-dialog .ibo-is-alternative.ibo-is-neutral.ui-button:hover,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-current:hover,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-close:hover,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-neutral.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-alternative.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:#f8f9fa;color:#212934;box-shadow:0px 2px 0px #f8f9fa}.ibo-button.ibo-is-alternative.ibo-is-neutral:active,.ui-dialog .ibo-is-alternative.ibo-is-neutral.ui-button:active,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-current:active,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-close:active,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-neutral.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-alternative.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:#f8f9fa;color:#212934;box-shadow:inset 0px 2px 0px #e1e7ec , 0px 2px 0px #f8f9fa}.ibo-button.ibo-is-alternative.ibo-is-neutral:disabled,.ui-dialog .ibo-is-alternative.ibo-is-neutral.ui-button:disabled,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-current:disabled,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-close:disabled,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-neutral.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-alternative.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:transparent;color:#929fb1;box-shadow:inset 0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-primary,.ui-dialog .ibo-is-alternative.ibo-is-primary.ui-button,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-primary.ui-datepicker-current,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-primary.ui-datepicker-close,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-primary.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:transparent;color:#006164;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-primary:hover,.ui-dialog .ibo-is-alternative.ibo-is-primary.ui-button:hover,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-primary.ui-datepicker-current:hover,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-primary.ui-datepicker-close:hover,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-primary.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:white;color:#212934;box-shadow:0px 2px 0px white}.ibo-button.ibo-is-alternative.ibo-is-primary:active,.ui-dialog .ibo-is-alternative.ibo-is-primary.ui-button:active,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-primary.ui-datepicker-current:active,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-primary.ui-datepicker-close:active,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-primary.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:white;color:#212934;box-shadow:inset 0px 2px 0px white , 0px 2px 0px white}.ibo-button.ibo-is-alternative.ibo-is-primary:disabled,.ui-dialog .ibo-is-alternative.ibo-is-primary.ui-button:disabled,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-primary.ui-datepicker-current:disabled,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-primary.ui-datepicker-close:disabled,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-primary.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:transparent;color:#929fb1;box-shadow:inset 0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-secondary,.ui-dialog .ibo-is-alternative.ibo-is-secondary.ui-button,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ui-dialog .ibo-is-alternative.ui-button,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-current,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-close,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-current,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button,.ibo-is-alternative.ui-datepicker-current,.ibo-is-alternative.ui-datepicker-current.ui-datepicker-close,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-close,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button,.ibo-is-alternative.ui-datepicker-close.ui-datepicker-current,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-secondary.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-alternative.ui-button,.ibo-button.ibo-is-alternative.ui-datepicker-current,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-button.ibo-is-alternative.ui-datepicker-close,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close{background-color:transparent;color:#212934;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-secondary:hover,.ui-dialog .ibo-is-alternative.ibo-is-secondary.ui-button:hover,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ui-dialog .ibo-is-alternative.ui-button:hover,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-close:hover,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-current:hover,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button:hover,.ibo-is-alternative.ui-datepicker-current:hover,.ibo-is-alternative.ui-datepicker-current.ui-datepicker-close:hover,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-close:hover,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button:hover,.ibo-is-alternative.ui-datepicker-close.ui-datepicker-current:hover,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-secondary.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close:hover,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-alternative.ui-button:hover,.ibo-button.ibo-is-alternative.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-button.ibo-is-alternative.ui-datepicker-close:hover,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover{background-color:#f8f9fa;color:#212934;box-shadow:0px 2px 0px #f8f9fa}.ibo-button.ibo-is-alternative.ibo-is-secondary:active,.ui-dialog .ibo-is-alternative.ibo-is-secondary.ui-button:active,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ui-dialog .ibo-is-alternative.ui-button:active,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-current:active,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-close:active,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-current:active,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button:active,.ibo-is-alternative.ui-datepicker-current:active,.ibo-is-alternative.ui-datepicker-current.ui-datepicker-close:active,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-close:active,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button:active,.ibo-is-alternative.ui-datepicker-close.ui-datepicker-current:active,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-secondary.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close:active,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-alternative.ui-button:active,.ibo-button.ibo-is-alternative.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-button.ibo-is-alternative.ui-datepicker-close:active,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active{background-color:#f8f9fa;color:#212934;box-shadow:inset 0px 2px 0px #e1e7ec , 0px 2px 0px #f8f9fa}.ibo-button.ibo-is-alternative.ibo-is-secondary:disabled,.ui-dialog .ibo-is-alternative.ibo-is-secondary.ui-button:disabled,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ui-dialog .ibo-is-alternative.ui-button:disabled,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-close:disabled,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-current:disabled,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button:disabled,.ibo-is-alternative.ui-datepicker-current:disabled,.ibo-is-alternative.ui-datepicker-current.ui-datepicker-close:disabled,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-close:disabled,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button:disabled,.ibo-is-alternative.ui-datepicker-close.ui-datepicker-current:disabled,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-secondary.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close:disabled,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-alternative.ui-button:disabled,.ibo-button.ibo-is-alternative.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-button.ibo-is-alternative.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled{background-color:transparent;color:#929fb1;box-shadow:inset 0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-danger,.ui-dialog .ibo-is-alternative.ibo-is-danger.ui-button,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-danger.ui-datepicker-current,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-danger.ui-datepicker-close,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-danger.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:transparent;color:#c53030;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-danger:hover,.ui-dialog .ibo-is-alternative.ibo-is-danger.ui-button:hover,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-danger.ui-datepicker-current:hover,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-danger.ui-datepicker-close:hover,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-danger.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:#fed7d7;color:#742a2a;box-shadow:0px 2px 0px #fed7d7}.ibo-button.ibo-is-alternative.ibo-is-danger:active,.ui-dialog .ibo-is-alternative.ibo-is-danger.ui-button:active,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-danger.ui-datepicker-current:active,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-danger.ui-datepicker-close:active,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-danger.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:#fed7d7;color:#742a2a;box-shadow:inset 0px 2px 0px #c53030 , 0px 2px 0px #fed7d7}.ibo-button.ibo-is-alternative.ibo-is-danger:disabled,.ui-dialog .ibo-is-alternative.ibo-is-danger.ui-button:disabled,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-danger.ui-datepicker-current:disabled,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-danger.ui-datepicker-close:disabled,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-danger.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:transparent;color:#929fb1;box-shadow:inset 0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-success,.ui-dialog .ibo-is-alternative.ibo-is-success.ui-button,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-success.ui-datepicker-current,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-success.ui-datepicker-close,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-success.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:transparent;color:#33691e;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-success:hover,.ui-dialog .ibo-is-alternative.ibo-is-success.ui-button:hover,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-success.ui-datepicker-current:hover,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-success.ui-datepicker-close:hover,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-success.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:#dcedc8;color:#33691e;box-shadow:0px 2px 0px #dcedc8}.ibo-button.ibo-is-alternative.ibo-is-success:active,.ui-dialog .ibo-is-alternative.ibo-is-success.ui-button:active,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-success.ui-datepicker-current:active,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-success.ui-datepicker-close:active,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-success.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:#dcedc8;color:#33691e;box-shadow:inset 0px 2px 0px #689f38 , 0px 2px 0px #dcedc8}.ibo-button.ibo-is-alternative.ibo-is-success:disabled,.ui-dialog .ibo-is-alternative.ibo-is-success.ui-button:disabled,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-success.ui-datepicker-current:disabled,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-success.ui-datepicker-close:disabled,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-success.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:transparent;color:#929fb1;box-shadow:inset 0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-red,.ui-dialog .ibo-is-alternative.ibo-is-red.ui-button,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-red.ui-datepicker-current,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-red.ui-datepicker-close,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-red.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:transparent;color:#c53030;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-red:hover,.ui-dialog .ibo-is-alternative.ibo-is-red.ui-button:hover,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-red.ui-datepicker-current:hover,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-red.ui-datepicker-close:hover,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-red.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:#fed7d7;color:#742a2a;box-shadow:0px 2px 0px #fed7d7}.ibo-button.ibo-is-alternative.ibo-is-red:active,.ui-dialog .ibo-is-alternative.ibo-is-red.ui-button:active,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-red.ui-datepicker-current:active,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-red.ui-datepicker-close:active,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-red.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:#fed7d7;color:#742a2a;box-shadow:inset 0px 2px 0px #c53030 , 0px 2px 0px #fed7d7}.ibo-button.ibo-is-alternative.ibo-is-red:disabled,.ui-dialog .ibo-is-alternative.ibo-is-red.ui-button:disabled,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-red.ui-datepicker-current:disabled,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-red.ui-datepicker-close:disabled,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-red.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:transparent;color:#929fb1;box-shadow:inset 0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-green,.ui-dialog .ibo-is-alternative.ibo-is-green.ui-button,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-green.ui-datepicker-current,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-green.ui-datepicker-close,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-green.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:transparent;color:#33691e;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-green:hover,.ui-dialog .ibo-is-alternative.ibo-is-green.ui-button:hover,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-green.ui-datepicker-current:hover,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-green.ui-datepicker-close:hover,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-green.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:#dcedc8;color:#33691e;box-shadow:0px 2px 0px #dcedc8}.ibo-button.ibo-is-alternative.ibo-is-green:active,.ui-dialog .ibo-is-alternative.ibo-is-green.ui-button:active,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-green.ui-datepicker-current:active,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-green.ui-datepicker-close:active,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-green.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:#dcedc8;color:#33691e;box-shadow:inset 0px 2px 0px #689f38 , 0px 2px 0px #dcedc8}.ibo-button.ibo-is-alternative.ibo-is-green:disabled,.ui-dialog .ibo-is-alternative.ibo-is-green.ui-button:disabled,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-green.ui-datepicker-current:disabled,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-green.ui-datepicker-close:disabled,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-green.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:transparent;color:#929fb1;box-shadow:inset 0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-cyan,.ui-dialog .ibo-is-alternative.ibo-is-cyan.ui-button,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-current,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-close,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-cyan.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:transparent;color:#006164;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-cyan:hover,.ui-dialog .ibo-is-alternative.ibo-is-cyan.ui-button:hover,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-current:hover,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-close:hover,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-cyan.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:#c9eef2;color:#006164;box-shadow:0px 2px 0px #c9eef2}.ibo-button.ibo-is-alternative.ibo-is-cyan:active,.ui-dialog .ibo-is-alternative.ibo-is-cyan.ui-button:active,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-current:active,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-close:active,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-cyan.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:#c9eef2;color:#006164;box-shadow:inset 0px 2px 0px #00838f , 0px 2px 0px #c9eef2}.ibo-button.ibo-is-alternative.ibo-is-cyan:disabled,.ui-dialog .ibo-is-alternative.ibo-is-cyan.ui-button:disabled,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-current:disabled,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-close:disabled,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-cyan.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:transparent;color:#929fb1;box-shadow:inset 0px 2px 0px transparent}.ibo-button,.ui-dialog .ui-button,.ui-datepicker-current,.ui-datepicker-close{position:relative;display:inline-block;padding:6px 9px;border:0;border-radius:4px;cursor:pointer;text-transform:uppercase;white-space:nowrap}.ibo-button.ibo-action-button,.ui-dialog .ibo-action-button.ui-button,.ibo-action-button.ui-datepicker-current,.ibo-action-button.ui-datepicker-close{float:right}.ibo-button .ibo-button--loading-icon,.ui-dialog .ui-button .ibo-button--loading-icon,.ui-datepicker-current .ibo-button--loading-icon,.ui-datepicker-close .ibo-button--loading-icon{display:none}.ibo-button.ibo-is-loading .ibo-button--icon,.ui-dialog .ibo-is-loading.ui-button .ibo-button--icon,.ibo-is-loading.ui-datepicker-current .ibo-button--icon,.ibo-is-loading.ui-datepicker-close .ibo-button--icon{display:none}.ibo-button.ibo-is-loading .ibo-button--loading-icon,.ui-dialog .ibo-is-loading.ui-button .ibo-button--loading-icon,.ibo-is-loading.ui-datepicker-current .ibo-button--loading-icon,.ibo-is-loading.ui-datepicker-close .ibo-button--loading-icon{display:inline-block}.ibo-button.ibo-is-loading .ibo-button--loading-icon+.ibo-button--label,.ui-dialog .ibo-is-loading.ui-button .ibo-button--loading-icon+.ibo-button--label,.ibo-is-loading.ui-datepicker-current .ibo-button--loading-icon+.ibo-button--label,.ibo-is-loading.ui-datepicker-close .ibo-button--loading-icon+.ibo-button--label{margin-left:4px}.ibo-button--icon+.ibo-button--label{margin-left:4px}.ibo-button--vertical-align{margin-top:4px;margin-bottom:4px}.ibo-button-group{display:inline-flex;flex-wrap:nowrap}.ibo-button-group .ibo-button,.ibo-button-group .ui-dialog .ui-button,.ui-dialog .ibo-button-group .ui-button,.ibo-button-group .ui-datepicker-current,.ibo-button-group .ui-datepicker-close{position:relative}.ibo-button-group .ibo-button:first-child,.ibo-button-group .ui-dialog .ui-button:first-child,.ui-dialog .ibo-button-group .ui-button:first-child,.ibo-button-group .ui-datepicker-current:first-child,.ibo-button-group .ui-datepicker-close:first-child{border-radius:4px 0 0 4px}.ibo-button-group .ibo-button:last-child,.ibo-button-group .ui-dialog .ui-button:last-child,.ui-dialog .ibo-button-group .ui-button:last-child,.ibo-button-group .ui-datepicker-current:last-child,.ibo-button-group .ui-datepicker-close:last-child{border-radius:0 4px 4px 0}.ibo-button-group .ibo-button:not(:first-child):not(:last-child),.ibo-button-group .ui-dialog .ui-button:not(:first-child):not(:last-child),.ui-dialog .ibo-button-group .ui-button:not(:first-child):not(:last-child),.ibo-button-group .ui-datepicker-current:not(:first-child):not(:last-child),.ibo-button-group .ui-datepicker-close:not(:first-child):not(:last-child){border-radius:0}.ibo-button-group .ibo-button+.ibo-button,.ibo-button-group .ui-dialog .ui-button+.ibo-button,.ibo-button-group .ui-dialog .ui-dialog .ui-button+.ui-button,.ui-dialog .ibo-button-group .ui-dialog .ui-button+.ui-button,.ibo-button-group .ui-dialog .ui-button+.ui-datepicker-current,.ibo-button-group .ui-dialog .ui-button+.ui-datepicker-close,.ui-dialog .ibo-button-group .ui-button+.ibo-button,.ibo-button-group .ui-datepicker-current+.ibo-button,.ibo-button-group .ui-dialog .ui-datepicker-current+.ui-button,.ui-dialog .ibo-button-group .ui-datepicker-current+.ui-button,.ibo-button-group .ui-datepicker-current+.ui-datepicker-current,.ibo-button-group .ui-datepicker-current+.ui-datepicker-close,.ibo-button-group .ui-datepicker-close+.ibo-button,.ibo-button-group .ui-dialog .ui-datepicker-close+.ui-button,.ui-dialog .ibo-button-group .ui-datepicker-close+.ui-button,.ibo-button-group .ui-datepicker-close+.ui-datepicker-current,.ibo-button-group .ui-datepicker-close+.ui-datepicker-close,.ibo-button-group .ui-dialog .ibo-button+.ui-button,.ui-dialog .ibo-button-group .ibo-button+.ui-button,.ibo-button-group .ibo-button+.ui-datepicker-current,.ibo-button-group .ibo-button+.ui-datepicker-close{margin-left:0}.ibo-button-group .ibo-button+.ibo-button::before,.ibo-button-group .ui-dialog .ui-button+.ibo-button::before,.ui-dialog .ibo-button-group .ui-button+.ibo-button::before,.ibo-button-group .ui-datepicker-current+.ibo-button::before,.ibo-button-group .ui-datepicker-close+.ibo-button::before,.ibo-button-group .ui-dialog .ibo-button+.ui-button::before,.ui-dialog .ibo-button-group .ibo-button+.ui-button::before,.ibo-button-group .ibo-button+.ui-datepicker-current::before,.ibo-button-group .ibo-button+.ui-datepicker-close::before{content:"";position:absolute;top:6px;bottom:6px;left:0;width:1px;border-left:1px solid transparent}.ibo-button-group>*+*.ibo-is-regular.ibo-is-neutral::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-current::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-close::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button.ui-dialog-titlebar-close::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close::before{border-left-color:#d5dde5}.ibo-button-group>*+*.ibo-is-regular.ibo-is-neutral:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button:hover::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:hover::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-current:hover::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-close:hover::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button.ui-dialog-titlebar-close:hover::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover::before{border-left-color:#d5dde5}.ibo-button-group>*+*.ibo-is-regular.ibo-is-neutral:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button:active::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:active::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-current:active::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-close:active::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button.ui-dialog-titlebar-close:active::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active::before{border-left-color:#e1e7ec}.ibo-button-group>*+*.ibo-is-regular.ibo-is-neutral:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:disabled::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-current:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button.ui-dialog-titlebar-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled::before{border-left-color:#aebecd}.ibo-button-group>*+*.ibo-is-regular.ibo-is-primary::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button::before,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-current::before,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-close::before{border-left-color:#006164}.ibo-button-group>*+*.ibo-is-regular.ibo-is-primary:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button:hover::before,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-current:hover::before,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-close:hover::before{border-left-color:#006164}.ibo-button-group>*+*.ibo-is-regular.ibo-is-primary:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button:active::before,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-current:active::before,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-close:active::before{border-left-color:#006164}.ibo-button-group>*+*.ibo-is-regular.ibo-is-primary:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button:disabled::before,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-current:disabled::before,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-close:disabled::before{border-left-color:#aebecd}.ibo-button-group>*+*.ibo-is-regular.ibo-is-secondary::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button::before,.ui-dialog .ibo-button-group>*+*.ui-button::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-current::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-close::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-current::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button::before,.ibo-button-group>*+*.ui-datepicker-current::before,.ibo-button-group>*+*.ui-datepicker-current.ui-datepicker-close::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-close::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button::before,.ibo-button-group>*+*.ui-datepicker-close.ui-datepicker-current::before,.ibo-button-group>*+*.ui-datepicker-close::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button::before,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-current::before,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-close::before{border-left-color:#d5dde5}.ibo-button-group>*+*.ibo-is-regular.ibo-is-secondary:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button:hover::before,.ui-dialog .ibo-button-group>*+*.ui-button:hover::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-current:hover::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-close:hover::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-current:hover::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button:hover::before,.ibo-button-group>*+*.ui-datepicker-current:hover::before,.ibo-button-group>*+*.ui-datepicker-current.ui-datepicker-close:hover::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-close:hover::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button:hover::before,.ibo-button-group>*+*.ui-datepicker-close.ui-datepicker-current:hover::before,.ibo-button-group>*+*.ui-datepicker-close:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button:hover::before,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-current:hover::before,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-close:hover::before{border-left-color:#d5dde5}.ibo-button-group>*+*.ibo-is-regular.ibo-is-secondary:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button:active::before,.ui-dialog .ibo-button-group>*+*.ui-button:active::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-current:active::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-close:active::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-current:active::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button:active::before,.ibo-button-group>*+*.ui-datepicker-current:active::before,.ibo-button-group>*+*.ui-datepicker-current.ui-datepicker-close:active::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-close:active::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button:active::before,.ibo-button-group>*+*.ui-datepicker-close.ui-datepicker-current:active::before,.ibo-button-group>*+*.ui-datepicker-close:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button:active::before,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-current:active::before,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-close:active::before{border-left-color:#e1e7ec}.ibo-button-group>*+*.ibo-is-regular.ibo-is-secondary:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-button:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-current:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-close:disabled::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-current:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button:disabled::before,.ibo-button-group>*+*.ui-datepicker-current:disabled::before,.ibo-button-group>*+*.ui-datepicker-current.ui-datepicker-close:disabled::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button:disabled::before,.ibo-button-group>*+*.ui-datepicker-close.ui-datepicker-current:disabled::before,.ibo-button-group>*+*.ui-datepicker-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button:disabled::before,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-current:disabled::before,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-close:disabled::before{border-left-color:#aebecd}.ibo-button-group>*+*.ibo-is-regular.ibo-is-danger::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button::before,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-current::before,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-close::before{border-left-color:#9b2c2c}.ibo-button-group>*+*.ibo-is-regular.ibo-is-danger:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button:hover::before,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-current:hover::before,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-close:hover::before{border-left-color:#9b2c2c}.ibo-button-group>*+*.ibo-is-regular.ibo-is-danger:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button:active::before,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-current:active::before,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-close:active::before{border-left-color:#9b2c2c}.ibo-button-group>*+*.ibo-is-regular.ibo-is-danger:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button:disabled::before,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-current:disabled::before,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-close:disabled::before{border-left-color:#aebecd}.ibo-button-group>*+*.ibo-is-regular.ibo-is-success::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button::before,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-current::before,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-close::before{border-left-color:#33691e}.ibo-button-group>*+*.ibo-is-regular.ibo-is-success:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button:hover::before,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-current:hover::before,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-close:hover::before{border-left-color:#33691e}.ibo-button-group>*+*.ibo-is-regular.ibo-is-success:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button:active::before,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-current:active::before,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-close:active::before{border-left-color:#33691e}.ibo-button-group>*+*.ibo-is-regular.ibo-is-success:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button:disabled::before,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-current:disabled::before,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-close:disabled::before{border-left-color:#aebecd}.ibo-button-group>*+*.ibo-is-regular.ibo-is-red::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button::before,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-current::before,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-close::before{border-left-color:#9b2c2c}.ibo-button-group>*+*.ibo-is-regular.ibo-is-red:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button:hover::before,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-current:hover::before,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-close:hover::before{border-left-color:#9b2c2c}.ibo-button-group>*+*.ibo-is-regular.ibo-is-red:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button:active::before,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-current:active::before,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-close:active::before{border-left-color:#9b2c2c}.ibo-button-group>*+*.ibo-is-regular.ibo-is-red:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button:disabled::before,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-current:disabled::before,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-close:disabled::before{border-left-color:#aebecd}.ibo-button-group>*+*.ibo-is-regular.ibo-is-green::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button::before,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-current::before,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-close::before{border-left-color:#33691e}.ibo-button-group>*+*.ibo-is-regular.ibo-is-green:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button:hover::before,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-current:hover::before,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-close:hover::before{border-left-color:#33691e}.ibo-button-group>*+*.ibo-is-regular.ibo-is-green:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button:active::before,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-current:active::before,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-close:active::before{border-left-color:#33691e}.ibo-button-group>*+*.ibo-is-regular.ibo-is-green:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button:disabled::before,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-current:disabled::before,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-close:disabled::before{border-left-color:#aebecd}.ibo-button-group>*+*.ibo-is-regular.ibo-is-cyan::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button::before,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-current::before,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-close::before{border-left-color:#006164}.ibo-button-group>*+*.ibo-is-regular.ibo-is-cyan:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button:hover::before,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-current:hover::before,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-close:hover::before{border-left-color:#006164}.ibo-button-group>*+*.ibo-is-regular.ibo-is-cyan:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button:active::before,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-current:active::before,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-close:active::before{border-left-color:#006164}.ibo-button-group>*+*.ibo-is-regular.ibo-is-cyan:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button:disabled::before,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-current:disabled::before,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-close:disabled::before{border-left-color:#aebecd}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-neutral::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button.ui-dialog-titlebar-close::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button.ui-dialog-titlebar-close::before{border-left-color:#404b5a}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-neutral:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button.ui-dialog-titlebar-close:hover::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button.ui-dialog-titlebar-close:hover::before{border-left-color:#404b5a}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-neutral:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button.ui-dialog-titlebar-close:active::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button.ui-dialog-titlebar-close:active::before{border-left-color:#404b5a}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-neutral:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button.ui-dialog-titlebar-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button.ui-dialog-titlebar-close:disabled::before{border-left-color:#aebecd}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-primary::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button.ui-dialog-titlebar-close::before{border-left-color:#00838f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-primary:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button.ui-dialog-titlebar-close:hover::before{border-left-color:#404b5a}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-primary:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button.ui-dialog-titlebar-close:active::before{border-left-color:#404b5a}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-primary:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button.ui-dialog-titlebar-close:disabled::before{border-left-color:#aebecd}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-secondary::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button.ui-dialog-titlebar-close::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button::before,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-current::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close::before,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-close::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close::before{border-left-color:#404b5a}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-secondary:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button.ui-dialog-titlebar-close:hover::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:hover::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button:hover::before,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-current:hover::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover::before,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-close:hover::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover::before{border-left-color:#404b5a}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-secondary:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button.ui-dialog-titlebar-close:active::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:active::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button:active::before,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-current:active::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active::before,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-close:active::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active::before{border-left-color:#404b5a}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-secondary:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button.ui-dialog-titlebar-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button:disabled::before,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-current:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled::before,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled::before{border-left-color:#aebecd}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-danger::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button.ui-dialog-titlebar-close::before{border-left-color:#e53e3e}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-danger:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button.ui-dialog-titlebar-close:hover::before{border-left-color:#9b2c2c}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-danger:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button.ui-dialog-titlebar-close:active::before{border-left-color:#9b2c2c}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-danger:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button.ui-dialog-titlebar-close:disabled::before{border-left-color:#aebecd}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-success::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button.ui-dialog-titlebar-close::before{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-success:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button.ui-dialog-titlebar-close:hover::before{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-success:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button.ui-dialog-titlebar-close:active::before{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-success:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button.ui-dialog-titlebar-close:disabled::before{border-left-color:#aebecd}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-red::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button.ui-dialog-titlebar-close::before{border-left-color:#e53e3e}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-red:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button.ui-dialog-titlebar-close:hover::before{border-left-color:#9b2c2c}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-red:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button.ui-dialog-titlebar-close:active::before{border-left-color:#9b2c2c}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-red:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button.ui-dialog-titlebar-close:disabled::before{border-left-color:#aebecd}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-green::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button.ui-dialog-titlebar-close::before{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-green:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button.ui-dialog-titlebar-close:hover::before{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-green:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button.ui-dialog-titlebar-close:active::before{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-green:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button.ui-dialog-titlebar-close:disabled::before{border-left-color:#aebecd}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-cyan::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button.ui-dialog-titlebar-close::before{border-left-color:#00838f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-cyan:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button.ui-dialog-titlebar-close:hover::before{border-left-color:#00838f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-cyan:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button.ui-dialog-titlebar-close:active::before{border-left-color:#00838f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-cyan:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button.ui-dialog-titlebar-close:disabled::before{border-left-color:#aebecd}.ibo-breadcrumbs{position:relative;margin-right:32px}.ibo-breadcrumbs.ibo-is-overflowing{justify-content:right}.ibo-breadcrumbs *{display:flex;align-items:center}.ibo-breadcrumbs--item{color:#404b5a}.ibo-breadcrumbs--item:not(:last-child):hover .ibo-breadcrumbs--item-icon>*{opacity:1;filter:none}.ibo-breadcrumbs--item-icon{margin-right:8px;transition:all 0.1s linear}.ibo-breadcrumbs--item-icon>span{color:#929fb1;opacity:0.6}.ibo-breadcrumbs--item-icon>img{height:auto;max-width:16px;opacity:0.3;filter:grayscale(100%)}.ibo-breadcrumbs--item-label{display:inline;max-width:100px}.ibo-breadcrumbs--item:not(:last-child)::after,.ibo-breadcrumbs--previous-items-list-toggler:not(:last-child)::after{content:"";margin:0 12px;color:#aebecd}.ibo-breadcrumbs--previous-items-list-toggler{margin-right:24px;color:#6e7a8a !important}.ibo-breadcrumbs--previous-items-list-toggler:not(:last-child)::after{position:absolute;right:-24px}.ibo-breadcrumbs--previous-items-list{display:flex;flex-direction:column;align-items:stretch;position:fixed;top:37px;padding:8px 0;background-color:white}.ibo-breadcrumbs--previous-item{color:#404b5a;padding:12px 12px}.ibo-breadcrumbs--previous-item .ibo-breadcrumbs--item-label{max-width:200px}@keyframes ibo-quick-create--drawer--opening{from{top:-310px;box-shadow:none}to{top:100%;box-shadow:0 3px 6px rgba(0, 0, 0, 0.1), 0 10px 20px rgba(0, 0, 0, 0.15)}}.ibo-quick-create{position:relative}.ibo-quick-create.ibo-is-opened .ibo-quick-create--input,.ibo-quick-create.ibo-input-select-icon--menu .ibo-quick-create--input{width:245px}.ibo-quick-create.ibo-is-opened .ibo-quick-create--drawer,.ibo-quick-create.ibo-input-select-icon--menu .ibo-quick-create--drawer{animation-name:ibo-quick-create--drawer--opening;animation-delay:0.1s;animation-duration:0.2s;animation-direction:normal;animation-fill-mode:forwards}.ibo-quick-create--head{background-color:white}.ibo-quick-create--icon{color:#dd6c20;align-self:center;padding:0 16px}.ibo-quick-create--icon:hover{color:#c05621}.ibo-quick-create--icon:active{color:#9c4221}.ibo-quick-create--input{width:0;border:none;transition:all 0.2s ease-in-out}.ibo-quick-create--input.selectize-control.single{position:sticky;display:flex}.ibo-quick-create--input.selectize-control.single .selectize-input,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active{display:flex;background-color:transparent;background-image:none;border:none;box-shadow:none}.ibo-quick-create--input.selectize-control.single .selectize-input>input,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active>input{color:#404b5a;outline:none;border:none}.ibo-quick-create--input.selectize-control.single .selectize-input>input::placeholder,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active>input::placeholder{color:#929fb1}.ibo-quick-create--input.selectize-control.single .selectize-input>input:-ms-input-placeholder,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active>input:-ms-input-placeholder,.ibo-quick-create--input.selectize-control.single .selectize-input>input::-ms-input-placeholder,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active>input::-ms-input-placeholder{color:#929fb1}.ibo-quick-create--input.selectize-control.single .selectize-input>.item,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active>.item{color:#404b5a;line-height:200%}.ibo-quick-create--input.selectize-control.single .selectize-dropdown{background-color:white;border:none;border-radius:0}.ibo-quick-create--drawer{z-index:-1;position:absolute;left:0;right:0;top:-310px;padding:16px 16px;background-color:white;box-shadow:none}.ibo-quick-create--compartment-title{margin-top:8px;margin-bottom:8px;padding-left:32px;overflow-x:hidden;color:#404b5a}.ibo-quick-create--compartment-title>span{position:relative}.ibo-quick-create--compartment-title>span::before,.ibo-quick-create--compartment-title>span::after{content:"";display:inline-block;position:absolute;top:50%;height:1px;width:600px;border-top:1px solid #404b5a}.ibo-quick-create--compartment-title>span::before{right:100%;margin-right:8px}.ibo-quick-create--compartment-title>span::after{left:100%;margin-left:8px}.ibo-quick-create--compartment-content{color:#212934}.ibo-quick-create--compartment-element{display:flex;align-items:center;padding:4px 8px;margin-left:-8px;margin-right:-8px;color:inherit}.ibo-quick-create--compartment-element-image{margin-right:8px;width:20px}.ibo-quick-create--compartment-results--container{position:static;width:100% !important;background:transparent;border:none;box-shadow:none}.ibo-quick-create--compartment-results--element{overflow:unset;max-height:unset}.ibo-quick-create--compartment-results--element>.option{padding:4px 8px;margin-left:-8px;margin-right:-8px;color:inherit}.ibo-quick-create--compartment-results--element>.option.active{background-color:#e1e7ec;border-radius:3px}.ibo-quick-create--compartment-results--element>.option:hover{cursor:pointer}.ibo-quick-create--compartment-results--element>.option .highlight{font-weight:bold}.ibo-quick-create--compartment--placeholder{align-items:center;display:flex;flex-direction:column}.ibo-quick-create--compartment--placeholder-image>svg{width:66%;height:inherit;margin:24px auto 16px auto;display:flex}.ibo-quick-create--compartment--placeholder-hint{text-align:justify;padding:0 8px;color:#6e7a8a}@keyframes ibo-global-search--drawer--opening{from{top:-310px;box-shadow:none}to{top:100%;box-shadow:0 3px 6px rgba(0, 0, 0, 0.1), 0 10px 20px rgba(0, 0, 0, 0.15)}}.ibo-global-search{position:relative}.ibo-global-search.ibo-is-opened .ibo-global-search--input,.ibo-global-search.ibo-input-select-icon--menu .ibo-global-search--input,.ibo-global-search.ibo-is-opened .ibo-global-search--input:hover,.ibo-global-search.ibo-is-opened .ibo-global-search--input:focus,.ibo-global-search.ibo-is-opened .ibo-global-search--input:active,.ibo-global-search.ibo-input-select-icon--menu .ibo-global-search--input:hover,.ibo-global-search.ibo-input-select-icon--menu .ibo-global-search--input:focus,.ibo-global-search.ibo-input-select-icon--menu .ibo-global-search--input:active{padding:8px 8px;width:245px}.ibo-global-search.ibo-is-opened .ibo-global-search--drawer,.ibo-global-search.ibo-input-select-icon--menu .ibo-global-search--drawer{animation-name:ibo-global-search--drawer--opening;animation-delay:0.1s;animation-duration:0.2s;animation-direction:normal;animation-fill-mode:forwards}.ibo-global-search--head{background-color:white}.ibo-global-search--icon{color:#dd6c20;align-self:center;padding:0 16px}.ibo-global-search--icon:hover{color:#c05621}.ibo-global-search--icon:active{color:#9c4221}.ibo-global-search--input,.ibo-global-search--input:hover,.ibo-global-search--input:focus,.ibo-global-search--input:active{padding:0;width:0;color:#404b5a;background-color:transparent;border:none;outline:none;transition:all 0.2s ease-in-out}.ibo-global-search--input::placeholder,.ibo-global-search--input:hover::placeholder,.ibo-global-search--input:focus::placeholder,.ibo-global-search--input:active::placeholder{color:#929fb1}.ibo-global-search--input:-ms-input-placeholder,.ibo-global-search--input:hover:-ms-input-placeholder,.ibo-global-search--input:focus:-ms-input-placeholder,.ibo-global-search--input:active:-ms-input-placeholder,.ibo-global-search--input::-ms-input-placeholder,.ibo-global-search--input:hover::-ms-input-placeholder,.ibo-global-search--input:focus::-ms-input-placeholder,.ibo-global-search--input:active::-ms-input-placeholder{color:#929fb1}.ibo-global-search--drawer{z-index:-1;position:absolute;left:0;right:0;top:-310px;padding:16px 16px;background-color:white;box-shadow:none}.ibo-global-search--compartment-title{margin-bottom:8px;padding-left:32px;overflow-x:hidden;color:#404b5a}.ibo-global-search--compartment-title>span{position:relative}.ibo-global-search--compartment-title>span::before,.ibo-global-search--compartment-title>span::after{content:"";display:inline-block;position:absolute;top:50%;height:1px;width:600px;border-top:1px solid #404b5a}.ibo-global-search--compartment-title>span::before{right:100%;margin-right:8px}.ibo-global-search--compartment-title>span::after{left:100%;margin-left:8px}.ibo-global-search--compartment-content{color:#212934}.ibo-global-search--compartment-element{display:flex;align-items:center;color:inherit}.ibo-global-search--compartment-element:not(:last-child){margin-bottom:8px}.ibo-global-search--compartment-element-image{margin-right:8px;width:20px}.ibo-global-search--compartment--placeholder{align-items:center;display:flex;flex-direction:column}.ibo-global-search--compartment--placeholder-image>svg{width:66%;height:inherit;margin:24px auto 16px auto;display:flex}.ibo-global-search--compartment--placeholder-hint{text-align:justify;padding:0 8px;color:#6e7a8a}.ibo-popover-menu,.ui-menu,.ui-multiselect-menu,.ibo-input-select-icon--menu,.graph_config .toolkit_menu.graph>ul>li ul{display:none;padding:0;background-color:white;border-radius:3px;flex-wrap:wrap;position:absolute}.ibo-popover-menu.ibo-is-opened,.ibo-is-opened.ui-menu,.ui-menu.ibo-input-select-icon--menu,.ibo-is-opened.ui-multiselect-menu,.ui-multiselect-menu.ibo-input-select-icon--menu,.ibo-is-opened.ibo-input-select-icon--menu,.ibo-input-select-icon--menu,.graph_config .toolkit_menu.graph>ul>li ul.ibo-is-opened,.graph_config .toolkit_menu.graph>ul>li ul.ibo-input-select-icon--menu,.ibo-popover-menu.ibo-input-select-icon--menu,.ibo-input-select-icon--menu.ui-menu,.ibo-input-select-icon--menu.ui-multiselect-menu{display:flex;flex-direction:column}.ibo-popover-menu--toggler-visual-hint{margin-left:0.5rem}.ibo-popover-menu--section,.ui-multiselect-checkboxes{display:flex;flex-direction:column;align-self:flex-start;margin:0 0;width:100%;white-space:nowrap;overflow:hidden}.ibo-popover-menu--section:first-child,.ui-multiselect-checkboxes:first-child{border-radius:3px 3px 0 0}.ibo-popover-menu--section:last-child,.ui-multiselect-checkboxes:last-child{border-radius:0 0 3px 3px}.ibo-popover-menu--item,.ui-menu-item,.ui-multiselect-checkboxes li,.ibo-input-select-icon--menu--item,.graph_config .toolkit_menu.graph>ul>li ul li{padding:12px 24px 12px 16px;color:#212934}.ibo-popover-menu--item a,.ui-menu-item a,.ui-menu-item .ibo-quick-create--compartment-results--element>.option:hover,.ui-multiselect-checkboxes li a,.ui-multiselect-checkboxes li .ibo-quick-create--compartment-results--element>.option:hover,.ibo-input-select-icon--menu--item a,.ibo-input-select-icon--menu--item .ibo-quick-create--compartment-results--element>.option:hover,.graph_config .toolkit_menu.graph>ul>li ul li a,.graph_config .toolkit_menu.graph>ul>li ul li .ibo-quick-create--compartment-results--element>.option:hover,.ibo-popover-menu--item .ibo-quick-create--compartment-results--element>.option:hover{color:#212934}.ibo-popover-menu--item:hover,.ui-menu-item:hover,.ui-multiselect-checkboxes li:hover,.ibo-input-select-icon--menu--item:hover,.graph_config .toolkit_menu.graph>ul>li ul li:hover{background-color:#e1e7ec;color:inherit}.ibo-popover-menu--item.ibo-popover-menu--item-separator,.ibo-popover-menu--item-separator.ui-menu-item,.ui-menu-item.ui-autocomplete-category,.ui-multiselect-checkboxes li.ibo-popover-menu--item-separator,.ui-multiselect-checkboxes li.ui-autocomplete-category,.ibo-popover-menu--item-separator.ibo-input-select-icon--menu--item,.ibo-input-select-icon--menu--item.ui-autocomplete-category,.graph_config .toolkit_menu.graph>ul>li ul li.ibo-popover-menu--item-separator,.graph_config .toolkit_menu.graph>ul>li ul li.ui-autocomplete-category,.ibo-popover-menu--item.ui-autocomplete-category,.ui-autocomplete-category.ui-menu-item,.ui-autocomplete-category.ibo-input-select-icon--menu--item{padding:0;margin:0;background-color:#e1e7ec}.ibo-popover-menu--item--icon{padding-right:5px;color:#6e7a8a;font-size:1.33rem}#ibo-navigation-menu--notifications-menu{flex-flow:column;min-width:min(550px, 90vw);max-width:90vw}#ibo-navigation-menu--notifications-menu .ibo-navigation-menu--notifications--messages-section{overflow:auto}.ibo-navigation-menu--notifications--show-all-messages,.ibo-navigation-menu--notifications-dismiss-all,.ibo-navigation-menu--notifications-show-all-multiple{overflow-x:inherit;text-align:center;min-height:45px}.ibo-navigation-menu--notifications--item--image{max-width:20px;max-height:20px;margin:0 6px;border-radius:100%}.ibo-navigation-menu--notifications--item--image[src=""]{display:none}.ibo-navigation-menu--notifications--item--image:not([src=""])~.ibo-navigation-menu--notifications--item--image{display:none}.ibo-navigation-menu--notifications--item--bottom-text{display:flex;flex-direction:column;align-items:center;float:right;align-self:center;margin-left:auto;margin-right:auto}.ibo-navigation-menu--notifications--item--content{flex-grow:1;padding:0 14px;max-height:128px;overflow-y:auto;white-space:normal}.ibo-navigation-menu--notifications--item--content img{max-height:100px;padding:5px}.ibo-navigation-menu--notifications-item{display:flex;flex-direction:row;cursor:pointer}.ibo-navigation-menu--notifications--item--new-message-indicator{width:13px;height:13px;background-color:white;border:solid 2px #aebecd;border-radius:100%;margin-top:4px;flex-shrink:0}.ibo-navigation-menu--notifications--item--new-message-indicator.ibo-is-priority-1{background-color:#fce8e8;border:solid 2px #f56565}.ibo-navigation-menu--notifications--item--new-message-indicator.ibo-is-priority-2{background-color:floralwhite;border:solid 2px #ea7d1e}.ibo-navigation-menu--notifications--item--new-message-indicator.ibo-is-priority-3{background-color:#ebf8ff;border:solid 2px #429ae1}.ibo-navigation-menu--notifications--item--new-message-indicator.ibo-is-priority-4{background-color:white;border:solid 2px #aebecd}.ibo-navigation-menu--notifications-show-all-multiple~.ibo-popover-menu .ibo-navigation-menu--notifications--item--new-message-indicator,.ibo-navigation-menu--notifications-show-all-multiple~.ui-menu .ibo-navigation-menu--notifications--item--new-message-indicator,.ibo-navigation-menu--notifications-show-all-multiple~.ui-multiselect-menu .ibo-navigation-menu--notifications--item--new-message-indicator,.ibo-navigation-menu--notifications-show-all-multiple~.ibo-input-select-icon--menu .ibo-navigation-menu--notifications--item--new-message-indicator,.graph_config .toolkit_menu.graph>ul>li .ibo-navigation-menu--notifications-show-all-multiple~ul .ibo-navigation-menu--notifications--item--new-message-indicator{display:inline-block;margin-right:15px}.ibo-navigation-menu--notifications-dismiss-all--icon{margin:0 10px 0 0}.ibo-popover-menu--item--no-message{text-align:center}.ibo-popover-menu--item--no-message--image>svg{max-width:220px;height:inherit;padding:15px}.ibo-panel.ibo-has-sticky-header>.ibo-panel--header .ibo-panel--title,.ibo-panel.ibo-has-sticky-header>.ibo-object-summary--header .ibo-panel--title,.ibo-panel.ibo-has-sticky-header>.ibo-panel--header .ibo-panel--subtitle,.ibo-panel.ibo-has-sticky-header>.ibo-object-summary--header .ibo-panel--subtitle,.ibo-panel.ibo-has-sticky-header>.ibo-panel--header .ibo-panel--icon,.ibo-panel.ibo-has-sticky-header>.ibo-object-summary--header .ibo-panel--icon,.ibo-panel.ibo-has-sticky-header>.ibo-panel--header .ibo-panel--titles,.ibo-panel.ibo-has-sticky-header>.ibo-object-summary--header .ibo-panel--titles,.ibo-object-details.ibo-has-sticky-header>.ibo-panel--header .ibo-panel--header-left,.ibo-object-details.ibo-has-sticky-header>.ibo-object-summary--header .ibo-panel--header-left{transition:all 0.15s linear}.ibo-panel{--ibo-main-color: #929fb1;position:relative}.ibo-panel.ibo-has-icon>.ibo-panel--header .ibo-panel--titles,.ibo-panel.ibo-has-icon>.ibo-object-summary--header .ibo-panel--titles{padding-left:16px}.ibo-panel.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header .ibo-panel--header-left,.ibo-panel.ibo-has-icon.ibo-has-medallion-icon>.ibo-object-summary--header .ibo-panel--header-left{position:relative;z-index:1;margin-left:16px}.ibo-panel.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header .ibo-panel--header-left .ibo-panel--icon,.ibo-panel.ibo-has-icon.ibo-has-medallion-icon>.ibo-object-summary--header .ibo-panel--header-left .ibo-panel--icon{position:absolute;bottom:-24px;left:0;overflow:hidden;width:72px;height:72px;min-width:72px;min-height:72px;background-color:#f8f9fa;border:2px solid #90a4ae;border-radius:100%}.ibo-panel.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header .ibo-panel--header-left .ibo-panel--titles,.ibo-panel.ibo-has-icon.ibo-has-medallion-icon>.ibo-object-summary--header .ibo-panel--header-left .ibo-panel--titles{padding-left:calc(72px + 16px)}.ibo-panel.ibo-is-selectable .ibo-panel--body::after{content:" ";background-color:transparent;cursor:pointer;position:absolute;display:flex;align-items:center;justify-content:center;height:100%;width:100%;z-index:3;font-size:7rem}.ibo-panel.ibo-is-selectable:hover .ibo-panel--body::after{content:"";color:#f8f9fa;background-color:rgba(146, 159, 177, 0.4);display:flex}.ibo-panel.ibo-is-selected .ibo-panel--body::after{content:"";color:#f8f9fa;background-color:rgba(33, 41, 52, 0.5);display:flex}.ibo-panel.ibo-is-selected:hover .ibo-panel--body::after{background-color:rgba(110, 122, 138, 0.5);display:flex}.ibo-panel--header,.ibo-object-summary--header{position:relative;z-index:2;display:flex;justify-content:space-between;align-items:flex-end;margin-bottom:4px}.ibo-panel--header-left{justify-content:left}.ibo-panel--icon{width:48px;height:48px;min-width:48px;min-height:48px}.ibo-panel--icon-img,.ibo-panel--icon-background{width:100%;height:100%;object-position:center;object-fit:contain;background-position:center;background-repeat:no-repeat;background-size:contain}.ibo-panel--icon-img--must-contain,.ibo-panel--icon-background--must-contain{object-fit:contain;background-size:contain}.ibo-panel--icon-img--must-cover,.ibo-panel--icon-background--must-cover{object-fit:cover;background-size:cover}.ibo-panel--icon-img--must-zoomout,.ibo-panel--icon-background--must-zoomout{width:66.67%;height:66.67%}.ibo-panel--title{display:inline-block;color:#212934;flex-grow:1}.ibo-panel--subtitle{display:flex;color:#404b5a}.ibo-panel--body{position:relative;z-index:1;padding:32px 16px 24px 16px;background-color:white;border:1px solid #ccd4db;border-radius:5px;overflow:hidden}.ibo-panel--body::before{position:absolute;top:0;left:0;display:block;background-color:var(--ibo-main-color);content:"";width:100%;height:8px;padding-bottom:8px}.ibo-panel.ibo-is-primary>.ibo-panel--body::before{background-color:#dd6c20}.ibo-panel.ibo-is-secondary>.ibo-panel--body::before,.ui-dialog .ibo-panel.ui-button>.ibo-panel--body::before,.ibo-panel.ui-datepicker-current>.ibo-panel--body::before,.ibo-panel.ui-datepicker-close>.ibo-panel--body::before{background-color:#929fb1}.ibo-panel.ibo-is-neutral>.ibo-panel--body::before,.ui-dialog .ibo-panel.ui-button.ui-dialog-titlebar-close>.ibo-panel--body::before{background-color:#929fb1}.ibo-panel.ibo-is-information>.ibo-panel--body::before{background-color:#3182ce}.ibo-panel.ibo-is-success>.ibo-panel--body::before{background-color:#7cb342}.ibo-panel.ibo-is-failure>.ibo-panel--body::before{background-color:#e53e3e}.ibo-panel.ibo-is-warning>.ibo-panel--body::before{background-color:#dd6c20}.ibo-panel.ibo-is-danger>.ibo-panel--body::before{background-color:#e53e3e}.ibo-panel.ibo-is-grey>.ibo-panel--body::before{background-color:#929fb1}.ibo-panel.ibo-is-blue-grey>.ibo-panel--body::before{background-color:#546e7a}.ibo-panel.ibo-is-blue>.ibo-panel--body::before{background-color:#2c5382}.ibo-panel.ibo-is-cyan>.ibo-panel--body::before{background-color:#00aac1}.ibo-panel.ibo-is-green>.ibo-panel--body::before{background-color:#7cb342}.ibo-panel.ibo-is-orange>.ibo-panel--body::before{background-color:#dd6c20}.ibo-panel.ibo-is-red>.ibo-panel--body::before{background-color:#e53e3e}.ibo-panel.ibo-is-pink>.ibo-panel--body::before{background-color:#d53f8c}.ibo-panel--collapsible-toggler{display:inline-block;margin-right:8px;font-size:1.5rem;color:#6e7a8a;cursor:pointer}.ibo-panel .ibo-panel--collapsible-toggler--opened{display:block}.ibo-panel .ibo-panel--collapsible-toggler--closed{display:none}.ibo-panel:not(.ibo-is-opened) .ibo-panel--collapsible-toggler--closed{display:block}.ibo-panel:not(.ibo-is-opened) .ibo-panel--collapsible-toggler--opened{display:none}.ibo-panel:not(.ibo-is-opened) .ibo-panel--body{display:none}.ibo-panel.ibo-has-sticky-header>.ibo-panel--header,.ibo-panel.ibo-has-sticky-header>.ibo-object-summary--header{position:sticky;top:0;border:transparent;transition-property:all, top, background-color;transition-duration:0.15s, 0s, 0s;transition-timing-function:linear}.ibo-panel.ibo-has-sticky-header>.ibo-panel--header.ibo-is-sticking,.ibo-panel.ibo-has-sticky-header>.ibo-is-sticking.ibo-object-summary--header{padding-top:4px;padding-bottom:4px;background-color:#f8f9fa;border:1px solid #ccd4db;align-items:center}.ibo-panel.ibo-has-sticky-header>.ibo-panel--header.ibo-is-sticking .ibo-panel--title,.ibo-panel.ibo-has-sticky-header>.ibo-is-sticking.ibo-object-summary--header .ibo-panel--title{font-size:1.17rem}.ibo-panel.ibo-has-sticky-header>.ibo-panel--header.ibo-is-sticking .ibo-panel--subtitle,.ibo-panel.ibo-has-sticky-header>.ibo-is-sticking.ibo-object-summary--header .ibo-panel--subtitle{font-size:1rem}.ibo-panel.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header,.ibo-panel.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-object-summary--header{}.ibo-panel.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header.ibo-is-sticking .ibo-panel--icon,.ibo-panel.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-is-sticking.ibo-object-summary--header .ibo-panel--icon{bottom:-12px;width:48px;height:48px;min-width:48px;min-height:48px;border:1px solid #ccd4db}.ibo-panel.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header.ibo-is-sticking .ibo-panel--titles,.ibo-panel.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-is-sticking.ibo-object-summary--header .ibo-panel--titles{padding-left:calc(48px + 16px)}.ibo-collapsible-section--header{display:flex;align-items:stretch}.ibo-collapsible-section.ibo-is-opened .ibo-collapsible-section--minimize-button,.ibo-collapsible-section.ibo-input-select-icon--menu .ibo-collapsible-section--minimize-button{display:block}.ibo-collapsible-section.ibo-is-opened .ibo-collapsible-section--maximize-button,.ibo-collapsible-section.ibo-input-select-icon--menu .ibo-collapsible-section--maximize-button{display:none}.ibo-collapsible-section:not(.ibo-is-opened) .ibo-collapsible-section--minimize-button{display:none}.ibo-collapsible-section:not(.ibo-is-opened) .ibo-collapsible-section--maximize-button{display:block}.ibo-collapsible-section:not(.ibo-is-opened) .ibo-collapsible-section--body{display:none}.ibo-collapsible-section .ibo-collapsible-section--header{cursor:pointer}.ibo-collapsible-section .ibo-collapsible-section--header:hover i{opacity:0.8}.ibo-collapsible-section .ibo-collapsible-section--header .ibo-collapsible-section--action-button{align-self:center}.ibo-collapsible-section .ibo-collapsible-section--header .ibo-collapsible-section--action-button.ibo-collapsible-section--maximize-button,.ibo-collapsible-section .ibo-collapsible-section--header .ibo-collapsible-section--action-button.ibo-collapsible-section--minimize-button{color:#6e7a8a;margin-right:8px}.ibo-collapsible-section .ibo-collapsible-section--header .ibo-collapsible-section--title{color:#212934;flex-grow:1}.ibo-collapsible-section .ibo-collapsible-section--body{position:relative;padding:24px 16px 16px;background-color:white;border:solid 1px #ccd4db;border-radius:5px;overflow:hidden}.ibo-modal{display:flex;flex-direction:column;max-height:90vh !important;max-width:90vw !important}.ibo-modal.ibo-is-extra-small{height:calc(min(20vh, 150px)) !important;width:calc(min(20vw, 200px)) !important}.ibo-modal.ibo-is-small{height:calc(min(60vh, 400px)) !important;width:calc(min(60vw, 800px)) !important}.ibo-modal.ibo-is-medium{height:calc(min(75vh, 600px)) !important;width:calc(min(75vw, 1200px)) !important}.ibo-modal.ibo-is-large{height:calc(min(90vh, 900px)) !important;width:calc(min(90vw, 1800px)) !important}.ibo-modal-option--do-not-show-again{margin-top:16px}.ibo-modal-option--do-not-show-again .ibo-modal-option--do-not-show-again--checkbox{height:auto;display:inline-block;width:auto}.ibo-modal.ibo-is-informative{align-items:center;min-width:384px;min-height:24px !important}.ibo-modal.ibo-is-informative::before{display:block;position:absolute;top:0;left:0;content:"";width:4px;height:100%}.ibo-modal.ibo-is-informative.ibo-is-error::before{background-color:#e53e3e}.ibo-modal.ibo-is-informative.ibo-is-warning::before{background-color:#dd6c20}.ibo-modal.ibo-is-informative.ibo-is-information::before{background-color:#3182ce}.ibo-modal.ibo-is-informative.ibo-is-success::before{background-color:#7cb342}.ibo-dashlet{position:relative;width:calc(100% - 24px);margin:calc(24px / 2) calc(24px / 2)}.ibo-dashlet.dashlet-selected{position:relative}.ibo-dashlet--is-inline{width:auto}.ibo-dashlet-blocker{position:absolute;z-index:9;top:0;left:0;width:100%;height:100%;cursor:not-allowed}:root{--ibo-dashlet-badge--min-width: 200px;--ibo-dashlet-badge--padding-x: 16px;--ibo-dashlet-badge--padding-y: 16px;--ibo-dashlet-badge--background-color: white;--ibo-dashlet-badge--border: 1px solid #ccd4db;--ibo-dashlet-badge--border-radius: 5px}.ibo-dashlet-badge{max-width:350px;flex-basis:200px;flex-grow:1;flex-shrink:1;padding:16px 16px;background-color:white;border:1px solid #ccd4db;border-radius:5px}.ibo-dashlet-badge--body{display:flex;justify-items:left;align-items:center}.ibo-dashlet-badge--icon-container{margin-right:16px}.ibo-dashlet-badge--icon{width:48px;min-width:48px;max-height:48px}.ibo-dashlet-badge--actions{flex-grow:1;overflow-x:hidden}.ibo-dashlet-badge--action-list{color:inherit}.ibo-dashlet-badge--action-list-count{margin-right:8px}.ibo-dashlet-badge--action-list-label{display:inline-block}.ibo-dashlet-badge--action-create-icon{margin-right:8px}.ibo-dashlet-badge--body--tooltip-title{margin-bottom:16px}.ibo-dashlet-header-static{padding:16px 16px 0 16px;overflow-x:hidden}.ibo-dashlet-header-static--body{position:relative;display:inline-flex;justify-items:left;align-items:center;margin-left:48px;color:#212934}.ibo-dashlet-header-static--body::before,.ibo-dashlet-header-static--body::after{content:"";position:absolute;top:50%;width:10000px;height:1px;border-bottom:2px solid #ccd4db}.ibo-dashlet-header-static--body::before{right:calc(100% + 16px)}.ibo-dashlet-header-static--body::after{left:calc(100% + 16px)}.ibo-dashlet-header-static--icon-container{margin-right:16px}.ibo-dashlet-header-static--icon{width:48px;min-width:48px;max-height:48px}.ibo-dashlet-header-dynamic--container{display:flex;flex-wrap:wrap}.ibo-dashlet-header-dynamic--count{margin-right:10px}.ibo-input,.ui-autocomplete-input,.ui-multiselect,.dataTables_length select,.ui_tpicker_hour_slider>select,.ui_tpicker_minute_slider>select,.ui_tpicker_second_slider>select,select.ibo-input-select-placeholder,.ibo-datatableconfig--attributes-panel--per-page--input,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper input[type="text"]{height:30px;width:100%;background-color:white;color:#212934;padding:0 10px;border:1px solid #aebecd;border-radius:3px}.ibo-input:focus,.ui-autocomplete-input:focus,.ui-multiselect:focus,.dataTables_length select:focus,.ui_tpicker_hour_slider>select:focus,.ui_tpicker_minute_slider>select:focus,.ui_tpicker_second_slider>select:focus,select.ibo-input-select-placeholder:focus,.ibo-datatableconfig--attributes-panel--per-page--input:focus,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"]:focus,.search_form_handler .sf_filter .sff_input_wrapper input[type="text"]:focus{border-color:#dd6c20}.ibo-input:disabled,.ui-autocomplete-input:disabled,.ui-multiselect:disabled,.dataTables_length select:disabled,.ui_tpicker_hour_slider>select:disabled,.ui_tpicker_minute_slider>select:disabled,.ui_tpicker_second_slider>select:disabled,select.ibo-input-select-placeholder:disabled,.ibo-datatableconfig--attributes-panel--per-page--input:disabled,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"]:disabled,.search_form_handler .sf_filter .sff_input_wrapper input[type="text"]:disabled{background-color:#d5dde5;color:#929fb1}.ibo-input::placeholder,.ui-autocomplete-input::placeholder,.ui-multiselect::placeholder,.dataTables_length select::placeholder,.ui_tpicker_hour_slider>select::placeholder,.ui_tpicker_minute_slider>select::placeholder,.ui_tpicker_second_slider>select::placeholder,select.ibo-input-select-placeholder::placeholder,.ibo-datatableconfig--attributes-panel--per-page--input::placeholder,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"]::placeholder,.search_form_handler .sf_filter .sff_input_wrapper input[type="text"]::placeholder{color:#929fb1}textarea.ibo-input,textarea.ui-autocomplete-input,textarea.ui-multiselect,textarea.ibo-datatableconfig--attributes-panel--per-page--input{height:unset}.ibo-input-wrapper.is-error .ibo-input,.is-error.ui_tpicker_hour_slider .ibo-input,.is-error.ui_tpicker_hour_slider .ui-autocomplete-input,.is-error.ui_tpicker_hour_slider .ui-multiselect,.is-error.ui_tpicker_hour_slider .dataTables_length select,.dataTables_length .is-error.ui_tpicker_hour_slider select,.is-error.ui_tpicker_hour_slider .ui_tpicker_hour_slider>select,.is-error.ui_tpicker_hour_slider .ui_tpicker_minute_slider>select,.is-error.ui_tpicker_hour_slider .ui_tpicker_second_slider>select,.is-error.ui_tpicker_hour_slider select.ibo-input-select-placeholder,.is-error.ui_tpicker_hour_slider .ibo-datatableconfig--attributes-panel--per-page--input,.is-error.ui_tpicker_hour_slider .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .is-error.ui_tpicker_hour_slider input[type="text"],.is-error.ui_tpicker_hour_slider .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .is-error.ui_tpicker_hour_slider input[type="text"],.is-error.ui_tpicker_minute_slider .ibo-input,.is-error.ui_tpicker_minute_slider .ui-autocomplete-input,.is-error.ui_tpicker_minute_slider .ui-multiselect,.is-error.ui_tpicker_minute_slider .dataTables_length select,.dataTables_length .is-error.ui_tpicker_minute_slider select,.is-error.ui_tpicker_minute_slider .ui_tpicker_hour_slider>select,.is-error.ui_tpicker_minute_slider .ui_tpicker_minute_slider>select,.is-error.ui_tpicker_minute_slider .ui_tpicker_second_slider>select,.is-error.ui_tpicker_minute_slider select.ibo-input-select-placeholder,.is-error.ui_tpicker_minute_slider .ibo-datatableconfig--attributes-panel--per-page--input,.is-error.ui_tpicker_minute_slider .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .is-error.ui_tpicker_minute_slider input[type="text"],.is-error.ui_tpicker_minute_slider .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .is-error.ui_tpicker_minute_slider input[type="text"],.is-error.ui_tpicker_second_slider .ibo-input,.is-error.ui_tpicker_second_slider .ui-autocomplete-input,.is-error.ui_tpicker_second_slider .ui-multiselect,.is-error.ui_tpicker_second_slider .dataTables_length select,.dataTables_length .is-error.ui_tpicker_second_slider select,.is-error.ui_tpicker_second_slider .ui_tpicker_hour_slider>select,.is-error.ui_tpicker_second_slider .ui_tpicker_minute_slider>select,.is-error.ui_tpicker_second_slider .ui_tpicker_second_slider>select,.is-error.ui_tpicker_second_slider select.ibo-input-select-placeholder,.is-error.ui_tpicker_second_slider .ibo-datatableconfig--attributes-panel--per-page--input,.is-error.ui_tpicker_second_slider .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .is-error.ui_tpicker_second_slider input[type="text"],.is-error.ui_tpicker_second_slider .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .is-error.ui_tpicker_second_slider input[type="text"],.ibo-input-wrapper.is-error .ui-autocomplete-input,.ibo-input-wrapper.is-error .ui-multiselect,.ibo-input-wrapper.is-error .dataTables_length select,.dataTables_length .ibo-input-wrapper.is-error select,.ibo-input-wrapper.is-error .ui_tpicker_hour_slider>select,.ibo-input-wrapper.is-error .ui_tpicker_minute_slider>select,.ibo-input-wrapper.is-error .ui_tpicker_second_slider>select,.ibo-input-wrapper.is-error select.ibo-input-select-placeholder,.ibo-input-wrapper.is-error .ibo-datatableconfig--attributes-panel--per-page--input,.ibo-input-wrapper.is-error .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .ibo-input-wrapper.is-error input[type="text"],.ibo-input-wrapper.is-error .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .ibo-input-wrapper.is-error input[type="text"],.ibo-input-wrapper.is-error .ibo-input-vanilla,.is-error.ui_tpicker_hour_slider .ibo-input-vanilla,.is-error.ui_tpicker_minute_slider .ibo-input-vanilla,.is-error.ui_tpicker_second_slider .ibo-input-vanilla,.ibo-input-wrapper.is-error .ck-editor,.is-error.ui_tpicker_hour_slider .ck-editor,.is-error.ui_tpicker_minute_slider .ck-editor,.is-error.ui_tpicker_second_slider .ck-editor,.ibo-input-wrapper.is-error textarea,.is-error.ui_tpicker_hour_slider textarea,.is-error.ui_tpicker_minute_slider textarea,.is-error.ui_tpicker_second_slider textarea,.ibo-input-field-wrapper.is-error .ibo-input,.ibo-input-field-wrapper.is-error .ui-autocomplete-input,.ibo-input-field-wrapper.is-error .ui-multiselect,.ibo-input-field-wrapper.is-error .dataTables_length select,.dataTables_length .ibo-input-field-wrapper.is-error select,.ibo-input-field-wrapper.is-error .ui_tpicker_hour_slider>select,.ibo-input-field-wrapper.is-error .ui_tpicker_minute_slider>select,.ibo-input-field-wrapper.is-error .ui_tpicker_second_slider>select,.ibo-input-field-wrapper.is-error select.ibo-input-select-placeholder,.ibo-input-field-wrapper.is-error .ibo-datatableconfig--attributes-panel--per-page--input,.ibo-input-field-wrapper.is-error .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .ibo-input-field-wrapper.is-error input[type="text"],.ibo-input-field-wrapper.is-error .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .ibo-input-field-wrapper.is-error input[type="text"],.ibo-input-field-wrapper.is-error .ibo-input-vanilla,.ibo-input-field-wrapper.is-error .ck-editor,.ibo-input-field-wrapper.is-error textarea{border-color:#e53e3e}.ibo-input-wrapper.is-error .ibo-input-vanilla input,.is-error.ui_tpicker_hour_slider .ibo-input-vanilla input,.is-error.ui_tpicker_minute_slider .ibo-input-vanilla input,.is-error.ui_tpicker_second_slider .ibo-input-vanilla input,.ibo-input-field-wrapper.is-error .ibo-input-vanilla input{border:0;background-color:rgba(255, 255, 255, 0)}input.ibo-input-vanilla{width:unset;display:initial}.ibo-input-wrapper--with-buttons,.ibo-input-select-wrapper--with-buttons{position:relative;display:flex}.ibo-field-validation{color:#c53030}.file-input{display:block;position:relative}.ibo-input--label-right{margin-right:4px;display:inline}.ibo-input--label-left{margin-left:4px;display:inline}.disabled{background-color:#d5dde5}.ibo-input-checkbox{height:16px;width:auto}.ibo-input-date-wrapper{position:relative}.ibo-input-date{display:inline-block;width:100%}.ibo-input-date+button{position:absolute;display:inline-block;margin-left:-20px;margin-top:5px;padding:0;background-color:transparent;color:#404b5a;border:none}.ibo-input-datetime-wrapper{position:relative}.ibo-input-datetime{display:inline-block;width:100%}.ibo-input-datetime--action-button{position:absolute;display:inline-block;margin-left:-20px;margin-top:5px;padding:0;color:#404b5a}.ui_tpicker_hour_slider>select,.ui_tpicker_minute_slider>select,.ui_tpicker_second_slider>select{width:auto;padding-right:18px}.ibo-input-duration{display:inline-block;width:unset;text-align:right}.ibo-input-image{display:flex;justify-content:flex-start;align-items:flex-start}.ibo-input-image--image-view{position:relative;overflow:hidden;min-height:96px;background-color:#e1e7ec;border-radius:5px}.ibo-input-image--image-view img[src=""],.ibo-input-image--image-view img[src="null"]{visibility:hidden}.ibo-input-image--image-view input[type="file"]{position:absolute;top:0;bottom:0;left:0;right:0;width:100%;opacity:0}.ibo-input-image--edit-buttons{display:flex;flex-direction:column;margin-left:0.5rem}.ibo-input-image--edit-buttons .ibo-button+.ibo-button,.ibo-input-image--edit-buttons .ui-dialog .ui-button+.ibo-button,.ibo-input-image--edit-buttons .ui-dialog .ui-dialog .ui-button+.ui-button,.ui-dialog .ibo-input-image--edit-buttons .ui-dialog .ui-button+.ui-button,.ibo-input-image--edit-buttons .ui-dialog .ui-button+.ui-datepicker-current,.ibo-input-image--edit-buttons .ui-dialog .ui-button+.ui-datepicker-close,.ui-dialog .ibo-input-image--edit-buttons .ui-button+.ibo-button,.ibo-input-image--edit-buttons .ui-datepicker-current+.ibo-button,.ibo-input-image--edit-buttons .ui-dialog .ui-datepicker-current+.ui-button,.ui-dialog .ibo-input-image--edit-buttons .ui-datepicker-current+.ui-button,.ibo-input-image--edit-buttons .ui-datepicker-current+.ui-datepicker-current,.ibo-input-image--edit-buttons .ui-datepicker-current+.ui-datepicker-close,.ibo-input-image--edit-buttons .ui-datepicker-close+.ibo-button,.ibo-input-image--edit-buttons .ui-dialog .ui-datepicker-close+.ui-button,.ui-dialog .ibo-input-image--edit-buttons .ui-datepicker-close+.ui-button,.ibo-input-image--edit-buttons .ui-datepicker-close+.ui-datepicker-current,.ibo-input-image--edit-buttons .ui-datepicker-close+.ui-datepicker-close,.ibo-input-image--edit-buttons .ui-dialog .ibo-button+.ui-button,.ui-dialog .ibo-input-image--edit-buttons .ibo-button+.ui-button,.ibo-input-image--edit-buttons .ibo-button+.ui-datepicker-current,.ibo-input-image--edit-buttons .ibo-button+.ui-datepicker-close{margin-top:0.5rem;margin-left:0}.ibo-input-richtext-placeholder{height:192px;width:100%;visibility:hidden}.ibo-input-select,.ui-multiselect,.ui_tpicker_hour_slider>select,.ui_tpicker_minute_slider>select,.ui_tpicker_second_slider>select,select.ibo-input-select-placeholder{display:inline-flex;min-width:50px;appearance:none}.ibo-input-select.ibo-input-selectize,.ibo-input-selectize.ui-multiselect,.ui_tpicker_hour_slider>select.ibo-input-selectize,.ui_tpicker_minute_slider>select.ibo-input-selectize,.ui_tpicker_second_slider>select.ibo-input-selectize,select.ibo-input-selectize.ibo-input-select-placeholder{padding-right:0;padding-left:0;min-width:150px !important}.ibo-input-select.ibo-input-selectize input,.ibo-input-selectize.ui-multiselect input,.ui_tpicker_hour_slider>select.ibo-input-selectize input,.ui_tpicker_minute_slider>select.ibo-input-selectize input,.ui_tpicker_second_slider>select.ibo-input-selectize input,select.ibo-input-selectize.ibo-input-select-placeholder input{border-width:0;color:inherit;border-color:white;padding-left:10px}.ibo-input-select.ibo-input-selectize>[data-value],.ibo-input-selectize.ui-multiselect>[data-value],.ui_tpicker_hour_slider>select.ibo-input-selectize>[data-value],.ui_tpicker_minute_slider>select.ibo-input-selectize>[data-value],.ui_tpicker_second_slider>select.ibo-input-selectize>[data-value],select.ibo-input-selectize.ibo-input-select-placeholder>[data-value]{height:100%;line-height:30px;padding-left:10px}.ibo-input-select[size],.ui-multiselect[size],.ui_tpicker_hour_slider>select[size],.ui_tpicker_minute_slider>select[size],.ui_tpicker_second_slider>select[size],select.ibo-input-select-placeholder[size]{height:auto}.ibo-input-select[multiple],.ui-multiselect[multiple],.ui_tpicker_hour_slider>select[multiple],.ui_tpicker_minute_slider>select[multiple],.ui_tpicker_second_slider>select[multiple],select.ibo-input-select-placeholder[multiple]{padding-left:unset;padding-right:unset}.ibo-input-select[multiple] option,.ui-multiselect[multiple] option,.ui_tpicker_hour_slider>select[multiple] option,.ui_tpicker_minute_slider>select[multiple] option,.ui_tpicker_second_slider>select[multiple] option,select.ibo-input-select-placeholder[multiple] option{padding:4px 10px}.ibo-input-select-autocomplete{min-width:150px !important;text-overflow:ellipsis}.ibo-input-selectize{min-width:150px !important}.ibo-input-selectize>div{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ibo-input-selectize>input{background-color:unset;border:unset}.ibo-input-selectize>input:focus{outline:none !important}.ibo-input-selectize.input-active{border:1px solid #dd6c20}.ibo-input-select-wrapper,.ui_tpicker_hour_slider,.ui_tpicker_minute_slider,.ui_tpicker_second_slider{position:relative}.ibo-input-select-wrapper--with-buttons .selectize-control{display:grid;width:100%}.ibo-input-select-wrapper::after,.ui_tpicker_hour_slider::after,.ui_tpicker_minute_slider::after,.ui_tpicker_second_slider::after{position:absolute;z-index:1;content:"";font-family:"Font Awesome 5 Free";font-weight:600;height:28px;margin-left:-16px;margin-top:1px;padding-top:3px;background-color:inherit;color:#212934;pointer-events:none}.ibo-input-select-container{display:flex}.ibo-input-select-wrapper--with-buttons:not(.ibo-input-select-autocomplete-wrapper)::after{position:absolute;z-index:1;content:"";font-family:"Font Awesome 5 Free";font-weight:600;cursor:pointer;right:8px;height:28px;margin-left:-16px;margin-top:1px;padding-top:3px;background-color:inherit;color:#212934;pointer-events:none}.ibo-input-select--action-buttons{position:absolute;z-index:1;display:flex;height:28px;margin-top:0;margin-right:3px;font-size:1rem;background-color:inherit;color:#404b5a;padding:0 2px;text-align:right;bottom:0;top:0;right:0}.ibo-input-select-wrapper .ibo-input-select--action-buttons,.ui_tpicker_hour_slider .ibo-input-select--action-buttons,.ui_tpicker_minute_slider .ibo-input-select--action-buttons,.ui_tpicker_second_slider .ibo-input-select--action-buttons{margin-right:20px}.ibo-input-select--action-button{display:flex;align-items:center;padding-left:6px;padding-right:2px;float:right}.selectize-dropdown.ui-autocomplete,.selectize-dropdown.set-dropdown,.selectize-dropdown.plugin-custom_itop{z-index:2000;max-height:50vh;max-width:50em;overflow-y:auto}.selectize-dropdown-content{max-height:calc(50vh - 4px)}.selectize-dropdown.ui-menu .ui-state-active{margin:unset;background-color:#ebf8ff;color:#404b5a}.ibo-input-select--autocomplete-item,.ibo-input-select--notification-item{display:flex;justify-content:left;align-items:center}.ibo-input-select--autocomplete-item-image{width:30px;height:30px;min-width:30px;min-height:30px;background-position:center center;background-size:100%;border-radius:100%;margin-right:0.7rem;background-color:#ebf8ff;border:1px solid #929fb1}.ibo-input-select--autocomplete-item-image.ibo-is-not-medallion{border:unset;border-radius:0;background-color:unset}.ibo-input-select-icon{display:inline-flex;text-align:left}.ibo-input-select-icon>img{max-height:100%;max-width:100%;padding-right:4px}.ibo-input-select-icon>span{overflow:hidden}.ibo-input-select-icon--menu{position:absolute;z-index:21;max-height:300px;overflow-x:hidden;overflow-y:auto;flex-wrap:nowrap}.ibo-input-select-icon--menu--item>*{width:100%;white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis}.ibo-input-select-icon--menu--item>*>.ibo-input-select-icon--menu--icon{max-width:100%;max-height:100%;margin-right:10px}.ibo-input-one-way-password-wrapper>*:not(first-child){margin-top:6px}.ibo-input-set{flex-wrap:wrap;height:auto;min-height:30px}.ibo-input-set>input{height:auto}.ibo-input-set .item[data-value]>.remove{font-size:18px;padding-top:0.15em;border-left:none}.attribute-set .attribute-set-item,.selectize-control.multi .selectize-input.ibo-input-set .attribute-set-item,.selectize-control.multi .ibo-quick-create--input.selectize-control.single .ibo-input-set.selectize-input.input-active .attribute-set-item,.ibo-quick-create--input.selectize-control.single .selectize-control.multi .ibo-input-set.selectize-input.input-active .attribute-set-item{display:inline-flex;margin-top:1px;margin-right:0;margin-bottom:1px;padding:4px 6px;max-width:360px;background:white none;border:none;border-radius:3px;box-shadow:0 1px 1px rgba(0, 0, 0, 0.15), 0 0 1px 1px rgba(241, 241, 241, 0.7);color:#212934;text-shadow:none}.attribute-set .attribute-set-item:not(:first-child),.selectize-control.multi .selectize-input.ibo-input-set .attribute-set-item:not(:first-child),.selectize-control.multi .ibo-quick-create--input.selectize-control.single .ibo-input-set.selectize-input.input-active .attribute-set-item:not(:first-child),.ibo-quick-create--input.selectize-control.single .selectize-control.multi .ibo-input-set.selectize-input.input-active .attribute-set-item:not(:first-child){margin-left:3px}.attribute-set.history-added .attribute-set-item{font-weight:bold}.attribute-set.history-removed .attribute-set-item{text-decoration:line-through;font-style:italic}.selectize-control.multi .selectize-input.ibo-input-set,.selectize-control.multi .ibo-quick-create--input.selectize-control.single .ibo-input-set.selectize-input.input-active,.ibo-quick-create--input.selectize-control.single .selectize-control.multi .ibo-input-set.selectize-input.input-active{padding:0 8px}.ibo-input-text,textarea{width:100%;min-height:12rem;padding:10px 12px}.ibo-input-text.ibo-is-code,textarea.ibo-is-code{background-color:white}.ibo-input-text--export{width:100%;min-height:15em}.ibo-toggler--wrapper{position:relative;display:inline-block;width:36px;height:20px;vertical-align:baseline}.ibo-toggler--wrapper .ibo-toggler{display:none}.ibo-toggler--slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;border-radius:16px;background-color:#929fb1;transition:0.4s}.ibo-toggler--slider:before{content:"";position:absolute;left:3px;bottom:3px;height:15px;width:15px;border-radius:100%;background-color:#f8f9fa;transition:0.4s}.ibo-toggler--wrapper input:checked+.ibo-toggler--slider{background-color:#dd6c20}input:focus+.ibo-toggler--slider{box-shadow:0 0 1px #dd6c20}input:checked+.ibo-toggler--slider:before{transform:translateX(14.5px)}label~.ibo-toggler--wrapper{margin-left:4px}.ibo-pill.ibo-is-new{color:#2a4265;background-color:#ebf8ff}.ibo-pill.ibo-is-neutral,.ui-dialog .ibo-pill.ui-button.ui-dialog-titlebar-close{color:#2a4265;background-color:#ebf8ff}.ibo-pill.ibo-is-waiting{color:#9c4221;background-color:floralwhite}.ibo-pill.ibo-is-success{color:#33691e;background-color:#dcedc8}.ibo-pill.ibo-is-failure{color:#9b2c2c;background-color:#fce8e8}.ibo-pill.ibo-is-frozen{color:#6e7a8a;background-color:#f8f9fa}.ibo-pill.ibo-is-active{color:#33691e;background-color:#dcedc8}.ibo-pill.ibo-is-inactive{color:#9c4221;background-color:floralwhite}.ibo-pill{--ibo-main-color--100: #ebf8ff;--ibo-main-color--900: #2a4265;max-width:240px;margin-top:4px;margin-bottom:4px;padding:6px 10px;border-radius:3px;color:var(--ibo-main-color--900);background-color:var(--ibo-main-color--100)}.ibo-pill:hover,.ibo-pill:active{color:inherit}.ibo-prop--apply{width:calc(32px + 12px);padding-left:12px}.ibo-prop--apply.ui-state-error:after{color:#404b5a;content:"";vertical-align:bottom}.ibo-prop--apply.ui-state-error>span{display:none !important}.ibo-prop--cancel{width:calc(32px + 8px);padding-left:8px}.ibo-prop--apply,.ibo-prop--cancel{height:28px}.ibo-prop--apply>span,.ibo-prop--cancel>span{display:block;height:28px;width:32px;text-align:center}.ibo-prop--apply>span>div,.ibo-prop--cancel>span>div{display:inline-flex;justify-content:center;align-items:center;width:100%;height:100%}.ibo-spinner.ibo-is-inline{display:inline-block}.ibo-spinner.ibo-is-inline>*{display:inline-block}.ibo-spinner.ibo-is-small,.ibo-spinner.ibo-is-medium,.ibo-spinner.ibo-is-large{display:flex;flex-direction:column}.ibo-spinner.ibo-is-small>.ibo-spinner--icon,.ibo-spinner.ibo-is-medium>.ibo-spinner--icon,.ibo-spinner.ibo-is-large>.ibo-spinner--icon{align-self:center;color:#929fb1}.ibo-spinner.ibo-is-small>.ibo-spinner--description,.ibo-spinner.ibo-is-medium>.ibo-spinner--description,.ibo-spinner.ibo-is-large>.ibo-spinner--description{align-self:center;color:#404b5a}.ibo-spinner.ibo-is-small>.ibo-spinner--description{margin-top:4px}.ibo-spinner.ibo-is-medium>.ibo-spinner--description{margin-top:8px}.ibo-spinner.ibo-is-large>.ibo-spinner--description{margin-top:16px}.ibo-title{color:#212934;padding:12px 0}.ibo-title--icon{width:90px;height:90px;min-width:90px;min-height:90px;overflow:hidden}.ibo-title--icon>.ibo-title--icon-level-2{width:80px;height:80px;min-width:80px;min-height:80px}.ibo-title--icon>.ibo-title--icon-level-3{width:70px;height:70px;min-width:70px;min-height:70px}.ibo-title--icon-img,.ibo-title--icon-background{width:100%;height:100%;object-position:center;object-fit:contain;background-size:contain}.ibo-title--icon-img--must-contain,.ibo-title--icon-background--must-contain{object-fit:contain;background-size:contain}.ibo-title--icon-img--must-cover,.ibo-title--icon-background--must-cover{object-fit:cover;background-size:cover}.ibo-title--icon-img--must-zoomout,.ibo-title--icon-background--must-zoomout{width:66.67%;height:66.67%}.ibo-title--subtitle{margin-top:2px;margin-bottom:2px;flex-wrap:wrap}.ibo-title-for-dashlet{padding-top:2em}.ibo-title-for-dashlet--content{background-color:white;border-radius:5px;border:1px solid;border-color:#ccd4db;padding-bottom:1em}.ibo-title-separator{border-radius:5px 5px 0 0;border-color:#3182ce;color:#3182ce;background-color:#3182ce;border:3px solid;margin:0;padding:0}:root{--ibo-datatable-panel--table-spacing: 48px}.ibo-datatable--toolbar{display:flex;justify-content:space-between;align-items:center;padding:0 6px;color:#404b5a}.ibo-datatable--toolbar:first-child{margin-bottom:18px}.ibo-datatable--toolbar:not(:first-child){margin-top:18px}.ibo-datatable--toolbar-left>*:not(:first-child),.ibo-datatable--toolbar-right>*:not(:first-child){margin-left:1rem}.ibo-datatable-header{color:#212934}.ibo-datatable-panel>.ibo-panel--body{padding:32px 0 24px}.ibo-datatable--selection-validation-buttons-toolbar{clear:both;margin-top:10px}.ibo-list-column{max-height:150px;overflow-y:auto}.ibo-sort-order::after{color:#dd6c20}.ibo-sort-order.ibo-is-descending::after{content:""}.ibo-sort-order.ibo-is-ascending::after{content:""}.ibo-sort-order.ibo-is-none::after{content:""}.itop-fieldsorter>.selected{background-color:#bee3f8}.ibo-datatable tbody>tr{transition:background-color 300ms linear}.ibo-datatable tbody>tr:hover,.ibo-datatable tbody>tr.selected:hover{cursor:pointer;background-color:#feebc8}.ibo-datatable tbody>tr.selected{background-color:#fbd38d}.ibo-datatable tbody>tr .ibo-datatable--row-actions-toolbar{justify-content:end}.ibo-datatable tbody>tr>[data-attribute-type="AttributeHTML"],.ibo-datatable tbody>tr>[data-attribute-type="AttributeText"],.ibo-datatable tbody>tr>[data-attribute-type="AttributeLongText"]{max-width:100%;overflow:auto}.ibo-datatable--selected-count,.ibo-datatable--result-count{padding-right:0.2em;padding-left:0.1em}.ibo-datatable[data-status="loading"]{margin-top:18px}.ibo-datatable[data-status="loading"] td,.ibo-datatable[data-status="loading"] th{position:relative;padding:10px 12px}.ibo-datatable[data-status="loading"] tr:nth-child(even){background-color:#f2f2f2}.ibo-datatable[data-status="loading"] th{border-bottom:1px solid #ccd4db}.ibo-datatableconfig--attributes-panel .ibo-multi-column .ibo-column:first-child{margin:8px 0;max-height:150px;overflow-y:scroll}.ibo-datatableconfig--attributes-panel--per-page--input{margin:0 4px;max-width:4em;display:initial}.ibo-datatableconfig--settings-panel .ibo-panel--body{display:flex;flex-direction:row}.ibo-datatableconfig--settings-panel--options-container{flex-grow:1}.ibo-datatableconfig--settings-panel--option{display:flex;flex-direction:row;align-items:first baseline;margin-right:4px}.ibo-prop-header{padding-bottom:14px}.help-text{padding:1px 5px;background-color:#d7e3f8;border:1px solid #c6e7f5;border-radius:5px;margin:5px 0;font-size:0.9em}.form-error ul{padding:1px 5px;background-color:#f8d7da;border:1px solid #f5c6cb;border-radius:5px;margin:5px 0;font-size:0.9em}.subform{background-color:#efefef;border-radius:5px;padding:10px}.form-buttons{margin:20px 0}.form select{padding:0;overflow-y:auto}.form select option{height:30px;display:flex;align-items:center}.turbo-refreshing{opacity:0.5}.ibo-field legend{margin-top:24px}collection-entry-element{margin-top:8px;display:block;padding:10px 10px;background-color:#f5f5f5;border-radius:5px}.ts-control{height:auto;min-height:30px}.ibo-form-actions>.ibo-button>span,.ui-dialog .ibo-form-actions>.ui-button>span,.ibo-form-actions>.ui-datepicker-current>span,.ibo-form-actions>.ui-datepicker-close>span{margin-right:5px}.ibo-form textarea{resize:vertical}.ibo-fieldset~.ibo-fieldset:not(.ibo-column),fieldset~.ibo-fieldset:not(.ibo-column),.ibo-fieldset~fieldset:not(.ibo-column){margin-top:48px}.ibo-multi-column~.ibo-fieldset,.ibo-multi-column~fieldset{margin-top:48px}.ibo-fieldset-legend,.ibo-dashboard-editor--properties-subtitle,.ibo-dashboard--available-dashlet--title,.ibo-dashlet--properties--title,legend{width:100%;margin-bottom:16px;padding-bottom:4px;border-bottom:2px solid #aebecd}.ibo-field{}.ibo-field:not([data-attribute-type="AttributeBlob"], [data-attribute-type="AttributeFile"], [data-attribute-type="AttributeImage"], [data-attribute-type="AttributeCustomFields"], [data-attribute-type="AttributeTagSet"], [data-attribute-type="AttributeEnumSet"], [data-attribute-type="AttributeLinkedSet"], [data-attribute-type="AttributeLinkedSetIndirect"], [data-attribute-type="AttributeClassAttCodeSet"], [data-attribute-type="AttributeQueryAttCodeSet"], .ibo-input-file-select--container){}.ibo-field:not([data-attribute-type="AttributeBlob"], [data-attribute-type="AttributeFile"], [data-attribute-type="AttributeImage"], [data-attribute-type="AttributeCustomFields"], [data-attribute-type="AttributeTagSet"], [data-attribute-type="AttributeEnumSet"], [data-attribute-type="AttributeLinkedSet"], [data-attribute-type="AttributeLinkedSetIndirect"], [data-attribute-type="AttributeClassAttCodeSet"], [data-attribute-type="AttributeQueryAttCodeSet"], .ibo-input-file-select--container) .ibo-field--value{word-break:break-word;white-space:inherit}.ibo-field:not([data-attribute-type="AttributeBlob"], [data-attribute-type="AttributeFile"], [data-attribute-type="AttributeImage"], [data-attribute-type="AttributeCustomFields"], [data-attribute-type="AttributeTagSet"], [data-attribute-type="AttributeEnumSet"], [data-attribute-type="AttributeLinkedSet"], [data-attribute-type="AttributeLinkedSetIndirect"], [data-attribute-type="AttributeClassAttCodeSet"], [data-attribute-type="AttributeQueryAttCodeSet"], .ibo-input-file-select--container) .ibo-field--value *:not(input, select, textarea){word-break:break-word;white-space:inherit}.ibo-field:not([data-attribute-type="AttributeBlob"], [data-attribute-type="AttributeFile"], [data-attribute-type="AttributeImage"], [data-attribute-type="AttributeCustomFields"], [data-attribute-type="AttributeTagSet"], [data-attribute-type="AttributeEnumSet"], [data-attribute-type="AttributeLinkedSet"], [data-attribute-type="AttributeLinkedSetIndirect"], [data-attribute-type="AttributeClassAttCodeSet"], [data-attribute-type="AttributeQueryAttCodeSet"], .ibo-input-file-select--container) .ibo-field--value pre{white-space:break-spaces}.ibo-field[data-attribute-type="AttributeImage"]>.ibo-field--value{display:grid}.ibo-field[data-attribute-type="AttributeImage"]>.ibo-field--value>span{display:inherit}.ibo-field[data-attribute-type="AttributeHTML"][data-attribute-flag-read-only="true"],.ibo-field[data-attribute-type="AttributeText"][data-attribute-flag-read-only="true"],.ibo-field[data-attribute-type="AttributeLongText"][data-attribute-flag-read-only="true"]{display:grid}.ibo-field[data-attribute-type="AttributeHTML"][data-attribute-flag-read-only="true"]>.ibo-field--value,.ibo-field[data-attribute-type="AttributeText"][data-attribute-flag-read-only="true"]>.ibo-field--value,.ibo-field[data-attribute-type="AttributeLongText"][data-attribute-flag-read-only="true"]>.ibo-field--value{max-width:100%;overflow:auto}.ibo-field-large{display:block}.ibo-field-large .ibo-field--label{position:relative;display:flex;align-items:center;max-width:initial;width:100%}.ibo-field-large .ibo-field-small .ibo-field--label{display:table-cell;vertical-align:top;padding-right:10px;min-width:100px;max-width:145px;width:30%}.ibo-field-large .ibo-field--value{margin-top:2px}.ibo-field-large .ibo-field--value>*{--ibo-scrollbar--scrollbar-track-background-color: #f2f2f2}.ibo-field-large.ibo-is-fullscreen{background-color:white}.ibo-field-large.ibo-is-fullscreen .ibo-field--label{position:fixed;width:100%;min-width:initial;max-width:initial;padding:4px 8px;background-color:#f8f9fa;border-bottom:1px solid #ccd4db}.ibo-field-large.ibo-is-fullscreen .ibo-field--value{padding:36px 8px 4px 8px}.ibo-field-large.ibo-is-fullscreen .ibo-field--value>*{height:initial !important;width:initial !important}.ibo-field-small{display:table;width:100%}.ibo-field-small .ibo-field--label{display:table-cell;vertical-align:top;padding-right:10px}.ibo-field--fullscreen-toggler{width:20px;height:20px;border-radius:5px;cursor:pointer}.ibo-field--fullscreen-toggler:hover{background-color:#f2f2f2}.ibo-field--label{min-width:100px;max-width:145px;width:30%;word-break:break-word}.ibo-field--label-small .ibo-field--label{width:20em}.ibo-field--value{width:100%;color:#404b5a}.ibo-field--value .HTML table{table-layout:fixed;width:100%}.ibo-field--label>.ibo-field--comments{flex:auto}.ibo-fieldset-legend>.ibo-field--comments,.ibo-dashboard-editor--properties-subtitle>.ibo-field--comments,.ibo-dashboard--available-dashlet--title>.ibo-field--comments,.ibo-dashlet--properties--title>.ibo-field--comments,legend>.ibo-field--comments{padding-bottom:2px;font-size:1.17rem}.ibo-field--comments{display:table-cell;vertical-align:top;width:5em}.ibo-field--comments>input[type="checkbox"]{margin-left:5px;float:right}.ibo-field--comments>.multi_values,.ibo-field--comments>.mono_value,.ibo-field--comments>.ibo-field--comments--synchro{float:right}.mailto,.tel{white-space:nowrap}.mailto .text_decoration,.tel .text_decoration{margin-right:0.5rem;font-size:0.9em}.object-ref-icon.text_decoration,.object-ref-icon-disabled.text_decoration{margin-right:0.5rem}.ibo-field--enable-bulk,.ibo-field--comments--synchro{display:inline;padding:2px 5px;margin:0 0 0 5px;height:calc(100% - 5px);border-radius:5px;font-weight:bold;white-space:nowrap}.ibo-field--enable-bulk--checkbox{margin-left:8px}.ibo-toolbar{display:flex;align-items:center}.ibo-toolbar.ibo-toolbar--action{position:relative}.ibo-toolbar.ibo-toolbar--button{margin-top:16px}.ibo-toolbar-spacer{flex-grow:1}.ibo-toolbar-vertical-separator{display:inline-flex;border-right:1px solid #aebecd;width:1px;height:16px;margin:0 0.75rem}.search_box{box-sizing:border-box;position:relative;z-index:1100;text-align:center}.search_box *{box-sizing:border-box}.search_form_handler{}.search_form_handler input[type="text"],.search_form_handler select{padding:1px 2px}.search_form_handler:not(.closed) .sf_title .sft_short{display:none}.search_form_handler:not(.closed) .sf_title .sft_toggler{transform:rotateX(180deg);transition:transform 0.5s linear}.search_form_handler.closed{margin-bottom:0.5em;width:150px;overflow:hidden;border-radius:4px}.search_form_handler.closed .sf_criterion_area{height:0;opacity:0;padding:0}.search_form_handler.closed .sf_title{padding:6px 8px;text-align:center;font-size:12px}.search_form_handler.closed .sf_title .sft_long{display:none}.search_form_handler.closed .sf_title .sft_hint,.search_form_handler.closed .sf_title .sfobs_hint{display:none}.search_form_handler:not(.no_auto_submit) .sft_hint{display:none}.search_form_handler:not(.no_auto_submit) .sfc_fg_apply{display:none}.search_form_handler.no_auto_submit .sfc_fg_search{display:none}.search_form_handler.no_auto_submit .sft_hint{display:inline-block}.search_form_handler:not(.hide_obsolete_data) .sfobs_hint{display:none}.search_form_handler.hide_obsolete_data .sfobs_hint{display:inline-block}.search_form_handler.hide_obsolete_data.no_auto_submit .sfobs_hint{margin-left:30px}.search_form_handler .sf_message{display:none;margin:8px 8px 0 8px;border-radius:0px}.search_form_handler .sf_criterion_area{padding:8px 8px 3px 8px}.search_form_handler .sf_criterion_area .sf_criterion_row:not(:first-child){margin-top:20px}.search_form_handler .sf_criterion_area .sf_criterion_row:not(:first-child)::before{content:"";position:absolute;top:-12px;left:0px;width:100%;border-top:1px solid #e1e7ec}.search_form_handler .sf_criterion_area .sf_criterion_row:not(:first-child)::after{content:"or";position:absolute;top:-20px;left:8px;padding-left:5px;padding-right:5px;color:#929fb1;background-color:white}.search_form_handler .sf_criterion_area .sf_criterion_row .sf_criterion_group{display:inline}.search_form_handler .sf_criterion_area .sf_criterion_row .sf_criterion_group .sfc_fg_button,.search_form_handler .sf_criterion_area .sf_criterion_row .sf_criterion_group .sfc_header{border:1px solid #d5dde5;border-radius:3px}.search_form_handler .sf_criterion_area .search_form_criteria,.search_form_handler .sf_criterion_area .sf_more_criterion,.search_form_handler .sf_criterion_area .sf_button{position:relative;display:inline-block;margin-right:10px;margin-top:3px;margin-bottom:3px;vertical-align:top}.search_form_handler .sf_criterion_area .search_form_criteria.opened,.search_form_handler .sf_criterion_area .sf_more_criterion.opened,.search_form_handler .sf_criterion_area .sf_button.opened{margin-bottom:0}.search_form_handler .sf_criterion_area .search_form_criteria.opened .sfc_header,.search_form_handler .sf_criterion_area .search_form_criteria.opened .sfm_header,.search_form_handler .sf_criterion_area .sf_more_criterion.opened .sfc_header,.search_form_handler .sf_criterion_area .sf_more_criterion.opened .sfm_header,.search_form_handler .sf_criterion_area .sf_button.opened .sfc_header,.search_form_handler .sf_criterion_area .sf_button.opened .sfm_header{border-bottom:none !important;padding-bottom:13px}.search_form_handler .sf_criterion_area .search_form_criteria>*,.search_form_handler .sf_criterion_area .sf_more_criterion>*,.search_form_handler .sf_criterion_area .sf_button>*{padding:7px 8px;vertical-align:top;border:solid 1px #d5dde5;border-radius:3px}.search_form_handler .sf_criterion_area .search_form_criteria .sfm_content,.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_content,.search_form_handler .sf_criterion_area .sf_button .sfm_content{position:absolute;z-index:-1;min-width:100%;left:0px;margin-top:-1px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_fg_buttons,.search_form_handler .sf_criterion_area .search_form_criteria .sfm_buttons,.search_form_handler .sf_criterion_area .sf_more_criterion .sfc_fg_buttons,.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_buttons,.search_form_handler .sf_criterion_area .sf_button .sfc_fg_buttons,.search_form_handler .sf_criterion_area .sf_button .sfm_buttons{white-space:nowrap}.search_form_handler .sf_criterion_area .sf_more_criterion,.search_form_handler .sf_criterion_area .sf_button{min-width:34px;text-align:center}.search_form_handler .sf_criterion_area .search_form_criteria{}.search_form_handler .sf_criterion_area .search_form_criteria.locked{background-color:#d5dde5}.search_form_handler .sf_criterion_area .search_form_criteria.locked .sfc_title{user-select:none;cursor:initial}.search_form_handler .sf_criterion_area .search_form_criteria.draft .sfc_header,.search_form_handler .sf_criterion_area .search_form_criteria.draft .sfc_form_group{border-style:dashed;border-color:#929fb1}.search_form_handler .sf_criterion_area .search_form_criteria.draft .sfc_title{font-style:italic}.search_form_handler .sf_criterion_area .search_form_criteria.opened{z-index:1}.search_form_handler .sf_criterion_area .search_form_criteria.opened .sfc_toggle{transform:rotateX(-180deg)}.search_form_handler .sf_criterion_area .search_form_criteria.opened .sfc_form_group{display:flex;flex-direction:column;margin-top:-1px;z-index:-1}.search_form_handler .sf_criterion_area .search_form_criteria.opened_left .sfc_form_group{left:auto;right:0px}.search_form_handler .sf_criterion_area .search_form_criteria:not(:last-of-type){margin-right:12px}.search_form_handler .sf_criterion_area .search_form_criteria>*{background-color:#f2f2f2;color:#212934}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_toggle,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_close{position:absolute;top:7px;color:#dd6c20}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_locked{position:absolute;top:9px;color:#aebecd}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_toggle{display:inline-block;right:23px;transition:all 0.3s ease-in-out}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_close,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_locked{right:7px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_title{max-width:240px;padding-right:30px;white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis;cursor:pointer}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_title .sfc_values{font-weight:bold}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group{position:absolute;display:none;max-width:450px;width:max-content;max-height:calc(min(512px, 50vh));overflow-x:auto;overflow-y:hidden}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators{display:flex;flex-direction:column;overflow:auto;min-height:0;font-size:12px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator.force_hide{display:none !important}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator>label{line-height:20px;white-space:nowrap}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator>label>*{display:inline-block;vertical-align:middle}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_radio{width:12px;margin:0;margin-right:7px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_name{width:96px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"]{display:unset;width:160px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices{display:flex;flex-direction:column;height:100%}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices label>input{vertical-align:text-top;margin-left:0;margin-right:8px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper{overflow-y:auto;margin:0 -8px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items .sfc_opc_mc_items_list{text-align:left}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items .sfc_opc_mc_items_list.sfc_opc_mc_items_selected{position:relative;padding-top:5px;margin-top:5px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items .sfc_opc_mc_items_list.sfc_opc_mc_items_selected::before{content:"";position:absolute;border-top:1px solid #d5dde5;width:calc(100% - 12px);margin-left:6px;top:0px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items .sfc_opc_mc_items_list .sfc_opc_mc_placeholder{padding:15px 8px;font-style:italic;text-align:center}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items .sfc_opc_mc_items_list .sfc_opc_mc_item{padding:4px 8px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items .sfc_opc_mc_items_list .sfc_opc_mc_item:hover{background-color:#e1e7ec}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items .sfc_opc_mc_items_list .sfc_opc_mc_item label{display:inline-block;width:100%}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items_hint{margin-top:15px;margin-bottom:15px;padding-left:9px;padding-right:9px;color:#6e7a8a;font-size:10px;font-style:italic}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items_hint>span{margin-right:0.5em;font-style:italic}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_search,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_apply,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_cancel{margin-top:8px;font-size:1rem}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_search,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_apply{margin-right:5px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_more,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_less{position:absolute;bottom:7px;right:0px;cursor:pointer;color:#2c5382;font-size:10px;font-weight:bold;border:none;background-color:transparent}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_more>span,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_less>span{margin-left:3px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operator:not(:first-of-type),.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operator:first-of-type .sfc_op_radio{display:none}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_less{display:none}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_more{display:inline-block}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group.advanced .sfc_fg_operator{margin-bottom:3px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group.advanced .sfc_fg_operator:last-of-type{margin-bottom:0}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group.advanced .sfc_fg_operator:not(:first-of-type),.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group.advanced .sfc_fg_operator:first-of-type .sfc_op_radio{display:inherit}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group.advanced .sfc_fg_less{display:inline-block}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group.advanced .sfc_fg_more{display:none}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group.advanced .hide_on_advanced{display:none}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group:not(.advanced) .hide_on_less{display:none}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_raw>*{border-color:transparent}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_raw .sfc_title{cursor:initial;padding-right:20px}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_raw .sfc_form_group{display:none}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_enum .sfc_form_group .sfc_fg_operator_in{display:flex;flex-direction:column;height:100%;min-height:0}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_enum .sfc_form_group .sfc_fg_operator_in>label{display:flex;height:100%;min-height:0;width:100%;line-height:initial;white-space:nowrap}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_enum .sfc_form_group .sfc_fg_operator_in>label .sfc_op_content{width:100%}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_tag_set .sfc_form_group .sfc_fg_operator_in>label{display:inline-block;width:100%;line-height:initial;white-space:nowrap}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_tag_set .sfc_form_group .sfc_fg_operator_in>label .sfc_op_content{width:100%}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_numeric .sfc_fg_operators .sfc_fg_operator.sfc_fg_operator_between .sfc_op_content_from_outer{display:inline}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_numeric .sfc_fg_operators .sfc_fg_operator.sfc_fg_operator_between .sfc_op_content_until_outer{display:inline;margin-left:5px}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_numeric .sfc_fg_operators .sfc_fg_operator.sfc_fg_operator_between label.sfc_op_content_from_label,.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_numeric .sfc_fg_operators .sfc_fg_operator.sfc_fg_operator_between label.sfc_op_content_until_label{width:45px;display:inline-block}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_numeric .sfc_fg_operators .sfc_fg_operator.sfc_fg_operator_between input[type="text"]{width:77px}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date_time .sfc_form_group.advanced .sfc_fg_operator_between,.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date .sfc_form_group.advanced .sfc_fg_operator_between{margin-bottom:5px}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date_time .sfc_fg_operator_between_days input,.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date .sfc_fg_operator_between_days input{width:135px}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date_time button.ui-datepicker-trigger,.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date button.ui-datepicker-trigger{background:none;border:none;height:100%;padding:2px}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date_time button.ui-datepicker-trigger img,.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date button.ui-datepicker-trigger img{vertical-align:middle}.search_form_handler .sf_criterion_area .sf_more_criterion.opened{z-index:2}.search_form_handler .sf_criterion_area .sf_more_criterion.opened .sfm_content{display:inherit}.search_form_handler .sf_criterion_area .sf_more_criterion.opened_left .sfm_content{left:auto;right:0px}.search_form_handler .sf_criterion_area .sf_more_criterion>*{background-color:white;color:#37474f}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_toggler .sfm_tg_title{margin-right:7px}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_toggler .sfm_tg_icon{color:#dd6c20}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_content{display:none;min-width:200px}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_content .sfm_lists{margin:0 -8px;padding:0 8px;max-height:400px;overflow-x:hidden;overflow-y:auto}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_content .sfm_lists .sfl_items>li:hover{background-color:#e1e7ec}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_content .sfm_buttons{display:none}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_content .sfm_buttons button{margin-top:8px;margin-right:5px;padding:3px 6px;font-size:11px}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_content .sfm_buttons button:last-of-type{margin-right:0}.search_form_handler .sf_criterion_area .sf_button{cursor:pointer}.search_form_handler .sf_criterion_area .sf_button>*{background-color:white;color:#dd6c20}.search_form_handler .sf_list:not(:first-of-type) .sfl_title{border-top:1px solid #ccd4db;padding-top:8px;margin-top:5px}.search_form_handler .sf_list .sfl_title{font-weight:bold}.search_form_handler .sf_list .sfl_items{margin:5px -8px 0 -8px;padding:0;text-align:left}.search_form_handler .sf_list .sfl_items>li{padding:4px 8px;list-style:none;white-space:nowrap}.search_form_handler .sf_list .sfl_items>li:hover{background-color:#e1e7ec}.search_form_handler .sf_list .sfl_items>li.sfl_i_placeholder{font-style:italic;opacity:0.8}.search_form_handler .sf_list .sfl_items>li>label{display:inline-block;width:100%}.search_form_handler .sf_list .sfl_items>li>label>*{vertical-align:middle}.search_form_handler .sf_list .sfl_items>li>label>input[type="checkbox"]{margin-left:0;margin-right:8px}.search_form_handler .sf_filter{position:relative;margin-top:8px;margin-bottom:8px}.search_form_handler .sf_filter input,.search_form_handler .sf_filter button,.search_form_handler .sf_filter .sff_picto{vertical-align:middle;height:22px}.search_form_handler .sf_filter input,.search_form_handler .sf_filter button{border:1px solid #ABABAB}.search_form_handler .sf_filter input{width:100% !important}.search_form_handler .sf_filter button{width:23px;background-color:white;color:#dd6c20;font-size:10px}.search_form_handler .sf_filter button:first-of-type{margin-left:5px}.search_form_handler .sf_filter button:not(:first-of-type){border-left:transparent}.search_form_handler .sf_filter .sff_input_wrapper{position:relative}.search_form_handler .sf_filter .sff_input_wrapper input[type="text"]{display:unset}.search_form_handler .sf_filter .sff_input_wrapper .sff_picto{position:absolute;right:7px;top:3px;user-select:none;color:#404b5a}.search_form_handler .sf_filter .sff_input_wrapper .sff_reset{display:none}.search_form_handler .sf_filter .sff_input_wrapper input::-ms-clear{display:none}.search_form_handler .sf_filter.sf_with_buttons input{width:calc(100% - 28px) !important;min-width:120px}.sft_hint,.sfobs_hint,.sft_toggler{margin-left:8px;color:#404b5a}.sf_results_placeholder{margin-top:24px;text-align:center}.sf_results_placeholder button{margin-top:8px}.sf_results_placeholder button>span{margin-right:0.5em}.ibo-search-form-panel{z-index:3;margin-bottom:8px}.ibo-search-form-panel .ibo-panel--body{padding:18px 14px 10px;overflow:initial}.ibo-search-form-panel .ibo-panel--body::before{border-radius:5px 5px 0 0}#ibo-main-content .search_form_handler .sf_criterion_area{padding:0}.sfm_tg_title{display:none}.ibo-criterion-group:empty~.sf_more_criterion .sfm_tg_title{display:unset}.sf_results_area{z-index:1;margin-bottom:300px}.ibo-search-form-panel .ibo-panel--body.ibo-is-sticking{position:fixed;border-radius:0;border-bottom-color:transparent}.ibo-datatable-panel.ibo-is-sticking .ibo-panel--header,.ibo-datatable-panel.ibo-is-sticking .ibo-object-summary--header{z-index:0}.ibo-datatable-panel.ibo-is-sticking .ibo-datatable--toolbar{position:fixed;z-index:2;padding-bottom:4px;background-color:white;border-left:1px solid #ccd4db;border-right:1px solid #ccd4db}.ibo-datatable-panel.ibo-is-sticking .dataTables_scrollHead{position:fixed !important;z-index:2;background-color:white;border-left:1px solid #ccd4db !important;border-right:1px solid #ccd4db !important}.ibo-field-badge{display:inline-flex;align-items:baseline;margin:0;padding:4px 10px;border-radius:3px;background-color:var(--ibo-main-color);color:var(--ibo-complementary-color)}.ibo-field-badge--decoration+.ibo-field-badge--label{margin-left:0.5rem}.ibo-input-file-select--container .ibo-input-file-select .ibo-input-file-select--file-input{display:none}.ibo-input-file-select--container .ibo-input-file-select .ibo-input-file-select--file-name{margin-left:10px}.ibo-medallion-icon{display:flex;padding:13px 0}.ibo-medallion-icon--image{height:48px;width:48px;padding:2px;border-radius:100%;background-color:#bee3f8}.ibo-medallion-icon--description{display:inline-block;padding-left:8px}@keyframes decreaseHighlight{0%{height:100%}8%{border-radius:0 0 0 3px}100%{height:0}}.ibo-toast{display:inline-flex;position:fixed;align-items:center;max-width:calc(50% - 20px);padding:12px 8px 12px 16px;border-radius:3px;box-shadow:0 2px 4px rgba(0, 0, 0, 0.12), 0 3px 6px rgba(0, 0, 0, 0.15);transition:all 0.4s cubic-bezier(0.215, 0.61, 0.355, 1);z-index:2147483647}.ibo-toast::before{display:block;position:absolute;top:0;left:0;content:"";width:4px;height:100%;top:initial;bottom:0;border-radius:3px 0 0 3px}.ibo-toast.ibo-is-auto-closeable::before{animation:decreaseHighlight 5s linear forwards}.ibo-toast:hover::before{animation:none}:root{}.ibo-navigation-menu{position:relative;height:100vh}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--square-company-logo{display:none}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--full-company-logo{display:flex}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--silo-selection{display:inline-block}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--silo-visual-hint{display:none}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body{width:310px}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--toggler-bar:nth-child(1){top:4px;left:7px;width:14px;transform:rotateZ(-45deg)}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--toggler-bar:nth-child(2){top:8px;left:7px;width:0;opacity:0}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--toggler-bar:nth-child(3){top:12px;left:7px;width:14px;transform:rotateZ(45deg)}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--menu-group:not(.ibo-is-active):active{border-radius:16px}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part{padding:24px 0 12px}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part .ibo-navigation-menu--notifications .ibo-navigation-menu--notifications-toggler{display:none}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part .ibo-navigation-menu--user-info{height:100%}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part .ibo-navigation-menu--user-info .ibo-navigation-menu--user-welcome-message,.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part .ibo-navigation-menu--user-info .ibo-navigation-menu--user-notifications,.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part .ibo-navigation-menu--user-info .ibo-navigation-menu--user-organization{display:block}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part .ibo-navigation-menu--user-info .ibo-navigation-menu--user-picture{margin-top:-60px;width:72px;height:72px;border:solid 3px #263238}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part .ibo-navigation-menu--user-info .ibo-navigation-menu--user-picture .ibo-navigation-menu--user-picture--image{max-width:72px;max-height:72px}.ibo-navigation-menu.ibo-is-active .ibo-navigation-menu--drawer{right:calc(-1 * 312px)}.ibo-navigation-menu.ibo-is-filtered .ibo-navigation-menu--menu-filter-clear{display:block}.ibo-navigation-menu.ibo-is-filtered .ibo-navigation-menu--menu-nodes{margin-bottom:48px}.ibo-navigation-menu.ibo-is-filtered .ibo-navigation-menu--menu-nodes .ibo-navigation-menu--menu-nodes-title{margin-bottom:8px}.ibo-navigation-menu--body,.ibo-navigation-menu--drawer{height:100vh}.ibo-navigation-menu--body{z-index:1;display:flex;flex-direction:column;justify-content:space-between;align-items:stretch;height:100vh;width:60px;background-color:#263238;transition:width 0.1s ease-in-out}.ibo-navigation-menu--top-part{z-index:2;min-height:120px;padding:12px 16px;overflow:hidden}.ibo-navigation-menu--middle-part{z-index:1;flex-grow:1;overflow-y:auto;padding:24px 16px 16px;scrollbar-width:thin;scrollbar-color:#d5dde5 rgba(255, 255, 255, 0)}.ibo-navigation-menu--middle-part::-webkit-scrollbar{width:5px}.ibo-navigation-menu--middle-part::-webkit-scrollbar-track{background-color:rgba(255, 255, 255, 0)}.ibo-navigation-menu--middle-part::-webkit-scrollbar-thumb{background-color:#d5dde5}.ibo-navigation-menu--bottom-part{z-index:2;padding-top:20px;padding-bottom:16px;height:126px;background-color:#404b5a;justify-content:space-between;flex-direction:column}.ibo-navigation-menu--toggler,.ibo-navigation-menu--menu-group{margin:calc(-1 * 10px) calc(-1 * 8px);padding:10px 8px;border-radius:5px}.ibo-navigation-menu--square-company-logo{display:flex;width:38px;height:38px;margin:0 -5px 44px}.ibo-navigation-menu--square-company-logo>img{object-fit:contain}.ibo-navigation-menu--full-company-logo{display:none;width:310px;height:70px;margin:0 0 12px -16px}.ibo-navigation-menu--full-company-logo>img{object-fit:contain;margin:0 auto}.ibo-navigation-menu--toggler{position:relative;display:inline-flex;width:44px}.ibo-navigation-menu--toggler:hover,.ibo-navigation-menu--toggler:active{background-color:#455a64}.ibo-navigation-menu--toggler:hover .ibo-navigation-menu--toggler-bar,.ibo-navigation-menu--toggler:active .ibo-navigation-menu--toggler-bar{background-color:white}.ibo-navigation-menu--toggler-icon{position:relative;display:flex;height:20px;width:28px}.ibo-navigation-menu--toggler-bar{position:absolute;display:block;height:3px;width:100%;opacity:1;transition:all 0.2s linear;background-color:#d5dde5}.ibo-navigation-menu--toggler-bar:nth-child(1){top:0}.ibo-navigation-menu--toggler-bar:nth-child(2){top:8px}.ibo-navigation-menu--toggler-bar:nth-child(3){top:16px}.ibo-navigation-menu--silo-selection{position:absolute;display:none;width:70%;margin-left:15px}.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ibo-input,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ibo-input,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ui-autocomplete-input,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ui-multiselect,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .dataTables_length select,.dataTables_length .ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider select,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ui_tpicker_hour_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ui_tpicker_minute_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ui_tpicker_second_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider select.ibo-input-select-placeholder,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ibo-datatableconfig--attributes-panel--per-page--input,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider input[type="text"],.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider input[type="text"],.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ibo-input,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ui-autocomplete-input,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ui-multiselect,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .dataTables_length select,.dataTables_length .ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider select,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ui_tpicker_hour_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ui_tpicker_minute_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ui_tpicker_second_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider select.ibo-input-select-placeholder,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ibo-datatableconfig--attributes-panel--per-page--input,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider input[type="text"],.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider input[type="text"],.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ibo-input,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ui-autocomplete-input,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ui-multiselect,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .dataTables_length select,.dataTables_length .ibo-navigation-menu--silo-selection .ui_tpicker_second_slider select,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ui_tpicker_hour_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ui_tpicker_minute_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ui_tpicker_second_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider select.ibo-input-select-placeholder,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ibo-datatableconfig--attributes-panel--per-page--input,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .ibo-navigation-menu--silo-selection .ui_tpicker_second_slider input[type="text"],.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .ibo-navigation-menu--silo-selection .ui_tpicker_second_slider input[type="text"],.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ui-autocomplete-input,.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ui-multiselect,.ibo-navigation-menu--silo-selection .ibo-input-wrapper .dataTables_length select,.dataTables_length .ibo-navigation-menu--silo-selection .ibo-input-wrapper select,.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ui_tpicker_hour_slider>select,.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ui_tpicker_minute_slider>select,.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ui_tpicker_second_slider>select,.ibo-navigation-menu--silo-selection .ibo-input-wrapper select.ibo-input-select-placeholder,.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ibo-datatableconfig--attributes-panel--per-page--input,.ibo-navigation-menu--silo-selection .ibo-input-wrapper .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .ibo-navigation-menu--silo-selection .ibo-input-wrapper input[type="text"],.ibo-navigation-menu--silo-selection .ibo-input-wrapper .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .ibo-navigation-menu--silo-selection .ibo-input-wrapper input[type="text"]{padding-right:38px;overflow:hidden}.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ibo-input-select-autocomplete,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ibo-input-select-autocomplete,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ibo-input-select-autocomplete,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ibo-input-select-autocomplete{padding-right:60px}.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ibo-input-select-autocomplete~.ibo-input-select--action-button--search,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--search,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--search,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--search{margin-left:-42px}.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ibo-input-select-autocomplete~.ibo-input-select--action-button--clear,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--clear,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--clear,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--clear{margin-left:-72px}.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ibo-input-select-autocomplete~.ibo-input-select--action-button--hierarchy,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--hierarchy,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--hierarchy,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--hierarchy{margin-left:-60px}.ibo-navigation-menu--silo-visual-hint{position:absolute;top:2px;right:0;width:16px;height:16px;background-color:#e53e3e;border:2px solid #263238;border-radius:100%}.ibo-navigation-menu--menu-group{display:flex;justify-content:left;align-items:center;white-space:nowrap;overflow-x:hidden;color:#d5dde5;transition-property:background-color, color, padding, margin, border-radius;transition-duration:0.1s;transition-timing-function:linear}.ibo-navigation-menu--menu-group>.ibo-navigation-menu--menu-group-icon{display:flex}.ibo-navigation-menu--menu-group .ibo-navigation-menu--menu-group-title{flex-grow:1}.ibo-navigation-menu--menu-group:not(:last-child){margin-bottom:20px}.ibo-navigation-menu--menu-group:not(.ibo-is-active):hover,.ibo-navigation-menu--menu-group:not(.ibo-is-active):active{color:white;background-color:#455a64}.ibo-navigation-menu--menu-group:not(.ibo-is-active):active{border-radius:100%}.ibo-navigation-menu--menu-group.ibo-is-active{margin-right:calc(-2 * 8px);padding-right:calc(2 - 8px);color:#37474f;background-color:#f8f9fa;border-radius:5px 0 0 5px}.ibo-navigation-menu--menu-group.ibo-is-active .ibo-navigation-menu--menu-group-icon{color:#ea7d1e}.ibo-navigation-menu--menu-group-icon{width:28px;min-width:28px;justify-content:center;font-size:1.83rem}.ibo-navigation-menu--menu-group-icon::before{width:28px}.ibo-navigation-menu--menu-group-title{margin-left:16px;justify-content:left}.ibo-navigation-menu--drawer{position:absolute;z-index:-1;top:0;bottom:0;right:0;display:flex;flex-direction:column;justify-content:flex-start;width:312px;padding:32px 20px;background-color:#f8f9fa;border-right:1px solid #d5dde5;transition:right 0.2s ease-in-out}.ibo-navigation-menu--menu-filter{position:relative}.ibo-navigation-menu--menu-filter-input{width:100%;padding:8px 10px;color:#212934;background-color:white;border:1px solid #d5dde5;border-radius:3px;padding-right:76px}.ibo-navigation-menu--menu-filter-input::placeholder{color:#6e7a8a}.ibo-navigation-menu--menu-filter-input:-ms-input-placeholder,.ibo-navigation-menu--menu-filter-input::-ms-input-placeholder{color:#6e7a8a}.ibo-navigation-menu--menu-filter-clear{display:none;position:absolute;top:8px;right:60px;padding:3px 3px}.ibo-navigation-menu--menu-filter-hotkey{position:absolute;top:6.5px;right:10px;border:1px solid #ccd4db;border-radius:3px;color:#6e7a8a;padding:2px 4px}.ibo-navigation-menu--menu-filter-hint{position:relative;margin-top:16px;padding-right:12px;color:#6e7a8a}.ibo-navigation-menu--menu-filter-hint-close{position:absolute;top:1px;right:2px}.ibo-navigation-menu--menu--placeholder{width:100%;margin-top:50px}.ibo-navigation-menu--menu--placeholder-image>svg{display:block;width:90%;height:auto;margin:auto}.ibo-navigation-menu--menu--placeholder-hint{margin-top:8px;text-align:center}.ibo-navigation-menu--menu-groups{overflow-y:auto;overflow-x:hidden;margin:50px calc(-1 * 20px) 0 calc(-1 * 20px);padding-left:20px;padding-right:20px;width:inherit}.ibo-navigation-menu--menu-nodes{display:none}.ibo-navigation-menu--menu-nodes ul li>a,.ibo-navigation-menu--menu-nodes ul .ibo-quick-create--compartment-results--elementli>.option:hover,.ibo-navigation-menu--menu-nodes ul .ibo-quick-create--compartment-results--element>li>.option:hover,.ibo-navigation-menu--menu-nodes ul li>span{margin:0 -10px;padding:6px 10px;border-radius:0;color:#6e7a8a}.ibo-navigation-menu--menu-nodes ul li>a,.ibo-navigation-menu--menu-nodes ul .ibo-quick-create--compartment-results--elementli>.option:hover,.ibo-navigation-menu--menu-nodes ul .ibo-quick-create--compartment-results--element>li>.option:hover{color:inherit}.ibo-navigation-menu--menu-nodes ul li>a:hover,.ibo-navigation-menu--menu-nodes ul .ibo-quick-create--compartment-results--elementli>.option:hover,.ibo-navigation-menu--menu-nodes ul .ibo-quick-create--compartment-results--element>li>.option:hover{background-color:#e1e7ec;border-radius:5px}.ibo-navigation-menu--menu-nodes ul ul{padding-left:20px}.ibo-navigation-menu--menu-nodes.ibo-is-active{display:block}.ibo-navigation-menu--menu-nodes-title{margin-top:0;margin-bottom:32px;word-break:break-word}.ibo-navigation-menu--menu-node-title{display:flex;justify-content:space-between;align-items:center}.ibo-navigation-menu--menu-node-counter{margin-left:8px;padding:2px 6px;width:34px;min-width:34px;text-align:center;background:#e1e7ec;border-radius:5px}.ibo-navigation-menu--notifications{position:relative;display:flex;flex-direction:column;align-content:center}.ibo-navigation-menu--notifications-toggler{position:relative;font-size:2rem;color:#929fb1}.ibo-navigation-menu--notifications-toggler:hover,.ibo-navigation-menu--notifications-toggler.ibo-is-loaded:hover{color:#f2f2f2}.ibo-navigation-menu--notifications-toggler.ibo-is-loaded{color:#d5dde5}.ibo-navigation-menu--notifications-toggler.ibo-is-loaded:not(.ibo-is-empty) .ibo-navigation-menu--notifications-toggler--new-messages{display:inline}.ibo-navigation-menu--notifications-toggler .ibo-navigation-menu--notifications-toggler--new-messages{top:-2px;right:-7px;width:16px;height:16px}.ibo-navigation-menu--user-notifications--toggler{position:relative}.ibo-navigation-menu--user-notifications--toggler.ibo-is-loaded{color:#d5dde5}.ibo-navigation-menu--user-notifications--toggler.ibo-is-loaded:not(.ibo-is-empty) .ibo-navigation-menu--notifications-toggler--new-messages{display:inline}.ibo-navigation-menu--user-notifications--toggler .ibo-navigation-menu--notifications-toggler--new-messages{top:-2px;right:-5px;width:10px;height:10px}.ibo-navigation-menu--notifications-toggler--new-messages{position:absolute;display:none;background-color:#e53e3e;border:2px solid #404b5a;border-radius:100%}.ibo-navigation-menu--user-info{justify-content:space-between;flex-direction:column}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-picture{width:36px;height:36px;overflow:hidden;background-color:#d5dde5;border-radius:100%}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-picture .ibo-navigation-menu--user-picture--image{display:flex;max-width:36px;max-height:36px}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-welcome-message,.ibo-navigation-menu--user-info .ibo-navigation-menu--user-organization,.ibo-navigation-menu--user-info .ibo-navigation-menu--user-notifications{display:none;text-align:center;color:white}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-welcome-message .ibo-navigation-menu--user-welcome-message--text,.ibo-navigation-menu--user-info .ibo-navigation-menu--user-welcome-message .ibo-navigation-menu--user-welcome-message--toggler{color:white}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-welcome-message--toggler{padding-left:6px}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-notifications .ibo-navigation-menu--user-notifications--text{color:white}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-notifications .ibo-navigation-menu--user-notifications--toggler--icon{padding-left:5px}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-organization{color:#ebf8ff}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container{position:absolute;bottom:10px}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ibo-popover-menu>.ibo-popover-menu--section:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ui-menu>.ibo-popover-menu--section:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ui-menu>.ui-multiselect-checkboxes:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ui-multiselect-menu>.ibo-popover-menu--section:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ui-multiselect-menu>.ui-multiselect-checkboxes:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ibo-input-select-icon--menu>.ibo-popover-menu--section:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ibo-input-select-icon--menu>.ui-multiselect-checkboxes:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .graph_config .toolkit_menu.graph>ul>li ul>.ibo-popover-menu--section:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .graph_config .toolkit_menu.graph>ul>li ul>.ui-multiselect-checkboxes:nth-child(odd),.graph_config .toolkit_menu.graph>ul>li .ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container ul>.ibo-popover-menu--section:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ibo-popover-menu>.ui-multiselect-checkboxes:nth-child(odd){background-color:#f8f9fa}:root{--ibo-top-bar--height: 54px;--ibo-top-bar--padding-left: 16px;--ibo-top-bar--padding-right: 16px;--ibo-top-bar--padding-y: 0;--ibo-top-bar--background-color: white;--ibo-top-bar--elements-spacing: 32px;--ibo-top-bar--quick-actions--margin-right: 32px}.ibo-top-bar{height:var(--ibo-top-bar--height);padding:var(--ibo-top-bar--padding-y) var(--ibo-top-bar--padding-right) var(--ibo-top-bar--padding-y) var(--ibo-top-bar--padding-left);background-color:var(--ibo-top-bar--background-color)}.ibo-top-bar .ibo-breadcrumbs{flex-grow:1;overflow-x:hidden}.ibo-top-bar--quick-actions{margin-right:var(--ibo-top-bar--quick-actions--margin-right)}.ibo-top-bar--toolbar-dashboard-title{max-width:350px}.ibo-top-bar--toolbar-dashboard-menu-toggler{display:flex;align-items:center}#ibo-center-container.ibo-center-container--with-side-content{display:flex;align-items:stretch}#ibo-center-container.ibo-center-container--with-side-content #ibo-main-content{flex-grow:1}.ibo-v-spacer{padding-top:1em}#ibo-side-content{background-color:white;border-left:1px solid #ccd4db}.ibo-details{margin-top:5px}.ibo-tab-container:not(.ibo-is-scrollable):not([data-status="loaded"]) .ibo-tab-container--tab-container:not(:first-child){display:none}.ibo-tab-container--tabs-list{position:relative;height:36px;background-color:#f8f9fa}.ibo-tab-container--tab-header,.ibo-tab-container--extra-tabs-container{color:#404b5a}.ibo-tab-container--tab-header:hover:not(.ui-state-disabled),.ibo-tab-container--extra-tabs-container:hover:not(.ui-state-disabled){color:#2c5382;background-color:#e1e7ec}.ibo-tab-container--tab-header.ui-tabs-active,.ui-tabs-active.ibo-tab-container--extra-tabs-container{color:#2c5382}.ibo-tab-container--tab-toggler,.ibo-tab-container--extra-tabs-list-toggler{padding-left:24px;padding-right:24px}.ibo-tab-container--extra-tabs-container{position:absolute;top:0;bottom:0;right:0;background-color:#f8f9fa}.ibo-tab-container--extra-tabs-list-toggler{padding-left:12px;padding-right:12px}.ibo-tab-container--extra-tabs-list{position:fixed;z-index:10;max-height:300px;display:flex;flex-direction:column;overflow-y:auto;background-color:#f8f9fa;border-radius:3px}.ibo-tab-container--extra-tab-toggler{padding:8px 16px;max-width:220px;color:#6e7a8a;overflow-x:clip}.ibo-tab-container--extra-tab-toggler:hover,.ibo-tab-container--extra-tab-toggler:active{color:#2c5382;background-color:#e1e7ec}.ibo-tab-container--extra-tab-toggler--tooltip-title{margin-bottom:16px}.ibo-tab-container--tab-container{padding:32px 32px;overflow-x:auto}.ibo-tab-container--tab-container-list.ibo-is-scrollable .ibo-tab-container--tab-container:not(:first-child:nth-last-child(2)) .ibo-tab-container--tab-container--label{display:block}.ibo-tab-container--tab-container-list.ibo-is-scrollable .ibo-tab-container--tab-container{min-height:auto}.ibo-tab-container--tab-container-list.ibo-is-scrollable .ibo-tab-container--tab-container:last-child:not(:only-child){min-height:60vh}.ibo-tab-container--tab-container--label{display:none;margin-bottom:20px;overflow-x:hidden}.ibo-tab-container--tab-container--label>span{position:relative;padding-left:20px;margin-left:40px;color:#929fb1}.ibo-tab-container--tab-container--label>span::before,.ibo-tab-container--tab-container--label>span::after{content:"";display:inline-block;position:absolute;top:calc(50% - (2px / 2));height:1px;width:10000px;border-top:2px solid #929fb1}.ibo-tab-container--tab-container--label>span::before{right:100%}.ibo-tab-container--tab-container--label>span::after{left:100%;margin-left:20px}.ibo-tab--temporary-remote-content{position:relative}.ibo-tab--temporary-remote-content--placeholder{position:relative;height:auto;max-height:300px;text-align:center}.ibo-tab--temporary-remote-content--placeholder>svg{max-width:calc(300px * 5.4);max-height:300px}.ibo-tab--temporary-remote-content--button{position:absolute;top:0;display:flex;justify-content:center;align-content:center;flex-direction:column;text-align:center;height:100%;width:100%;cursor:pointer;background-color:transparent;color:#404b5a}.ibo-tab--temporary-remote-content--button:hover{opacity:0.5;background-color:#212934;color:#e1e7ec}.ibo-multi-column{display:flex;flex-wrap:wrap;margin:0 -16px;row-gap:48px}.ibo-column{min-width:300px;flex-grow:1;flex-shrink:1;padding:0 16px;flex-basis:10%}.ibo-column:not(:last-child) .ibo-column:not(.ibo-without-margin){margin-bottom:48px}.ibo-mini-column{min-width:30px;flex-grow:1;flex-shrink:1;padding:0 16px;flex-basis:10%;display:flex;flex-direction:column}.ibo-mini-column>.ibo-button,.ui-dialog .ibo-mini-column>.ui-button,.ibo-mini-column>.ui-datepicker-current,.ibo-mini-column>.ui-datepicker-close{margin-left:0;margin-right:0}.ibo-mini-column:not(:last-child){margin-bottom:48px}.ibo-dashboard--top-bar{display:flex;justify-content:space-between;align-items:center;padding-bottom:20px}.ibo-dashboard--top-bar .ibo-dashboard--top-bar-toolbar{display:flex;align-items:center}.ibo-dashboard--selector{display:flex;align-items:center;margin-left:12px;margin-right:1}.ibo-dashboard--selector:hover{background-color:#f8f9fa;border-radius:4px}.ibo-dashboard--selector .selector-label{display:inline-block;margin-left:10px;margin-right:10px;vertical-align:super}.ibo-dashboard--grid{width:100%}.ibo-dashboard--grid-row{display:flex;flex-direction:row;justify-content:space-between;overflow:hidden}.ibo-dashboard--grid-row:not(:last-child){padding-bottom:calc(24px / 2)}.ibo-dashboard--grid-row:not(:first-child){padding-top:calc(24px / 2)}.ibo-dashboard--grid-column{display:flex;flex-flow:row wrap;align-items:flex-start;align-content:flex-start;width:calc(100% + (2 * 24px));margin:calc(-1 * 24px / 2) calc(-1 * 24px / 2);min-width:0}.ibo-dashboard--grid-column:not(:last-child){margin-right:0}.ibo-dashboard--grid-column:not(:first-child){margin-left:0}.ibo-dashboard--grid-column.edit_mode{margin:1px;border:2px #ccd4db dashed;width:100%;min-height:40px}.ibo-dashboard--switch{position:relative;display:inline-block;width:30px;height:24px;vertical-align:baseline}.ibo-dashboard--switch input{display:none}.ibo-dashboard--slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0}.ibo-dashboard--slider:before{content:"";font-size:0.83rem;color:#404b5a;position:absolute;right:5px;bottom:3px}.ibo-dashboard--slider:after{content:"";font-size:1.17rem;color:#dd6c20;position:absolute;left:6px;bottom:1px}input:checked+.ibo-dashboard--slider:before{content:""}input:checked+.ibo-dashboard--slider:after{content:""}.ibo-dashboard-editor--pane{flex-grow:1;padding:16px 30px 16px 15px;overflow:auto}.ibo-dashboard-editor--available-dashlet-icon{display:inline-block;height:34px;width:34px;margin:2px 5px;cursor:grab}.ibo-dashboard-editor--available-dashlet-icon:active{cursor:move}.ibo-dashboard-editor--properties,.ibo-dashboard--available-dashlets,.ibo-dashlet--properties{display:flex;flex-direction:column;padding-bottom:20px}.ibo-dashboard-editor--properties table,.ibo-dashboard--available-dashlets table,.ibo-dashlet--properties table{width:100%;text-align:left}.ibo-dashboard-editor--properties table td,.ibo-dashboard-editor--properties table th,.ibo-dashboard--available-dashlets table td,.ibo-dashboard--available-dashlets table th,.ibo-dashlet--properties table td,.ibo-dashlet--properties table th{margin-bottom:14px}.ibo-dashboard-editor--properties-title{padding-bottom:2rem}.ibo-dashboard-editor--layout-list{display:flex;justify-content:center;padding-bottom:12px}.ibo-dashboard-editor--layout-list>.ui-button{display:inline-block;height:auto;margin:0 15px 0 5px}.ibo-dashboard--available-dashlets--list{display:flex;justify-content:center;flex-wrap:wrap}#dashboard_editor{display:flex;flex-direction:row;padding:0}#dashboard_editor>.itop-dashboard{resize:horizontal;overflow:scroll;border-right:solid 1px #e1e7ec;padding:16px 15px 16px 30px}.ibo-dashboard-editor--delete-dashlet-icon{position:absolute;top:7px;right:9px;padding:2px 6px;z-index:21}.ibo-dashboard-editor .itop-dashboard a,.ibo-dashboard-editor .itop-dashboard .ibo-quick-create--compartment-results--element>.option:hover{cursor:not-allowed}.ibo-wizard-container{padding:10px 16px;background:#bee3f8;border-radius:3px;border-left:3px solid #3182ce}.ibo-object-details.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header .ibo-panel--header-left,.ibo-object-details.ibo-has-icon.ibo-has-medallion-icon>.ibo-object-summary--header .ibo-panel--header-left{margin-left:32px;padding-left:96px}.ibo-object-details.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header .ibo-panel--header-left .ibo-panel--icon,.ibo-object-details.ibo-has-icon.ibo-has-medallion-icon>.ibo-object-summary--header .ibo-panel--header-left .ibo-panel--icon{bottom:calc(-1 * 96px / 2 + -12px);width:96px;height:96px;min-width:96px;min-height:96px}.ibo-object-details.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header .ibo-panel--header-left .ibo-panel--titles,.ibo-object-details.ibo-has-icon.ibo-has-medallion-icon>.ibo-object-summary--header .ibo-panel--header-left .ibo-panel--titles{padding-left:32px}.ibo-object-details--status-dot{width:10px;height:10px;min-width:10px;min-height:10px;border-radius:100%}.ibo-object-details--status-dot+.ibo-object-details--status-label{margin-left:8px}.ibo-object-details--status+.ibo-object-details--object-class{margin-left:0.5rem;display:inline-flex}.ibo-object-details--status+.ibo-object-details--object-class::before{content:"("}.ibo-object-details--status+.ibo-object-details--object-class::after{content:")"}.ibo-object-details--tag{color:#404b5a}.ibo-object-details--tag:not(:first-child){margin-left:12px}.ibo-object-details--tag-icon{margin-right:6px;color:#6e7a8a}.ibo-object-details--object-class~.ibo-object-details--tag::before,.ibo-object-details--tag~.ibo-object-details--tag::before{content:" ";display:inline-block;vertical-align:middle;margin-right:12px;width:5px;height:5px;border-radius:100%;background-color:#404b5a}.ibo-object-details.ibo-has-sticky-header>.ibo-panel--header,.ibo-object-details.ibo-has-sticky-header>.ibo-object-summary--header{}.ibo-object-details.ibo-has-sticky-header>.ibo-panel--header.ibo-is-sticking .ibo-object-details--object-class,.ibo-object-details.ibo-has-sticky-header>.ibo-is-sticking.ibo-object-summary--header .ibo-object-details--object-class{display:none}.ibo-object-details.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header,.ibo-object-details.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-object-summary--header{}.ibo-object-details.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header.ibo-is-sticking .ibo-panel--header-left,.ibo-object-details.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-is-sticking.ibo-object-summary--header .ibo-panel--header-left{padding-left:48px}.ibo-object-details.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header.ibo-is-sticking .ibo-panel--header-right,.ibo-object-details.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-is-sticking.ibo-object-summary--header .ibo-panel--header-right{padding-right:8px}.ibo-object-details.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header.ibo-is-sticking .ibo-panel--titles,.ibo-object-details.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-is-sticking.ibo-object-summary--header .ibo-panel--titles{padding-left:32px}.ibo-object-summary.ibo-has-medallion-icon .ibo-panel--titles{padding-left:16px}.ibo-object-summary>.ibo-panel--body{display:flex;flex-direction:column;padding:0;max-height:40vh;box-shadow:0 3px 6px rgba(0, 0, 0, 0.1), 0 10px 20px rgba(0, 0, 0, 0.15)}.ibo-object-summary--header{margin:8px 0 0 0;padding:8px 0;background-color:#f8f9fa;border-bottom:solid 1px #ccd4db}.ibo-object-summary--header .ibo-panel--icon{overflow:hidden;background-color:#f8f9fa;border:1px solid #90a4ae;border-radius:100%}.ibo-object-summary--header .ibo-panel--header-left{margin-left:16px}.ibo-object-summary--header .ibo-panel--header-right{align-self:start;margin-right:16px;margin-left:8px}.ibo-object-summary--body{overflow:auto}.ibo-object-summary--content--attributes{display:table;width:calc(100% - (2 * 16px));margin:16px 16px 24px 16px}.ibo-object-summary--content--attributes--code,.ibo-object-summary--content--attributes--value{display:table-cell}.ibo-activity-panel{position:relative;display:flex;flex-direction:column;width:480px;height:100%;transition:width 0.2s ease-in-out}.ibo-activity-panel.ibo-is-expanded{width:60vw}.ibo-activity-panel.ibo-is-expanded .ibo-activity-panel--expand-icon{display:none}.ibo-activity-panel:not(.ibo-is-expanded) .ibo-activity-panel--reduce-icon{display:none}.ibo-activity-panel.ibo-is-closed{width:32px}.ibo-activity-panel.ibo-is-closed .ibo-activity-panel--header,.ibo-activity-panel.ibo-is-closed .ibo-activity-panel--body,.ibo-activity-panel.ibo-is-closed .ibo-activity-panel--add-caselog-entry-button{display:none}.ibo-activity-panel.ibo-is-closed .ibo-activity-panel--closed-cover{display:inherit}.ibo-activity-panel--header{position:relative;background-color:#f8f9fa}.ibo-activity-panel--header .ibo-activity-panel--togglers a,.ibo-activity-panel--header .ibo-activity-panel--togglers .ibo-quick-create--compartment-results--element>.option:hover{color:#404b5a}.ibo-activity-panel--togglers{display:flex;align-items:center}.ibo-activity-panel--actions{display:flex;align-items:center;flex-grow:0;position:sticky;padding-right:16px;background-color:#f8f9fa;color:#929fb1}.ibo-activity-panel--actions:hover{color:#404b5a}.ibo-activity-panel--actions>*:not(:first-child){margin-left:0.75rem}.ibo-activity-panel--tabs-togglers{display:flex;align-items:center;justify-content:safe center;flex-grow:1;padding-left:48px;overflow-x:auto}.ibo-activity-panel--tab-toggler.ibo-is-active .ibo-activity-panel--tab-title{background-color:#e1e7ec}.ibo-activity-panel--tab-toggler.ibo-is-active .ibo-activity-panel--tab-title-messages-count{display:none}.ibo-activity-panel--tab-toggler.ibo-is-draft .ibo-activity-panel--tab-title-draft-indicator{display:initial}.ibo-activity-panel--tab-toggler-for-caselog-1 .ibo-activity-panel--tab-title-decoration{background-color:#689f38}.ibo-activity-panel--tab-toggler-for-caselog-2 .ibo-activity-panel--tab-title-decoration{background-color:#b83280}.ibo-activity-panel--tab-toggler-for-caselog-3 .ibo-activity-panel--tab-title-decoration{background-color:#f6ae55}.ibo-activity-panel--tab-toggler-for-caselog-4 .ibo-activity-panel--tab-title-decoration{background-color:#3182ce}.ibo-activity-panel--tab-toggler-for-caselog-5 .ibo-activity-panel--tab-title-decoration{background-color:#80deea}.ibo-activity-panel--tab-toggler-for-caselog-6 .ibo-activity-panel--tab-title-decoration{background-color:#c5e1a5}.ibo-activity-panel--tab-toggler-for-caselog-7 .ibo-activity-panel--tab-title-decoration{background-color:#fbb6ce}.ibo-activity-panel--tab-title{padding:8px 16px}.ibo-activity-panel--tab-title:hover{background-color:#e1e7ec}.ibo-activity-panel--tab-title-decoration{display:inline-flex;margin-right:8px;width:12px;height:12px;border-radius:3px}.ibo-activity-panel--tab-title-messages-count{display:inline-block;margin-left:8px;background-color:#e1e7ec;padding:0 4px;border-radius:3px}.ibo-activity-panel--tab-title-messages-count[data-messages-count="0"]{display:none}.ibo-activity-panel--tab-title-draft-indicator{display:none;margin-left:8px}.ibo-activity-panel--tab-title-text{max-width:100px}.ibo-activity-panel--tab-toolbar{display:none;flex-direction:column;padding-left:10px;padding-right:10px;background-color:#e1e7ec}.ibo-activity-panel--tab-toolbar.ibo-is-active{display:flex}.ibo-activity-panel--tab-toolbar-actions{justify-content:space-between;flex-wrap:nowrap;margin:4px 0;height:32px}.ibo-activity-panel--tab-toolbar-left-actions .ibo-activity-panel--tab-toolbar-action:not(:first-child)::before{content:"-";margin:0 8px}.ibo-activity-panel--tab-toolbar-middle-actions .ibo-activity-panel--tab-toolbar-action>input{margin-right:8px}.ibo-activity-panel--tab-toolbar-middle-actions .ibo-activity-panel--tab-toolbar-action:not(:first-child){margin-left:18px}.ibo-activity-panel--tab-toolbar-right-actions .ibo-activity-panel--tab-toolbar-info{color:#212934}.ibo-activity-panel--tab-toolbar-right-actions .ibo-activity-panel--tab-toolbar-info>.ibo-activity-panel--tab-toolbar-info-icon{margin-left:8px}.ibo-activity-panel--tab-toolbar-right-actions .ibo-activity-panel--tab-toolbar-info:not(:first-child){margin-left:16px}.ibo-activity-panel--tab-toolbar-action{position:relative;color:#212934}.ibo-activity-panel--filter{cursor:pointer}.ibo-activity-panel--filter-options-toggler{padding-left:0.5rem;color:#212934}.ibo-activity-panel--filter-options-toggler.ibo-is-closed{transform:rotateX(180deg)}.ibo-activity-panel--filter-options-toggler.ibo-is-closed+.ibo-activity-panel--filter-options{display:none}.ibo-activity-panel--filter-options{position:absolute;z-index:1;display:flex;flex-direction:column;top:24px;left:-12px;max-width:200px;padding:8px 12px;background-color:#e1e7ec;border-radius:3px}.ibo-activity-panel--filter-option{cursor:pointer}.ibo-activity-panel--filter-option:not(:first-child){margin-top:8px}.ibo-activity-panel--filter-option-input{margin-right:0.5rem}.ibo-activity-panel--body{flex-grow:1;overflow:auto;padding:16px 16px}.ibo-activity-panel--body--placeholder{margin-top:16px}.ibo-activity-panel--body--placeholder-image>svg{width:250px;height:inherit}.ibo-activity-panel--body--placeholder-hint{margin-top:16px;color:#404b5a}.ibo-activity-panel--add-caselog-entry-button{position:absolute;z-index:1;right:12px;top:88px;width:36px;height:36px;background-color:#dd6c20;color:white;border-radius:100%;box-shadow:0 1px 2px rgba(0, 0, 0, 0.25), 0 1px 3px rgba(0, 0, 0, 0.12)}.ibo-activity-panel--add-caselog-entry-button>i{text-align:center;height:100%;width:100%;font-size:1.33rem;line-height:33px}.ibo-activity-panel--add-caselog-entry-button:hover{color:white;background-color:#ea7d1e;box-shadow:0 2px 4px rgba(0, 0, 0, 0.12), 0 3px 6px rgba(0, 0, 0, 0.15)}.ibo-activity-panel--add-caselog-entry-button:active{color:white;background-color:#c05621}.ibo-activity-panel--add-caselog-entry-button.ibo-is-hidden{display:none}.ibo-activity-panel .ibo-activity-panel--entry-forms-confirmation-dialog{display:none}.ibo-activity-panel--entry-forms-confirmation-explanation{margin-bottom:16px}.ibo-activity-panel--entry-forms-confirmation-preference-input{margin-right:0.5rem}.ibo-activity-panel--closed-cover{display:none;position:absolute;z-index:2;top:0;bottom:0;left:0;right:0;background-color:#f8f9fa;cursor:pointer}.ibo-activity-panel--closed-content-container{transform:rotateZ(-90deg);white-space:nowrap}.ibo-activity-panel--open-icon{margin-left:0.75rem}.ibo-caselog-entry-form{display:block;width:100%;background-color:#e1e7ec}.ibo-caselog-entry-form.ibo-is-closed{display:none}.ibo-caselog-entry-form--actions{display:flex;justify-content:space-between;margin-top:8px;margin-bottom:8px}.ibo-caselog-entry-form--lock-indicator{margin-top:12px}.ibo-caselog-entry-form--lock-icon{width:32px;min-width:32px;height:32px;min-height:32px;color:#fcfcfd;background-color:#404b5a;border-radius:100%}.ibo-caselog-entry-form--lock-message{margin-left:1rem}.ibo-caselog-entry-form--action-buttons--main-actions{}.ibo-caselog-entry-form--action-buttons--main-actions>.ibo-popover-menu,.ibo-caselog-entry-form--action-buttons--main-actions>.ui-menu,.ibo-caselog-entry-form--action-buttons--main-actions>.ui-multiselect-menu,.ibo-caselog-entry-form--action-buttons--main-actions>.ibo-input-select-icon--menu,.graph_config .toolkit_menu.graph>ul>li .ibo-caselog-entry-form--action-buttons--main-actions>ul{z-index:1}.ibo-activity-panel--entry-group:not(:last-child){margin-bottom:24px}.ibo-activity-entry{display:flex;flex-direction:row;align-items:flex-end}.ibo-activity-entry:not(:last-child) .ibo-activity-entry--medallion{visibility:hidden}.ibo-activity-entry:not(:last-child) .ibo-activity-entry--sub-information{margin-bottom:4px}.ibo-activity-entry.ibo-is-current-user{flex-direction:row-reverse;min-width:min-content}.ibo-activity-entry.ibo-is-current-user .ibo-activity-entry--medallion{margin-right:initial;margin-left:8px}.ibo-activity-entry.ibo-is-current-user .ibo-activity-entry--information{margin-right:0;margin-left:40px}.ibo-activity-entry.ibo-is-current-user .ibo-activity-entry--main-information{background-color:#ebf8ff}.ibo-activity-entry.ibo-is-current-user .ibo-activity-entry--sub-information{text-align:right}.ibo-activity-entry.ibo-is-current-user:last-child .ibo-activity-entry--main-information{border-bottom-right-radius:0;border-bottom-left-radius:5px}.ibo-activity-entry:not(.ibo-is-current-user){}.ibo-activity-entry:not(.ibo-is-current-user) .ibo-activity-entry--information{margin-right:40px;margin-left:0}.ibo-activity-entry:not(.ibo-is-current-user):last-child .ibo-activity-entry--main-information{border-bottom-right-radius:5px;border-bottom-left-radius:0}.ibo-activity-entry.ibo-is-closed .ibo-activity-entry--main-information{max-height:48px;overflow:hidden;cursor:pointer}.ibo-activity-entry.ibo-is-closed .ibo-activity-entry--main-information::after{content:"...";position:absolute;top:30px;left:0;padding-left:16px;width:100%;height:100%;background-color:inherit}.ibo-activity-entry--medallion{margin-right:8px;margin-bottom:18px;min-width:32px;width:32px;min-height:32px;height:32px;overflow:hidden;border-radius:100%}.ibo-activity-entry--medallion.ibo-has-image{background-color:#ebf8ff;box-shadow:inset 0 1px 2px 0 rgba(0, 0, 0, 0.25)}.ibo-activity-entry--medallion:not(.ibo-has-image){background-color:#546e7a;color:white;border:1px solid #e1e7ec}.ibo-activity-entry--medallion .ibo-activity-entry--author-picture{max-height:100%}.ibo-activity-entry--main-information{position:relative;display:flex;flex-direction:row;align-items:baseline;padding:12px 16px;color:#404b5a;background-color:#e1e7ec;border-radius:5px}.ibo-activity-entry--main-information-icon{margin-right:16px;color:#6e7a8a;font-size:1.33rem}.ibo-activity-entry--main-information-content{flex-grow:1;word-break:break-word}.ibo-activity-entry--main-information-content a,.ibo-activity-entry--main-information-content .ibo-quick-create--compartment-results--element>.option:hover{color:#2b6bb0}.ibo-activity-entry--main-information-content a:hover,.ibo-activity-entry--main-information-content .ibo-quick-create--compartment-results--element>.option:hover{color:#2a4265}.ibo-activity-entry--main-information-content a:active,.ibo-activity-entry--main-information-content .ibo-quick-create--compartment-results--element>.option:hover:active,.ibo-activity-entry--main-information-content a:focus,.ibo-activity-entry--main-information-content .ibo-quick-create--compartment-results--element>.option:hover:focus{color:#2a4265}.ibo-activity-entry--sub-information{margin-top:4px;text-align:left;color:#6e7a8a}.ibo-activity-entry--sub-information>*:not(:last-child):after{content:" ";display:inline-block;vertical-align:middle;margin-left:0.5rem;margin-right:0.5rem;width:4px;height:4px;border-radius:100%;background-color:#929fb1}.ibo-activity-panel--load-more-entries-container{position:relative}.ibo-activity-panel--load-more-entries-container:hover .ibo-activity-panel--load-all-entries{margin-left:84px}.ibo-activity-panel--load-more-entries-container:not(:hover) .ibo-activity-panel--load-all-entries{visibility:hidden}.ibo-activity-panel--load-entries-button{width:32px;height:32px;border-radius:100%;background-color:#e1e7ec;border:1px solid #ccd4db}.ibo-activity-panel--load-more-entries{z-index:1}.ibo-activity-panel--load-all-entries{position:absolute;z-index:0;top:0;margin-left:0;transition:all 0.1s ease-in-out}.ibo-caselog-entry{}.ibo-caselog-entry .ibo-activity-entry--main-information{padding-top:12px;padding-bottom:12px}.ibo-caselog-entry .ibo-activity-entry--main-information-icon{display:none}.ibo-caselog-entry .ibo-activity-entry--main-information::before{content:"";position:absolute;top:0;bottom:0;width:3px}.ibo-caselog-entry:not(.ibo-is-current-user) .ibo-activity-entry--main-information::before{left:0;border-top-left-radius:5px;border-bottom-left-radius:5px}.ibo-caselog-entry:not(.ibo-is-current-user):last-child .ibo-activity-entry--main-information::before{border-bottom-left-radius:0}.ibo-caselog-entry.ibo-is-current-user .ibo-activity-entry--main-information::before{right:0;border-top-right-radius:5px;border-bottom-right-radius:5px}.ibo-caselog-entry.ibo-is-current-user:last-child .ibo-activity-entry--main-information::before{border-bottom-right-radius:0}.ibo-caselog-entry.ibo-is-closed.ibo-is-current-user .ibo-activity-entry--main-information::after{width:calc(100% - 3px)}.ibo-caselog-entry.ibo-is-closed:not(.ibo-is-current-user) .ibo-activity-entry--main-information::after{margin-left:3px}.ibo-caselog-entry--entry-for-caselog-1 .ibo-activity-entry--main-information::before{background-color:#689f38}.ibo-caselog-entry--entry-for-caselog-2 .ibo-activity-entry--main-information::before{background-color:#b83280}.ibo-caselog-entry--entry-for-caselog-3 .ibo-activity-entry--main-information::before{background-color:#f6ae55}.ibo-caselog-entry--entry-for-caselog-4 .ibo-activity-entry--main-information::before{background-color:#3182ce}.ibo-caselog-entry--entry-for-caselog-5 .ibo-activity-entry--main-information::before{background-color:#80deea}.ibo-caselog-entry--entry-for-caselog-6 .ibo-activity-entry--main-information::before{background-color:#c5e1a5}.ibo-caselog-entry--entry-for-caselog-7 .ibo-activity-entry--main-information::before{background-color:#fbb6ce}.ibo-transition-entry--original-state-label{color:#404b5a;text-decoration:line-through}a.ibo-edits-entry--short-description,.ibo-quick-create--compartment-results--element>.ibo-edits-entry--short-description.option:hover{position:relative;display:block;color:inherit}.ibo-edits-entry--long-description-toggler-icon{position:absolute;top:3px;right:0;transition:all 0.2s ease-in-out}.ibo-edits-entry--long-description{display:none;margin-top:8px;list-style:inside}.ibo-edits-entry:not(.ibo-is-closed) .ibo-edits-entry--long-description-toggler-icon{transform:rotateX(180deg)}.ibo-edits-entry:not(.ibo-is-closed) .ibo-edits-entry--long-description{display:block}a.ibo-notification-entry--short-description,.ibo-quick-create--compartment-results--element>.ibo-notification-entry--short-description.option:hover{color:inherit}.ibo-notification-entry--long-description-toggler-icon{margin-left:12px;transition:all 0.2s ease-in-out}.ibo-notification-entry--long-description{display:none;margin-top:8px;list-style:inside}.ibo-notification-entry:not(.ibo-is-closed) .ibo-notification-entry--long-description-toggler-icon{transform:rotateX(180deg)}.ibo-notification-entry:not(.ibo-is-closed) .ibo-notification-entry--long-description{display:block}.ibo-bulk--bulk-modify--incompatible-attribute:before{margin-right:4px;content:"";color:#429ae1}#form_part_csv_options:has(#ibo-sanitize-excel-export--input:checked) #ibo-sanitize-excel-export--alert,#form_part_xlsx_options:has(#ibo-sanitize-excel-export--input:checked) #ibo-sanitize-excel-export--alert{display:none}.ibo-block-csv textarea{width:100%;min-height:10em;margin-top:10px}.ibo-block-list--empty-text,.ibo-block-list--create-action{text-align:center}.ibo-block-list--create-icon{margin-right:0.5rem}.ibo-linked-set--bulk-tooltip-info:before{margin-right:4px;content:"";color:#429ae1}.ibo-table-preview{margin-top:20px;overflow-x:auto}.ibo-table-preview th{position:relative;padding:4px 24px 4px 4px;border-width:1px 1px 0;border-style:groove groove none;background:#f2f2f2}.ibo-table-preview td{padding-right:4px;padding-left:4px;border-width:0 1px;border-style:none groove}.ibo-table-preview tr:last-child td{border-bottom-width:1px;border-bottom-style:groove}.ibo-preview-header{margin-bottom:4px}.ibo-table-preview--remove-column{position:absolute;top:8px;right:8px;display:inline-block;cursor:pointer;font-size:8px}#form_part_interactive_fields_xlsx,#form_part_interactive_fields_csv,#form_part_interactive_fields_pdf{margin-top:24px}.ibo-welcome-popup--dialog.ui-dialog-content{padding:0 0;height:auto !important;max-height:80vh !important}.ibo-welcome-popup--messages-stack{min-width:300px;max-width:300px;padding:24px 16px;overflow-y:auto;background-color:#f8f9fa}.ibo-welcome-popup--messages-stack>*:not(:first-child){margin-top:12px}.ibo-welcome-popup--stack-item{padding:12px 16px;background-color:white;border:1px solid #d5dde5}.ibo-welcome-popup--stack-item.ibo-is-active{border-color:#929fb1}.ibo-welcome-popup--stack-item.ibo-is-acknowledged{opacity:0.6}.ibo-welcome-popup--stack-item.ibo-is-acknowledged.ibo-is-active{opacity:1}.ibo-welcome-popup--stack-item-icon{width:32px;height:32px;min-width:32px;min-height:32px;margin-right:12px;border-width:1px}.ibo-welcome-popup--message-content-wrapper{overflow:auto}.ibo-welcome-popup--message-content{display:flex;justify-content:space-between;align-items:center;padding:32px 48px}.ibo-welcome-popup--message-content .ibo-welcome-popup--message-illustration{margin-left:48px}.ibo-welcome-popup--message-content:not(.ibo-is-active){display:none}.ibo-welcome-popup--message-content.ibo-is-illustration-on-left-side{flex-direction:row-reverse}.ibo-welcome-popup--message-content.ibo-is-illustration-on-left-side .ibo-welcome-popup--message-illustration{margin-left:unset;margin-right:48px}.ibo-welcome-popup--message-title{margin-bottom:32px}.ibo-welcome-popup--message-illustration{display:flex;min-width:256px;aspect-ratio:1;background-size:contain}.ibo-welcome-popup--message-illustration>svg{height:auto}.ibo-user-rights{padding:4px 12px;border-radius:4px}.ibo-user-rights.ibo-is-success{background-color:#dcedc8;color:#235816;border:1px solid #8ac34a}.ibo-user-rights.ibo-is-failure{background-color:#fce8e8;color:#491d1d;border:1px solid #f56565}:root{--ibo-dm-class--User--main-color: #546e7a;--ibo-dm-class--User--complementary-color: white}.ibo-dm-class--User{--ibo-main-color: #546e7a;--ibo-main-color--100: #eaeef0;--ibo-main-color--900: #1f292d;--ibo-complementary-color: white}.ibo-dm-class-alt--User{--ibo-main-color: white;--ibo-complementary-color: #546e7a}:root{--ibo-dm-enum--User-status-enabled--main-color: #689f38;--ibo-dm-enum--User-status-enabled--complementary-color: white}.ibo-dm-enum--User-status-enabled{--ibo-main-color: #689f38;--ibo-main-color--100: #edf6e5;--ibo-main-color--900: #253914;--ibo-complementary-color: white}.ibo-dm-enum-alt--User-status-enabled{--ibo-main-color: white;--ibo-complementary-color: #689f38}:root{--ibo-dm-enum--User-status-disabled--main-color: #f6ae55;--ibo-dm-enum--User-status-disabled--complementary-color: white}.ibo-dm-enum--User-status-disabled{--ibo-main-color: #f6ae55;--ibo-main-color--100: #fdefdd;--ibo-main-color--900: #492a04;--ibo-complementary-color: white}.ibo-dm-enum-alt--User-status-disabled{--ibo-main-color: white;--ibo-complementary-color: #f6ae55}:root{--ibo-dm-class--Action--main-color: #546e7a;--ibo-dm-class--Action--complementary-color: white}.ibo-dm-class--Action{--ibo-main-color: #546e7a;--ibo-main-color--100: #eaeef0;--ibo-main-color--900: #1f292d;--ibo-complementary-color: white}.ibo-dm-class-alt--Action{--ibo-main-color: white;--ibo-complementary-color: #546e7a}:root{--ibo-dm-enum--Action-status-enabled--main-color: #689f38;--ibo-dm-enum--Action-status-enabled--complementary-color: white}.ibo-dm-enum--Action-status-enabled{--ibo-main-color: #689f38;--ibo-main-color--100: #edf6e5;--ibo-main-color--900: #253914;--ibo-complementary-color: white}.ibo-dm-enum-alt--Action-status-enabled{--ibo-main-color: white;--ibo-complementary-color: #689f38}:root{--ibo-dm-enum--Action-status-disabled--main-color: #e1e7ec;--ibo-dm-enum--Action-status-disabled--complementary-color: #6e7a8a}.ibo-dm-enum--Action-status-disabled{--ibo-main-color: #e1e7ec;--ibo-main-color--100: #e9eef1;--ibo-main-color--900: #1e272f;--ibo-complementary-color: #6e7a8a}.ibo-dm-enum-alt--Action-status-disabled{--ibo-main-color: #6e7a8a;--ibo-complementary-color: #e1e7ec}:root{--ibo-dm-enum--Action-status-test--main-color: #f6ae55;--ibo-dm-enum--Action-status-test--complementary-color: white}.ibo-dm-enum--Action-status-test{--ibo-main-color: #f6ae55;--ibo-main-color--100: #fdefdd;--ibo-main-color--900: #492a04;--ibo-complementary-color: white}.ibo-dm-enum-alt--Action-status-test{--ibo-main-color: white;--ibo-complementary-color: #f6ae55}.ibo-about-box--top-part{display:flex;flex-direction:row;align-content:center}.ibo-about-box--top-part>div{padding:16px 12px;margin:auto auto;width:50%}:root{--ibo-body-text-color: #212934;--ibo-body-background-color: #f2f2f2}html{height:100vh}body{display:flex;height:100vh;color:var(--ibo-body-text-color);background-color:var(--ibo-body-background-color)}#ibo-navigation-menu{z-index:20}#ibo-page-container{position:relative;z-index:10;height:100%;overflow:auto;flex-grow:1;display:flex;flex-direction:column}#ibo-top-bar,#ibo-main-content{padding-left:36px;padding-right:36px}#ibo-top-container{z-index:20;position:sticky;top:0;left:0;right:0}#ibo-center-container{position:relative;z-index:10;flex-grow:1;overflow:hidden}#ibo-center-container>*{height:100%}#ibo-main-content{padding-top:16px;padding-bottom:16px;overflow:auto}#ibo-main-content>.ibo-panel{margin-left:auto;margin-right:auto}.ibo-preferences--user-preferences--picture-placeholder{display:flex;flex-direction:row;flex-wrap:wrap}.ibo-preferences--user-preferences--picture-placeholder--image{height:54px;width:54px;border-radius:100%;margin:12px;border:solid 3px #d5dde5}.ibo-preferences--user-preferences--picture-placeholder--image>img{border-radius:100%;background-color:#d5dde5}.ibo-preferences--user-preferences--picture-placeholder--image.ibo-is-active{border-color:#2c5382}.ibo-preferences--user-preferences--picture-placeholder--image:hover{border-color:#3182ce}#ibo-form-for-user-interface-preferences>.ibo-keyboard-shortcut--shortcut{display:table;width:100%}#ibo-form-for-user-interface-preferences>.ibo-keyboard-shortcut--shortcut>*:not(.ibo-button){width:30%;display:table-cell}.ibo-keyboard-shortcut--input,.ibo-keyboard-shortcut--input:focus{display:inline-block;width:auto;text-transform:capitalize;text-align:center;color:#404b5a;background-color:transparent;border:1px solid #aebecd;border-bottom:2px solid #aebecd;border-radius:3px;padding:2px 4px;margin-bottom:5px}.ibo-keyboard-shortcut--input.ibo-is-focus,.ibo-keyboard-shortcut--input:focus.ibo-is-focus{text-transform:none;color:#9c4221;border-color:#dd6c20}#ibo-favorite-organizations .ibo-toolbar{float:right;vertical-align:top}#ibo-favorite-organizations .ibo-datatable--toolbar{padding-top:3px}#ibo-attachment--upload-file .ibo-input-file-select--container{display:inline-block}.ibo-attachment--datatable--icon-preview{max-height:44px;max-width:44px}.ibo-attachment--datatable tbody tr td{vertical-align:middle}.ibo-attachment--upload-file--drop-zone-hint{display:none}.ibo-drag-in{border:2px #ccd4db dashed}.ibo-drag-in .ibo-attachment--upload-file--drop-zone-hint{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%;max-height:200px;margin:22px 0;color:#6e7a8a}.ibo-drag-in .ibo-attachment--upload-file--drop-zone-hint>svg{margin-bottom:5px}.ibo-drag-in #ibo-attachment--upload-file--upload-button-container{display:none}.ibo-tab-container--tab-header.ibo-drag-in,.ibo-drag-in.ibo-tab-container--extra-tabs-container{border:none;background-color:#bee3f8;color:#2c5382}.ibo-tab-container--tab-header.ibo-drag-in>a::after,.ibo-drag-in.ibo-tab-container--extra-tabs-container>a::after,.ibo-quick-create--compartment-results--element.ibo-tab-container--tab-header>.option:hover::after,.ibo-quick-create--compartment-results--element.ibo-drag-in>.option:hover::after{content:"";padding-left:8px;color:#3182ce}.itop-simple-graph{margin-top:10px;border:1px dotted transparent;border-radius:5px}.itop-simple-graph.ibo-has-focus{border:1px dotted #404b5a}.graph_zoom{display:flex;float:right;align-items:center}.graph_zoom_slider{height:1.1em;display:inline-block;width:10em}.graph_zoom_plus,.graph_zoom_minus{cursor:pointer;display:inline-block;margin-left:0.5em;margin-right:0.5em}.graph_config{display:flex;align-items:center;flex-wrap:wrap}.graph_config .toolkit_menu.graph>ul>li{position:relative}.graph_config .toolkit_menu.graph>ul>li ul{z-index:1;position:absolute;display:none}.graph_separator{flex-grow:1}.ibo-simple-graph--grouping-threshold--container,.ibo-simple-graph--additional-context--container{margin-right:0.3em;display:flex;align-items:center}.ibo-simple-graph--grouping-threshold--container>*,.ibo-simple-graph--additional-context--container>*{margin-right:1em}#graph_grouping_threshold{width:auto;padding-right:0}.ibo-display-graph--search-box .sf_criterion_area{display:flex;flex-direction:column}.ibo-display-graph--search-box .sf_criterion_row{display:flex;flex-wrap:wrap;align-items:center}.ibo-display-graph--search-box .sf_criterion_row>div{align-items:center;display:flex;padding:0 15px}.ibo-display-graph--search-box .sf_criterion_row>div>input{margin-right:10px}.ibo-display-graph--search-box .sf_criterion_row>div .ibo-medallion-icon{display:flex;align-items:center}.ibo-display-graph--search-box #ReloadMovieBtn{align-self:flex-end}#impacted_objects_lists>div~div{margin-top:24px}#impacted_objects_lists_placeholder,#impacted_groups_placeholder{height:256px}.ibo-audit--audit-category--panel .ibo-panel--body tr.ibo-is-red td:last-of-type:before{background-color:#c53030}.ibo-audit--audit-category--panel .ibo-panel--body tr.ibo-is-orange td:last-of-type:before{background-color:#c05621}.ibo-audit--audit-category--panel .ibo-panel--body tr.ibo-is-green td:last-of-type:before{background-color:#558b2f}.ibo-audit--audit-category--panel .ibo-panel--body{padding:10px 16px}.ibo-audit--audit-category--panel .ibo-panel--body .ibo-datatable td:not(:nth-child(1)),.ibo-audit--audit-category--panel .ibo-panel--body .ibo-datatable th:not(:nth-child(1)){text-align:right;width:100px}.ibo-audit--audit-category--panel .ibo-panel--body .ibo-datatable--toolbar{display:none}.ibo-audit--audit-category--panel .ibo-panel--body tr td:last-of-type:before{content:"";height:12px;width:12px;border-radius:100%;display:inline-block;margin-right:5px;vertical-align:middle}.ibo-audit--dashboard{padding:18px 0}.ibo-dashboard--grid-row+.ibo-audit--error-alert{margin-top:24px}.ibo-audit--audit-line--csv-download{height:2.5em;vertical-align:middle}.ibo-data-synchro-source--replicas-status.ibo-is-grey{color:#212934;background-color:#ccd4db}.ibo-data-synchro-source--replicas-status.ibo-is-orange{color:#7b341e;background-color:#fbd38d}.ibo-data-synchro-source--replicas-status.ibo-is-bluegrey{color:#263238;background-color:#b0bec5}.ibo-data-synchro-source--replicas-status.ibo-is-red{color:#742a2a;background-color:#feb2b2}.ibo-data-synchro-source--replicas-status.ibo-is-blue{color:#2a4265;background-color:#bee3f8}.ibo-data-synchro-source--replicas-status.ibo-is-green{color:#33691e;background-color:#dcedc8}.ibo-data-synchro-source--replicas-status.ibo-is-cyan{color:#006164;background-color:#c9eef2}.ibo-data-synchro-source--replicas-status-separator{border-top:white}.ibo-data-synchro-source--replicas-status.ibo-is-light{opacity:0.5}.ibo-data-synchro-source--replicas-status.ibo-is-light:hover{opacity:1}.synoptics tr td{padding:10px;min-width:200px;vertical-align:middle;text-align:center}.synoptics tr td.arrow{min-width:100px;border-top:2px solid #fcfcfd}.ibo-data-synchro-source--replicas-status--warning{margin:0 5px 0 8px}.ibo-datamodel-viewer--parent--spacer{padding:0 8px}.ibo-datamodel-viewer--classes-list .selectize-input,.ibo-datamodel-viewer--classes-list .ibo-quick-create--input.selectize-control.single .selectize-input.input-active,.ibo-quick-create--input.selectize-control.single .ibo-datamodel-viewer--classes-list .selectize-input.input-active{background-color:white !important;background-image:none !important;color:#404b5a;box-shadow:none !important;border-color:#aebecd !important}#ibo-datamodel-viewer--attributes-table>tbody tr td:first-child{width:3px}.ibo-datamodel-viewer--origin-cell{vertical-align:middle}.ibo-datamodel-viewer--origin-cell>div{height:8px;width:8px;border-radius:100%}.ibo-datamodel-viewer--classes-list{position:relative;height:100%;width:350px;padding-left:24px;overflow-y:scroll}.ibo-datamodel-viewer--lifecycle--code{color:#6e7a8a}.ibo-datamodel-viewer--lifecycle--stimuli{color:#2a4265}.ibo-datamodel-viewer--lifecycle--attribute-option{color:#702459}.dataModelSchema g{cursor:pointer}.dataModelSchema g:hover rect:not(.liseret){fill:#ccd4db}.dataModelSchema text{fill:#212934;text-anchor:middle}#selfreferencing:hover~g>.selfattr{fill:#ccd4db}.tooltipD3{position:fixed;text-align:center;background:white;border:1px solid #6e7a8a;border-radius:3px;pointer-events:none;fill:#212934;text-anchor:middle}.tooltipD3 i{font-size:1rem}.tooltipD3 span{margin:3px}#tooltipD3_top{border-bottom:1px solid #6e7a8a;padding:3px}.ibo-datamodel-viewer--lifecycle-image{margin-bottom:16px}#tabs1-import .ibo-field--label{max-width:50%}div.ibo-csv-import--cell-modified{font-weight:bold;color:#2b6bb0}div.ibo-csv-import--cell-error{font-weight:bold;color:#c53030}div.ibo-csv-import--cell-message{padding-top:3px}tr.ibo-csv-import--row-unchanged td{border-bottom:1px #ccd4db solid}.wizContainer table tr.ibo-csv-import--row-error td{border-bottom:1px #ccd4db solid;background-color:#fed7d7}tr.ibo-csv-import--row-modified td{border-bottom:1px #ccd4db solid}tr.ibo-csv-import--row-added td{border-bottom:1px #ccd4db solid}.ibo-csv-import--download-file{font-size:4em;color:#f6ae55;margin:20px}.ibo-global-search--result--title>img{max-height:48px;max-width:48px;margin-right:8px}.ibo-run-query--highlight{background-color:#fbd38d}.ibo-oauth-wizard .ibo-panel--body .ibo-oauth-wizard--form--container{display:flex;flex-direction:row;flex-grow:1}.ibo-oauth-wizard .ibo-panel--body .ibo-oauth-wizard--illustration svg{max-height:384px}#ibo-oauth-wizard--conf--result{white-space:pre-wrap}.ibo-notifications--view-all--container{display:grid;grid-gap:24px}.ibo-notifications--view-all--container .ibo-object-summary .ibo-panel--title{font-size:1.5rem}.ibo-notifications--view-all--container .ibo-object-summary .ibo-panel--toolbar{min-width:96px}.ibo-notifications--view-all--container .ibo-object-summary>.ibo-panel--body{box-shadow:none;max-height:400px}.ibo-notifications--view-all--container .ibo-object-summary+.ibo-object-summary{margin-top:0}@media screen and (max-width:768px){.ibo-notifications--view-all--container{grid-template-columns:repeat(1, 1fr)}}@media screen and (min-width:1024px){.ibo-notifications--view-all--container{grid-template-columns:repeat(2, 1fr)}}@media screen and (min-width:1408px){.ibo-notifications--view-all--container{grid-template-columns:repeat(3, 1fr)}}.ibo-notifications--view-all--toolbar{justify-content:space-between}.ibo-notifications--view-all--toggler{display:flex;align-content:center}.ibo-notifications--view-all--item--read .ibo-panel--body::before{background-color:#e1e7ec}.ibo-notifications--view-all--item--unread .ibo-panel--body::before{background-color:#e53e3e}.ibo-notifications--view-all--container .ibo-notifications--view-all--read-action,.ibo-notifications--view-all--container .ibo-notifications--view-all--unread-action{margin-left:0 !important}.ibo-notifications--view-all--item--read .ibo-notifications--view-all--read-action{display:none}.ibo-notifications--view-all--item--unread .ibo-notifications--view-all--unread-action{display:none}.ibo-notifications--view-all--empty{flex-direction:column;margin-top:96px}.ibo-notifications--view-all--empty svg{max-width:30%;height:auto}.ibo-input-select--notification-item{display:flex !important;flex-direction:row}.ibo-input-select--notification-item--mixed-value{font-size:1rem;color:#9c4221;margin-left:4px}.ibo-alert+.ibo-alert{margin-top:4px}.ibo-alert+.ibo-block:not(.ibo-alert){margin-top:16px}.ibo-button+.ibo-button,.ui-dialog .ui-button+.ibo-button,.ui-dialog .ui-button+.ui-button,.ui-dialog .ui-button+.ui-datepicker-current,.ui-dialog .ui-button+.ui-datepicker-close,.ui-datepicker-current+.ibo-button,.ui-dialog .ui-datepicker-current+.ui-button,.ui-datepicker-current+.ui-datepicker-current,.ui-datepicker-current+.ui-datepicker-close,.ui-datepicker-close+.ibo-button,.ui-dialog .ui-datepicker-close+.ui-button,.ui-datepicker-close+.ui-datepicker-current,.ui-datepicker-close+.ui-datepicker-close,.ui-dialog .ibo-button+.ui-button,.ibo-button+.ui-datepicker-current,.ibo-button+.ui-datepicker-close{margin-left:4px}.ibo-button-group+.ibo-button-group,.ibo-button+.ibo-button-group,.ui-dialog .ui-button+.ibo-button-group,.ui-datepicker-current+.ibo-button-group,.ui-datepicker-close+.ibo-button-group,.ibo-button-group+.ibo-button,.ui-dialog .ibo-button-group+.ui-button,.ibo-button-group+.ui-datepicker-current,.ibo-button-group+.ui-datepicker-close{margin-left:4px}.ibo-collapsible-section+.ibo-collapsible-section{margin-top:12px}.ibo-collapsible-section+.ibo-block:not(.ibo-collapsible-section){margin-top:16px}.ibo-caselog-list .ibo-collapsible-section{margin:0;min-width:22em}.ibo-caselog-list .ibo-collapsible-section .ibo-collapsible-section--body{color:#212934;padding:8px;background-color:rgba(248, 249, 250, 0.5)}.ibo-alert--body .ibo-collapsible-section .ibo-collapsible-section--body{color:#212934;padding:8px}.ibo-alert--body>*+.ibo-collapsible-section{margin-top:8px}.ibo-datatable+.ibo-block{margin-top:4px}.ibo-panel .ibo-panel--body .ibo-datatable{width:100%}.display_block+.display_block{margin-top:24px}.display_block+.ibo-block:not(.display_block){margin-top:16px}.ibo-field+.ibo-field:not(:empty){margin-top:16px}.form_field+.form_field{margin-top:16px}.ibo-fieldset+.ibo-field,fieldset+.ibo-field{margin-top:32px}.ibo-field+.ibo-fieldset:not(.ibo-column),.ibo-field+fieldset:not(.ibo-column){margin-top:32px}.ibo-fieldset+.ibo-fieldset:not(.ibo-column),fieldset+.ibo-fieldset:not(.ibo-column),.ibo-fieldset+fieldset:not(.ibo-column){margin-top:48px}.ibo-multi-column+.ibo-fieldset,.ibo-multi-column+fieldset{margin-top:48px}.ibo-form+.ibo-form{margin-top:24px}select+label,label+select,label>select,input+label,label+input,label>input{margin-left:8px}.ibo-datatable .attribute-set .attribute-set-item{display:inline;margin:0;padding:4px 6px;box-shadow:0 1px 2px rgba(0, 0, 0, 0.25), 0 1px 3px rgba(0, 0, 0, 0.12)}.ibo-datatable .attribute-set .attribute-set-item+.attribute-set-item{margin-left:0.5rem}.ibo-object-details.ibo-has-medallion-icon>.ibo-panel--body>.ibo-tab-container:not(.ibo-is-vertical)>.ibo-tab-container--tabs-list{padding-left:calc(32px + 96px + 32px - 24px)}.tippy-box[data-theme~="object-summary"]{background-color:rgba(255, 255, 255, 0);color:#212934}.tippy-box[data-theme~="object-summary"] .tippy-arrow{display:none}.ibo-panel+.ibo-panel{margin-top:24px}.ibo-panel+.ibo-block:not(.ibo-panel){margin-top:16px}#ibo-main-content{}#ibo-main-content .ibo-panel.ibo-has-sticky-header{margin-bottom:200px}#ibo-main-content .ibo-panel.ibo-has-sticky-header>.ibo-sticky-sentinel-top{top:-16px;height:16px}#ibo-main-content .ibo-panel.ibo-has-sticky-header>.ibo-panel--header.ibo-is-sticking,#ibo-main-content .ibo-panel.ibo-has-sticky-header>.ibo-is-sticking.ibo-object-summary--header{top:-16px}.ui-dialog-content{}.ui-dialog-content .ibo-panel.ibo-has-sticky-header{}.ui-dialog-content .ibo-panel.ibo-has-sticky-header>.ibo-sticky-sentinel-top{top:-16px;height:16px}.ui-dialog-content .ibo-panel.ibo-has-sticky-header>.ibo-panel--header.ibo-is-sticking,.ui-dialog-content .ibo-panel.ibo-has-sticky-header>.ibo-is-sticking.ibo-object-summary--header{top:-16px}.ibo-pill:not(:last-child){margin-right:16px}.ibo-dashboard--grid-row .ibo-dashlet-header-static{margin-top:12px}.ibo-dashboard--grid-row:first-child .ibo-dashlet:first-child .ibo-dashlet-header-static{margin-top:0}.ibo-details .ibo-prop--apply>span,.ibo-details .ibo-prop--cancel>span{display:unset}.ibo-details .ibo-prop--apply{display:table-column}.ibo-activity-panel--tab-entry-form .ibo-caselog-entry-form{padding-bottom:14px;border-bottom:1px solid #aebecd}.ibo-panel{}.ibo-panel>.ibo-panel--body>.ibo-tab-container{margin-top:-24px;margin-left:-16px;margin-right:-16px;margin-bottom:-24px}.ibo-panel>.ibo-panel--body>.ibo-tab-container>.ibo-tab-container--tab-container-list{height:100%;overflow-y:auto;flex-grow:1}.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical{display:flex;flex-direction:row}.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tabs-list{padding-top:48px;flex-direction:column;height:auto;padding-left:unset;margin-right:unset;min-width:calc(32px + 90px + 32px)}.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tabs-list>.ibo-tab-container--tab-header,.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tabs-list>.ibo-tab-container--extra-tabs-container{height:48px;width:100%;justify-content:left}.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tabs-list>.ibo-tab-container--tab-header>.ibo-tab-container--tab-toggler,.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tabs-list>.ibo-tab-container--extra-tabs-container>.ibo-tab-container--tab-toggler,.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tabs-list>.ibo-tab-container--tab-header>.ibo-tab-container--extra-tabs-list-toggler,.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tabs-list>.ibo-tab-container--extra-tabs-container>.ibo-tab-container--extra-tabs-list-toggler{width:100%;justify-content:left}.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tab-container{flex-grow:1;margin-left:unset}.ibo-panel.ibo-has-sticky-header>.ibo-panel--body>.ibo-tab-container>.ibo-tab-container--tabs-list.ibo-is-sticking{position:fixed;z-index:10}.ibo-panel.ibo-has-sticky-header>.ibo-panel--body>.ibo-tab-container:not(.ibo-is-vertical)>.ibo-tab-container--tabs-list.ibo-is-sticking{padding-left:0}.ibo-panel.ibo-has-sticky-header>.ibo-panel--body>.ibo-tab-container:not(.ibo-is-vertical)>.ibo-tab-container--tabs-list.ibo-is-sticking .ibo-tab-container--tab-toggler,.ibo-panel.ibo-has-sticky-header>.ibo-panel--body>.ibo-tab-container:not(.ibo-is-vertical)>.ibo-tab-container--tabs-list.ibo-is-sticking .ibo-tab-container--extra-tabs-list-toggler,.ibo-panel.ibo-has-sticky-header>.ibo-panel--body>.ibo-tab-container:not(.ibo-is-vertical)>.ibo-tab-container--tabs-list.ibo-is-sticking .ibo-tab-container--extra-tabs-list-toggler{font-size:1rem}.ibo-block-list--medallion{flex-direction:column;align-items:center}.ibo-block-list--medallion>.ibo-medallion-icon--image{margin:0 auto}.ibo-block-list--medallion>.ibo-medallion-icon--image~.ibo-medallion-icon--description{margin-top:12px}.ibo-block-list--medallion>.ibo-medallion-icon--description{flex-grow:1;text-align:center}.ibo-datatable .ibo-field-badge{margin:0;padding:0;color:unset;background-color:unset}.ibo-datatable .ibo-field-badge::before{content:"";display:inline-flex;margin-right:0.5rem;width:10px;height:10px;min-width:10px;min-height:10px;background-color:var(--ibo-main-color)}.ibo-datatable .ibo-field-badge .ibo-field-badge--decoration{display:none}.ibo-datatable .ibo-field-badge .ibo-field-badge--decoration+.ibo-field-badge--label{margin-left:unset}.ui-dialog .blockUI.blockOverlay{background-color:white}.ibo-datatable .blockUI.blockOverlay{background-color:white}.ibo-datatable .blockUI.blockMsg{font-size:2em}.ibo-svg-illustration--container>svg *[fill="#6c63ff"]{fill:#ea7d1e}.ibo-navigation-menu.ibo-is-active .ibo-navigation-menu--drawer{transform:translate3d(0, 0, 0)}.switch{position:relative;display:inline-block;width:36px;height:20px;vertical-align:baseline}.switch input{display:none}.slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#929fb1;transition:0.4s}.slider:before{position:absolute;content:"";height:15px;width:15px;left:3px;bottom:3px;background-color:#d5dde5;transition:0.4s}input:checked+.slider{background-color:#dd6c20}input:focus+.slider{box-shadow:0 0 1px #dd6c20}input:checked+.slider:before{transform:translateX(14.5px)}.slider.round{border-radius:20px}.slider.round:before{border-radius:7px}.ibo-is-html-content blockquote{color:#212934}.center{text-align:center}.hidden{display:none}@keyframes progress_bar_color_ongoing{from{background-color:#FBD38D}to{background-color:#FEEBC8}}@-webkit-keyframes bg-pan-left{0%{background-position:100% 50%}100%{background-position:0 50%}}@keyframes bg-pan-left{0%{background-position:100% 50%}100%{background-position:0 50%}}body{display:flex;flex-direction:column;background-color:#f8f9fa;color:#212934;margin:0;padding:0;font-size:10pt;font-family:Tahoma, Verdana, Arial, Helvetica, serif;overflow-y:auto}h1{color:#555555;font-size:16pt}h2{color:#212934;font-size:14pt;font-weight:normal}h3{color:#1C94C4;font-size:12pt;font-weight:bold}a,.ibo-quick-create--compartment-results--element>.option:hover{color:#1c94c4;text-decoration:none}a:hover,.ibo-quick-create--compartment-results--element>.option:hover{color:#EA7D1E}.itop-setup--message{margin-top:16px}.next{width:100%;text-align:right}.v-spacer{padding-top:1em}button{margin-top:1em;padding-left:1em;padding-right:1em}p.info{padding-left:50px;background:url(../images/info-mid.png) no-repeat left -5px;min-height:48px}p.ok{padding-left:50px;background:url(../images/clean-mid.png) no-repeat left -8px;min-height:48px}p.warning{padding-left:50px;background:url(../images/messagebox_warning-mid.png) no-repeat left -5px;min-height:48px}p.error{padding-left:50px;background:url(../images/stop-mid.png) no-repeat left -5px;min-height:48px}label{cursor:pointer}td.label{text-align:left}label.read-only{color:#666;cursor:text}td.input{text-align:left}table.formTable{border:0}.wizlabel,.wizinput{color:#000;font-size:10pt}.wizhelp{color:#333;font-size:8pt}#progress{border:none;width:210px;height:26px;line-height:26px;text-align:center;margin:5px;box-shadow:inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important;border-radius:2px;background-color:#EDF2F7 !important}#progress .progress{color:#000000 !important;background-image:linear-gradient(270deg, #FBD38D 50%, #FEEBC8 55%, #FBD38D 80%) !important;animation:bg-pan-left 3s infinite both;background-size:600% 100%;border-radius:inherit}#progress .progress.progress-error{background-image:none !important;background-color:#F56565 !important;animation:none}h3.clickable{background:url(../images/plus.gif) no-repeat left;padding-left:16px;cursor:hand}h3.clickable.open{background:url(../images/minus.gif) no-repeat left;padding-left:16px;cursor:hand}.message{color:#1A202C;background-color:#F7FAFC;border-left:4px solid #4A5568;padding:10px;font-size:initial}.message>.message-title{font-weight:bold;margin-right:5px}.message.message-valid{color:#276749;background-color:#F0FFF4;border-color:#48BB78}.message.message-warning{color:#C05621;background-color:#FFFAF0;border-color:#ED8936}.message.message-error{color:#C53030;background-color:#FFF5F5;border-color:#E53E3E}*:not(.message)+.message{margin-top:6px}.text-valid{color:#276749}.text-warning{color:#C05621}.text-error{color:#C53030}fieldset{border:none;padding:0;margin:15px 0 0 0}fieldset>legend{margin-bottom:7px;padding-bottom:7px;width:100%;color:#3C3C3C;font-size:11pt;font-weight:bold;border-bottom:1px solid #D2D2D2}.module-selection-banner img{max-height:48px}.module-selection-body{overflow:auto;box-shadow:inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important;background-color:#F7FAFC;padding:10px}.module-selection-body .wiz-choice:checked~.description #itop-ticket-mgmt-simple-ticket-enhanced-portal:not(:checked)~.description::after,.module-selection-body .wiz-choice:checked~.description #itop-ticket-mgmt-itil-enhanced-portal:not(:checked)~.description::after{content:"Legacy portal is no longer part of iTop, by leaving this option unchecked your portal users won't be able to access iTop anymore.";display:block;margin-top:0.5em;font-weight:bold;color:#e60000b8}.module-selection-body .wiz-choice:not(:checked)~label .setup-extension-tag.checked{display:none}.module-selection-body .wiz-choice:checked~label .setup-extension-tag.unchecked{display:none}body{font-size:1.17rem;font-family:"Raleway"}#ibo_setup_container{width:800px;margin-left:auto;margin-right:auto;height:100%;display:flex;flex-direction:column;padding:20px 0}#ibo_setup_container pre{white-space:pre-wrap}#ibo_setup_container .ibo-title h2{margin-bottom:15px}#ibo_setup_container .ibo-setup--header{background-color:#fff;padding:0 20px;border:3px solid #ccd4db;height:80px;border-bottom:none;border-radius:3px 3px 0 0}#ibo_setup_container .ibo-setup--header .ibo-title--icon{border:0;vertical-align:middle;margin-right:20px}#ibo_setup_container .ibo-setup--body{display:flex;flex-direction:column;background-color:#fff;padding:20px;border:3px solid #ccd4db;border-top:none;flex-grow:1;overflow:auto;border-radius:0 0 3px 3px}#ibo_setup_container .ibo-setup--body .ibo-setup--wizard{width:100%;display:flex;flex-direction:column;height:100%}#ibo_setup_container .ibo-setup--body .ibo-setup--wizard .ibo-setup--wizard--content{overflow:auto}#ibo_setup_container .ibo-setup--body .ibo-setup--wizard .ibo-setup--wizard--buttons-container{margin-top:auto}#ibo_setup_container .ibo-setup--body .ibo-setup--wizard .ibo-setup--wizard--buttons-container tr{display:flex;justify-content:flex-end}#ibo_setup_container .ibo-setup--body .ibo-setup--wizard .ibo-setup--wizard--buttons-container button{margin-left:8px}#ibo_setup_container .ibo-setup--body .itop-setup--message{margin-top:16px}#ibo_setup_container .ibo-setup--body .ibo-setup--button-bar{margin-top:16px}#ibo_setup_container .ibo-setup--body .ibo-setup--button-bar .ibo-setup--button-spacer{flex-grow:1}#ibo_setup_container .ibo-setup--body .ibo-setup--js-error{overflow:auto;max-height:100px;color:#9b2c2c;font-size:1rem}#ibo_setup_container .ibo-setup--body .ibo-setup--upgrade-info{margin-top:5px}#ibo_setup_container .ibo-setup--body .ibo-fieldset,#ibo_setup_container .ibo-setup--body fieldset{margin-top:12px}#ibo_setup_container .ibo-setup--body .ibo-fieldset~.ibo-fieldset,#ibo_setup_container .ibo-setup--body fieldset~.ibo-fieldset,#ibo_setup_container .ibo-setup--body .ibo-fieldset~fieldset,#ibo_setup_container .ibo-setup--body fieldset~fieldset{margin-top:12px}#ibo_setup_container .ibo-setup--body .ibo-field{margin-top:5px}#ibo_setup_container .ibo-setup--body .ibo-setup--small-field-label .ibo-field--label{width:15%}#ibo_setup_container .ibo-setup--body .ibo-field--comments{font-size:1rem;color:#6e7a8a;text-align:left;width:100%;padding-left:10px}#ibo_setup_container .ibo-setup--body .ibo-alert{padding:7px 20px}#ibo_setup_container .ibo-setup--body .ibo-setup--small-message{font-size:1rem;color:#6e7a8a}#ibo_setup_container .ibo-setup--body .ibo-collapsible-section{margin:10px 0 0 0}#ibo_setup_container .ibo-setup--body .ibo-collapsible-section.ibo-setup--small .ibo-collapsible-section--header .ibo-collapsible-section--title{font-size:1.17rem;font-weight:400;color:#6e7a8a}#ibo_setup_container .ibo-setup--body .ibo-collapsible-section .ibo-collapsible-section--body{max-height:400px;overflow:auto}#ibo_setup_container .ibo-setup--body .ibo-input,#ibo_setup_container .ibo-setup--body .ui-autocomplete-input,#ibo_setup_container .ibo-setup--body .ui-multiselect,#ibo_setup_container .ibo-setup--body .dataTables_length select,.dataTables_length #ibo_setup_container .ibo-setup--body select,#ibo_setup_container .ibo-setup--body .ui_tpicker_hour_slider>select,#ibo_setup_container .ibo-setup--body .ui_tpicker_minute_slider>select,#ibo_setup_container .ibo-setup--body .ui_tpicker_second_slider>select,#ibo_setup_container .ibo-setup--body select.ibo-input-select-placeholder,#ibo_setup_container .ibo-setup--body .ibo-datatableconfig--attributes-panel--per-page--input,#ibo_setup_container .ibo-setup--body .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content #ibo_setup_container .ibo-setup--body input[type="text"],#ibo_setup_container .ibo-setup--body .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper #ibo_setup_container .ibo-setup--body input[type="text"]{width:auto;display:inline-block}#ibo_setup_container .ibo-setup--body table td{white-space:nowrap;line-height:2.5rem;padding-right:8px;padding-bottom:1rem}#ibo_setup_container .ibo-setup--body .setup-content-title,#ibo_setup_container .ibo-setup--body h2{margin-bottom:18px}.ibo-setup--button-bar{margin-top:16px}.ibo-setup--button-bar .ibo-setup--full-width{width:100%}.ibo-setup--button-bar .ibo-setup--full-width{width:100%}.ibo-setup-summary-title{font-size:1.17rem}#ibo-setup-licenses--components-list{background-color:#f2f2f2;padding:12px;box-shadow:inset 0px 2px 4px 1px rgba(0, 0, 0, 0.15)}.setup-prefix-toggler--input--container,.setup-tls--input--container,.setup-disk-location--input--container,.setup-backup--input--container{display:flex;line-height:2.5rem;margin:1rem 0}.setup-prefix-toggler--input--container input,.setup-tls--input--container input,.setup-disk-location--input--container input,.setup-backup--input--container input{margin:0 8px}.setup-disk-location--input--container input,.setup-backup--input--container input{flex-grow:1}.collapsable-options{margin-bottom:18px}.collapsable-options [data-role="setup-collapsable-options--toggler"]::before{margin-right:8px;cursor:pointer}.collapsable-options:not(.setup-is-opened) [data-role="setup-collapsable-options--toggler"]::before{content:""}.collapsable-options.setup-is-opened [data-role="setup-collapsable-options--toggler"]::before{content:""}.setup-input--hint--icon{color:#6e7a8a}.setup-invalid-field--icon{color:#c53030;margin-left:8px}.setup-accept-licenses{margin-top:18px}.module-selection-banner{display:flex}.module-selection-banner>img{margin-right:12px}.setup-end-placeholder{display:flex;flex-direction:row;align-items:center}.setup-end-placeholder>div{padding:0px 15px}.setup-end-placeholder a,.setup-end-placeholder .ibo-quick-create--compartment-results--element>.option:hover{display:flex;flex-direction:column;align-items:center}.setup-end-placeholder a svg,.setup-end-placeholder .ibo-quick-create--compartment-results--element>.option:hover svg{max-height:150px;margin-bottom:15px;width:auto}.setup-extension--icon{margin-right:5px;color:#2b6bb0;font-size:1.33rem}.setup-extension--missing .setup-extension--icon{color:#a00000}.setup-extension-tag{background-color:grey;border-radius:8px;padding-left:3px;padding-right:3px;margin-right:3px}.setup-extension-tag.installed{background-color:#9eff9e}.setup-extension-tag.notinstalled{background-color:#ed9eff}.setup-extension-tag.tobeinstalled{background-color:#9ef0ff}.setup-extension-tag.tobeuninstalled{background-color:#ff9e9e}.setup-extension-tag.notuninstallable{background-color:#ffc98c}.setup-extension-tag.removed{background-color:#969594}.setup--wizard-choice--label+.setup--wizard-choice--more-info{margin-left:0.5rem}#params_summary{overflow:auto}#params_summary div{width:100%;margin-top:0;padding-top:0.5em;padding-left:0}#params_summary div ul{margin-left:0;padding-left:40px}#params_summary div.closed ul{display:none}#params_summary div li{list-style:none;width:100%;margin-left:0;padding-left:0em}.title{padding-left:20px;font-weight:bold;cursor:pointer}#params_summary div.closed .title::before{margin-right:5px;content:""}#params_summary div:not(.closed) .title::before{margin-right:5px;content:""}#progress_content{height:200px;overflow:auto;text-align:center}#installation_progress{display:none}#fresh_content{border:0;min-height:300px;min-width:600px;display:none;margin-left:auto;margin-right:auto} \ No newline at end of file diff --git a/datamodels/2.x/authent-ldap/datamodel.authent-ldap.xml b/datamodels/2.x/authent-ldap/datamodel.authent-ldap.xml index 54bb30ea84..2d60a7030e 100644 --- a/datamodels/2.x/authent-ldap/datamodel.authent-ldap.xml +++ b/datamodels/2.x/authent-ldap/datamodel.authent-ldap.xml @@ -97,18 +97,19 @@ $bDebug = isset($aServerParams['debug']) ? $aServerParams['debug'] : false; } + if (array_key_exists(LDAP_OPT_DEBUG_LEVEL, $aOptions)) + { + // Set debug level before trying to connect, so that debug info appear in the PHP error log if ldap_connect goes wrong + $bRet = ldap_set_option(null, LDAP_OPT_DEBUG_LEVEL, $aOptions[LDAP_OPT_DEBUG_LEVEL]); + $this->LogInfo($bDebug, "ldap_set_option('LDAP_OPT_DEBUG_LEVEL', '{$aOptions[LDAP_OPT_DEBUG_LEVEL]}') returned ".($bRet ? 'true' : 'false')); + } + $hDS = @ldap_connect($sURI); if ($hDS === false) { $this->LogIssue($bDebug, "ldap_authentication: can not connect to the LDAP server '$sURI'. Check the configuration file config-itop.php."); return false; } - if (array_key_exists(LDAP_OPT_DEBUG_LEVEL, $aOptions)) - { - // Set debug level before trying to connect, so that debug info appear in the PHP error log if ldap_connect goes wrong - $bRet = ldap_set_option($hDS, LDAP_OPT_DEBUG_LEVEL, $aOptions[LDAP_OPT_DEBUG_LEVEL]); - $this->LogInfo($bDebug, "ldap_set_option('LDAP_OPT_DEBUG_LEVEL', '{$aOptions[LDAP_OPT_DEBUG_LEVEL]}') returned ".($bRet ? 'true' : 'false')); - } foreach($aOptions as $name => $value) { $bRet = ldap_set_option($hDS, $name, $value); diff --git a/datamodels/2.x/itop-config-mgmt/datamodel.itop-config-mgmt.xml b/datamodels/2.x/itop-config-mgmt/datamodel.itop-config-mgmt.xml index 55268e0864..7540ffb64f 100755 --- a/datamodels/2.x/itop-config-mgmt/datamodel.itop-config-mgmt.xml +++ b/datamodels/2.x/itop-config-mgmt/datamodel.itop-config-mgmt.xml @@ -4197,6 +4197,10 @@ false DEL_MANUAL + + osversion_id + osfamily_id + osversion_id name @@ -4218,9 +4222,12 @@ - + 10 + + 20 + 20 @@ -4665,6 +4672,10 @@ false DEL_MANUAL + + osversion_id + osfamily_id + osversion_id name @@ -4704,6 +4715,9 @@ 20 + + 10 + 30 @@ -5107,7 +5121,7 @@ @@ -5218,7 +5232,7 @@ logo @@ -5694,7 +5708,7 @@ @@ -8338,6 +8352,22 @@ Menu:ConfigManagement:SWAndApps ../images/icons/icons8-software.svg + + 0.1 + Software + + + 0.2 + OSFamily + + + 0.3 + OSVersion + + + 0.4 + IOSVersion + 1 Middleware diff --git a/datamodels/2.x/itop-config-mgmt/dictionaries/cs.dict.itop-config-mgmt.php b/datamodels/2.x/itop-config-mgmt/dictionaries/cs.dict.itop-config-mgmt.php index 79f09d68e2..ed99de5b56 100644 --- a/datamodels/2.x/itop-config-mgmt/dictionaries/cs.dict.itop-config-mgmt.php +++ b/datamodels/2.x/itop-config-mgmt/dictionaries/cs.dict.itop-config-mgmt.php @@ -948,6 +948,8 @@ Dict::Add('CS CZ', 'Czech', 'Čeština', [ 'Class:OSPatch/Attribute:functionalcis_list+' => 'Všechna zařízení, kde je tato záplata (patch) instalována', 'Class:OSPatch/Attribute:osversion_id' => 'Verze OS', 'Class:OSPatch/Attribute:osversion_id+' => '', + 'Class:OSPatch/Attribute:osfamily_id' => 'OS Family~~', + 'Class:OSPatch/Attribute:osfamily_id+' => '', 'Class:OSPatch/Attribute:osversion_name' => 'Název verze OS', 'Class:OSPatch/Attribute:osversion_name+' => '', ]); @@ -1012,6 +1014,8 @@ Dict::Add('CS CZ', 'Czech', 'Čeština', [ 'Class:OSLicence/ComplementaryName' => '%1$s - %2$s~~', 'Class:OSLicence/Attribute:osversion_id' => 'Verze OS', 'Class:OSLicence/Attribute:osversion_id+' => '', + 'Class:OSLicence/Attribute:osfamily_id' => 'OS Family~~', + 'Class:OSLicence/Attribute:osfamily_id+' => '', 'Class:OSLicence/Attribute:osversion_name' => 'Název verze OS', 'Class:OSLicence/Attribute:osversion_name+' => '', 'Class:OSLicence/Attribute:virtualmachines_list' => 'Virtuální stroje (VM)', diff --git a/datamodels/2.x/itop-config-mgmt/dictionaries/da.dict.itop-config-mgmt.php b/datamodels/2.x/itop-config-mgmt/dictionaries/da.dict.itop-config-mgmt.php index 0d689f7c9c..fab0d29418 100644 --- a/datamodels/2.x/itop-config-mgmt/dictionaries/da.dict.itop-config-mgmt.php +++ b/datamodels/2.x/itop-config-mgmt/dictionaries/da.dict.itop-config-mgmt.php @@ -947,6 +947,8 @@ Dict::Add('DA DA', 'Danish', 'Dansk', [ 'Class:OSPatch/Attribute:functionalcis_list+' => 'All the systems where this patch is installed~~', 'Class:OSPatch/Attribute:osversion_id' => 'OS Version', 'Class:OSPatch/Attribute:osversion_id+' => '', + 'Class:OSPatch/Attribute:osfamily_id' => 'OS Family~~', + 'Class:OSPatch/Attribute:osfamily_id+' => '', 'Class:OSPatch/Attribute:osversion_name' => 'OS versionsnavn', 'Class:OSPatch/Attribute:osversion_name+' => '', ]); @@ -1011,6 +1013,8 @@ Dict::Add('DA DA', 'Danish', 'Dansk', [ 'Class:OSLicence/ComplementaryName' => '%1$s - %2$s~~', 'Class:OSLicence/Attribute:osversion_id' => 'OS-Version', 'Class:OSLicence/Attribute:osversion_id+' => '', + 'Class:OSLicence/Attribute:osfamily_id' => 'OS Family~~', + 'Class:OSLicence/Attribute:osfamily_id+' => '', 'Class:OSLicence/Attribute:osversion_name' => 'OS versionsnavn', 'Class:OSLicence/Attribute:osversion_name+' => '', 'Class:OSLicence/Attribute:virtualmachines_list' => 'Virtuelle Maskiner', diff --git a/datamodels/2.x/itop-config-mgmt/dictionaries/de.dict.itop-config-mgmt.php b/datamodels/2.x/itop-config-mgmt/dictionaries/de.dict.itop-config-mgmt.php index 5111c8adda..278a1aa7a1 100644 --- a/datamodels/2.x/itop-config-mgmt/dictionaries/de.dict.itop-config-mgmt.php +++ b/datamodels/2.x/itop-config-mgmt/dictionaries/de.dict.itop-config-mgmt.php @@ -947,6 +947,8 @@ Dict::Add('DE DE', 'German', 'Deutsch', [ 'Class:OSPatch/Attribute:functionalcis_list+' => 'Alle Systeme, auf denen dieser Patch installiert ist', 'Class:OSPatch/Attribute:osversion_id' => 'OS Version', 'Class:OSPatch/Attribute:osversion_id+' => '', + 'Class:OSPatch/Attribute:osfamily_id' => 'OS Family~~', + 'Class:OSPatch/Attribute:osfamily_id+' => '', 'Class:OSPatch/Attribute:osversion_name' => 'OS-Versionsname', 'Class:OSPatch/Attribute:osversion_name+' => '', ]); @@ -1011,6 +1013,8 @@ Dict::Add('DE DE', 'German', 'Deutsch', [ 'Class:OSLicence/ComplementaryName' => '%1$s - %2$s', 'Class:OSLicence/Attribute:osversion_id' => 'OS-Version', 'Class:OSLicence/Attribute:osversion_id+' => '', + 'Class:OSLicence/Attribute:osfamily_id' => 'OS Family~~', + 'Class:OSLicence/Attribute:osfamily_id+' => '', 'Class:OSLicence/Attribute:osversion_name' => 'OS-Versionsname', 'Class:OSLicence/Attribute:osversion_name+' => '', 'Class:OSLicence/Attribute:virtualmachines_list' => 'Virtuelle Maschinen', diff --git a/datamodels/2.x/itop-config-mgmt/dictionaries/en.dict.itop-config-mgmt.php b/datamodels/2.x/itop-config-mgmt/dictionaries/en.dict.itop-config-mgmt.php index 1d27ac577e..5691ff0956 100644 --- a/datamodels/2.x/itop-config-mgmt/dictionaries/en.dict.itop-config-mgmt.php +++ b/datamodels/2.x/itop-config-mgmt/dictionaries/en.dict.itop-config-mgmt.php @@ -963,6 +963,8 @@ Dict::Add('EN US', 'English', 'English', [ 'Class:OSPatch/Attribute:functionalcis_list+' => 'All the systems where this patch is installed', 'Class:OSPatch/Attribute:osversion_id' => 'OS version', 'Class:OSPatch/Attribute:osversion_id+' => '', + 'Class:OSPatch/Attribute:osfamily_id' => 'OS Family', + 'Class:OSPatch/Attribute:osfamily_id+' => '', 'Class:OSPatch/Attribute:osversion_name' => 'OS version name', 'Class:OSPatch/Attribute:osversion_name+' => '', ]); @@ -1027,6 +1029,8 @@ Dict::Add('EN US', 'English', 'English', [ 'Class:OSLicence/ComplementaryName' => '%1$s - %2$s', 'Class:OSLicence/Attribute:osversion_id' => 'OS version', 'Class:OSLicence/Attribute:osversion_id+' => '', + 'Class:OSLicence/Attribute:osfamily_id' => 'OS Family', + 'Class:OSLicence/Attribute:osfamily_id+' => '', 'Class:OSLicence/Attribute:osversion_name' => 'OS version name', 'Class:OSLicence/Attribute:osversion_name+' => '', 'Class:OSLicence/Attribute:virtualmachines_list' => 'Virtual machines', diff --git a/datamodels/2.x/itop-config-mgmt/dictionaries/en_gb.dict.itop-config-mgmt.php b/datamodels/2.x/itop-config-mgmt/dictionaries/en_gb.dict.itop-config-mgmt.php index 609e8c3fa4..4ca5718617 100644 --- a/datamodels/2.x/itop-config-mgmt/dictionaries/en_gb.dict.itop-config-mgmt.php +++ b/datamodels/2.x/itop-config-mgmt/dictionaries/en_gb.dict.itop-config-mgmt.php @@ -945,6 +945,8 @@ Dict::Add('EN GB', 'British English', 'British English', [ 'Class:OSPatch/Attribute:functionalcis_list+' => 'All the systems where this patch is installed', 'Class:OSPatch/Attribute:osversion_id' => 'OS version', 'Class:OSPatch/Attribute:osversion_id+' => '', + 'Class:OSPatch/Attribute:osfamily_id' => 'OS Family~~', + 'Class:OSPatch/Attribute:osfamily_id+' => '', 'Class:OSPatch/Attribute:osversion_name' => 'OS version name', 'Class:OSPatch/Attribute:osversion_name+' => '', ]); @@ -1010,6 +1012,8 @@ Dict::Add('EN GB', 'British English', 'British English', [ 'Class:OSLicence/ComplementaryName' => '%1$s - %2$s', 'Class:OSLicence/Attribute:osversion_id' => 'OS version', 'Class:OSLicence/Attribute:osversion_id+' => '', + 'Class:OSLicence/Attribute:osfamily_id' => 'OS Family~~', + 'Class:OSLicence/Attribute:osfamily_id+' => '~~', 'Class:OSLicence/Attribute:osversion_name' => 'OS version name', 'Class:OSLicence/Attribute:osversion_name+' => '', 'Class:OSLicence/Attribute:virtualmachines_list' => 'Virtual machines', diff --git a/datamodels/2.x/itop-config-mgmt/dictionaries/es_cr.dict.itop-config-mgmt.php b/datamodels/2.x/itop-config-mgmt/dictionaries/es_cr.dict.itop-config-mgmt.php index 9023a2a9fb..51a6e31304 100644 --- a/datamodels/2.x/itop-config-mgmt/dictionaries/es_cr.dict.itop-config-mgmt.php +++ b/datamodels/2.x/itop-config-mgmt/dictionaries/es_cr.dict.itop-config-mgmt.php @@ -943,7 +943,9 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellano', [ 'Class:OSPatch/Attribute:functionalcis_list' => 'Dispositivos', 'Class:OSPatch/Attribute:functionalcis_list+' => 'Dispositivos', 'Class:OSPatch/Attribute:osversion_id' => 'Versión de SO', - 'Class:OSPatch/Attribute:osversion_id+' => 'Versión de SO', + 'Class:OSPatch/Attribute:osversion_id+' => '', + 'Class:OSPatch/Attribute:osfamily_id' => 'OS Family~~', + 'Class:OSPatch/Attribute:osfamily_id+' => '', 'Class:OSPatch/Attribute:osversion_name' => 'Versión de SO', 'Class:OSPatch/Attribute:osversion_name+' => 'Versión de SO', ]); @@ -1008,6 +1010,8 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellano', [ 'Class:OSLicence/ComplementaryName' => '%1$s - %2$s', 'Class:OSLicence/Attribute:osversion_id' => 'Versión de SO', 'Class:OSLicence/Attribute:osversion_id+' => 'Versión de SO', + 'Class:OSLicence/Attribute:osfamily_id' => 'OS Family~~', + 'Class:OSLicence/Attribute:osfamily_id+' => '', 'Class:OSLicence/Attribute:osversion_name' => 'Versión de SO', 'Class:OSLicence/Attribute:osversion_name+' => 'Versión de SO', 'Class:OSLicence/Attribute:virtualmachines_list' => 'Máquinas Virtuales', diff --git a/datamodels/2.x/itop-config-mgmt/dictionaries/fr.dict.itop-config-mgmt.php b/datamodels/2.x/itop-config-mgmt/dictionaries/fr.dict.itop-config-mgmt.php index 91b0e184ae..f6179617cb 100644 --- a/datamodels/2.x/itop-config-mgmt/dictionaries/fr.dict.itop-config-mgmt.php +++ b/datamodels/2.x/itop-config-mgmt/dictionaries/fr.dict.itop-config-mgmt.php @@ -1068,6 +1068,8 @@ Dict::Add('FR FR', 'French', 'Français', [ 'Class:OSPatch/Attribute:functionalcis_list+' => 'Tous les systèmes où ce patch est installé', 'Class:OSPatch/Attribute:osversion_id' => 'Version OS', 'Class:OSPatch/Attribute:osversion_id+' => '', + 'Class:OSPatch/Attribute:osfamily_id' => 'Famille d\'OS', + 'Class:OSPatch/Attribute:osfamily_id+' => 'Déduite de la version d\'OS sélectionnée', 'Class:OSPatch/Attribute:osversion_name' => 'Nom Version OS', 'Class:OSPatch/Attribute:osversion_name+' => '', ]); @@ -1143,6 +1145,8 @@ Dict::Add('FR FR', 'French', 'Français', [ 'Class:OSLicence/ComplementaryName' => '%1$s - %2$s', 'Class:OSLicence/Attribute:osversion_id' => 'Version OS', 'Class:OSLicence/Attribute:osversion_id+' => '', + 'Class:OSLicence/Attribute:osfamily_id' => 'Famille d\'OS', + 'Class:OSLicence/Attribute:osfamily_id+' => 'Déduite de la version d\'OS sélectionnée', 'Class:OSLicence/Attribute:osversion_name' => 'Nom Version OS', 'Class:OSLicence/Attribute:osversion_name+' => '', 'Class:OSLicence/Attribute:virtualmachines_list' => 'Machines virtuelles', diff --git a/datamodels/2.x/itop-config-mgmt/dictionaries/hu.dict.itop-config-mgmt.php b/datamodels/2.x/itop-config-mgmt/dictionaries/hu.dict.itop-config-mgmt.php index 4671b23f02..7ec5a78d0d 100644 --- a/datamodels/2.x/itop-config-mgmt/dictionaries/hu.dict.itop-config-mgmt.php +++ b/datamodels/2.x/itop-config-mgmt/dictionaries/hu.dict.itop-config-mgmt.php @@ -36,23 +36,6 @@ Dict::Add('HU HU', 'Hungarian', 'Magyar', [ // Class:/UniquenessRule: // Class:/UniquenessRule:+ -////////////////////////////////////////////////////////////////////// -// Classes in 'bizmodel' -////////////////////////////////////////////////////////////////////// -// - -// Dictionnay conventions -// Class: -// Class:+ -// Class:/Attribute: -// Class:/Attribute:+ -// Class:/Attribute:/Value: -// Class:/Attribute:/Value:+ -// Class:/Stimulus: -// Class:/Stimulus:+ -// Class:/UniquenessRule: -// Class:/UniquenessRule:+ - ////////////////////////////////////////////////////////////////////// // Note: The classes have been grouped by categories: bizmodel ////////////////////////////////////////////////////////////////////// @@ -946,6 +929,8 @@ Dict::Add('HU HU', 'Hungarian', 'Magyar', [ 'Class:OSPatch/Attribute:functionalcis_list+' => 'Rendszerek, amelyekre telepítve lett ez az OS javítócsomag', 'Class:OSPatch/Attribute:osversion_id' => 'OS verzió', 'Class:OSPatch/Attribute:osversion_id+' => '~~', + 'Class:OSPatch/Attribute:osfamily_id' => 'OS Family~~', + 'Class:OSPatch/Attribute:osfamily_id+' => '~~', 'Class:OSPatch/Attribute:osversion_name' => 'OS verzió név', 'Class:OSPatch/Attribute:osversion_name+' => '~~', ]); @@ -1010,6 +995,8 @@ Dict::Add('HU HU', 'Hungarian', 'Magyar', [ 'Class:OSLicence/ComplementaryName' => '%1$s - %2$s~~', 'Class:OSLicence/Attribute:osversion_id' => 'OS verzió', 'Class:OSLicence/Attribute:osversion_id+' => '~~', + 'Class:OSLicence/Attribute:osfamily_id' => 'OS Family~~', + 'Class:OSLicence/Attribute:osfamily_id+' => '~~', 'Class:OSLicence/Attribute:osversion_name' => 'OS verzió név', 'Class:OSLicence/Attribute:osversion_name+' => '~~', 'Class:OSLicence/Attribute:virtualmachines_list' => 'Virtuális gépek', diff --git a/datamodels/2.x/itop-config-mgmt/dictionaries/it.dict.itop-config-mgmt.php b/datamodels/2.x/itop-config-mgmt/dictionaries/it.dict.itop-config-mgmt.php index 239057ae7a..06f6a6d926 100644 --- a/datamodels/2.x/itop-config-mgmt/dictionaries/it.dict.itop-config-mgmt.php +++ b/datamodels/2.x/itop-config-mgmt/dictionaries/it.dict.itop-config-mgmt.php @@ -946,6 +946,8 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [ 'Class:OSPatch/Attribute:functionalcis_list+' => 'Tutti i sistemi in cui questa patch è installata', 'Class:OSPatch/Attribute:osversion_id' => 'Versione del Sistema Operativo', 'Class:OSPatch/Attribute:osversion_id+' => '~~', + 'Class:OSPatch/Attribute:osfamily_id' => 'OS Family~~', + 'Class:OSPatch/Attribute:osfamily_id+' => '~~', 'Class:OSPatch/Attribute:osversion_name' => 'Nome della Versione del Sistema Operativo', 'Class:OSPatch/Attribute:osversion_name+' => '~~', ]); @@ -1010,6 +1012,8 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [ 'Class:OSLicence/ComplementaryName' => '%1$s - %2$s', 'Class:OSLicence/Attribute:osversion_id' => 'Versione del sistema operativo', 'Class:OSLicence/Attribute:osversion_id+' => '~~', + 'Class:OSLicence/Attribute:osfamily_id' => 'OS Family~~', + 'Class:OSLicence/Attribute:osfamily_id+' => '~~', 'Class:OSLicence/Attribute:osversion_name' => 'Nome della versione del sistema operativo', 'Class:OSLicence/Attribute:osversion_name+' => '~~', 'Class:OSLicence/Attribute:virtualmachines_list' => 'Macchine virtuali', diff --git a/datamodels/2.x/itop-config-mgmt/dictionaries/ja.dict.itop-config-mgmt.php b/datamodels/2.x/itop-config-mgmt/dictionaries/ja.dict.itop-config-mgmt.php index 4178fec449..02bd6448e5 100644 --- a/datamodels/2.x/itop-config-mgmt/dictionaries/ja.dict.itop-config-mgmt.php +++ b/datamodels/2.x/itop-config-mgmt/dictionaries/ja.dict.itop-config-mgmt.php @@ -946,6 +946,8 @@ Dict::Add('JA JP', 'Japanese', '日本語', [ 'Class:OSPatch/Attribute:functionalcis_list+' => 'All the systems where this patch is installed~~', 'Class:OSPatch/Attribute:osversion_id' => 'OSバージョン', 'Class:OSPatch/Attribute:osversion_id+' => '', + 'Class:OSPatch/Attribute:osfamily_id' => 'OS Family~~', + 'Class:OSPatch/Attribute:osfamily_id+' => '', 'Class:OSPatch/Attribute:osversion_name' => 'OSバージョン名', 'Class:OSPatch/Attribute:osversion_name+' => '', ]); @@ -1010,6 +1012,8 @@ Dict::Add('JA JP', 'Japanese', '日本語', [ 'Class:OSLicence/ComplementaryName' => '%1$s - %2$s~~', 'Class:OSLicence/Attribute:osversion_id' => 'OSバージョン', 'Class:OSLicence/Attribute:osversion_id+' => '', + 'Class:OSLicence/Attribute:osfamily_id' => 'OS Family~~', + 'Class:OSLicence/Attribute:osfamily_id+' => '~~', 'Class:OSLicence/Attribute:osversion_name' => 'OSバージョン名', 'Class:OSLicence/Attribute:osversion_name+' => '', 'Class:OSLicence/Attribute:virtualmachines_list' => '仮想マシン', diff --git a/datamodels/2.x/itop-config-mgmt/dictionaries/nl.dict.itop-config-mgmt.php b/datamodels/2.x/itop-config-mgmt/dictionaries/nl.dict.itop-config-mgmt.php index 7cabf9dbba..63318ef77f 100644 --- a/datamodels/2.x/itop-config-mgmt/dictionaries/nl.dict.itop-config-mgmt.php +++ b/datamodels/2.x/itop-config-mgmt/dictionaries/nl.dict.itop-config-mgmt.php @@ -948,6 +948,8 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', [ 'Class:OSPatch/Attribute:functionalcis_list+' => 'Alle systemen waarop deze patch is geïnstalleerd', 'Class:OSPatch/Attribute:osversion_id' => 'Versie besturingssysteem', 'Class:OSPatch/Attribute:osversion_id+' => '', + 'Class:OSPatch/Attribute:osfamily_id' => 'Soort besturingssysteem', + 'Class:OSPatch/Attribute:osfamily_id+' => '', 'Class:OSPatch/Attribute:osversion_name' => 'Naam versie besturingssysteem', 'Class:OSPatch/Attribute:osversion_name+' => '', ]); @@ -1012,6 +1014,8 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', [ 'Class:OSLicence/ComplementaryName' => '%1$s - %2$s', 'Class:OSLicence/Attribute:osversion_id' => 'Versie besturingssysteem', 'Class:OSLicence/Attribute:osversion_id+' => '', + 'Class:OSLicence/Attribute:osfamily_id' => 'Soort besturingssysteem', + 'Class:OSLicence/Attribute:osfamily_id+' => '~~', 'Class:OSLicence/Attribute:osversion_name' => 'Naam versie bestandssysteem', 'Class:OSLicence/Attribute:osversion_name+' => '', 'Class:OSLicence/Attribute:virtualmachines_list' => 'Virtuele machines', diff --git a/datamodels/2.x/itop-config-mgmt/dictionaries/pl.dict.itop-config-mgmt.php b/datamodels/2.x/itop-config-mgmt/dictionaries/pl.dict.itop-config-mgmt.php index ea484725f7..e8c6d2f7e7 100644 --- a/datamodels/2.x/itop-config-mgmt/dictionaries/pl.dict.itop-config-mgmt.php +++ b/datamodels/2.x/itop-config-mgmt/dictionaries/pl.dict.itop-config-mgmt.php @@ -946,6 +946,8 @@ Dict::Add('PL PL', 'Polish', 'Polski', [ 'Class:OSPatch/Attribute:functionalcis_list+' => 'Wszystkie systemy, w których jest zainstalowana ta poprawka', 'Class:OSPatch/Attribute:osversion_id' => 'Wersja OS', 'Class:OSPatch/Attribute:osversion_id+' => '', + 'Class:OSPatch/Attribute:osfamily_id' => 'OS Family~~', + 'Class:OSPatch/Attribute:osfamily_id+' => '', 'Class:OSPatch/Attribute:osversion_name' => 'Nazwa wersji OS', 'Class:OSPatch/Attribute:osversion_name+' => '', ]); @@ -1010,6 +1012,8 @@ Dict::Add('PL PL', 'Polish', 'Polski', [ 'Class:OSLicence/ComplementaryName' => '%1$s - %2$s', 'Class:OSLicence/Attribute:osversion_id' => 'Wersja OS', 'Class:OSLicence/Attribute:osversion_id+' => '', + 'Class:OSLicence/Attribute:osfamily_id' => 'OS Family~~', + 'Class:OSLicence/Attribute:osfamily_id+' => '~~', 'Class:OSLicence/Attribute:osversion_name' => 'Nazwa wersji OS', 'Class:OSLicence/Attribute:osversion_name+' => '', 'Class:OSLicence/Attribute:virtualmachines_list' => 'Maszyny wirtualne', diff --git a/datamodels/2.x/itop-config-mgmt/dictionaries/pt_br.dict.itop-config-mgmt.php b/datamodels/2.x/itop-config-mgmt/dictionaries/pt_br.dict.itop-config-mgmt.php index c1c2218a5d..f430173e45 100644 --- a/datamodels/2.x/itop-config-mgmt/dictionaries/pt_br.dict.itop-config-mgmt.php +++ b/datamodels/2.x/itop-config-mgmt/dictionaries/pt_br.dict.itop-config-mgmt.php @@ -946,6 +946,8 @@ Dict::Add('PT BR', 'Brazilian', 'Brazilian', [ 'Class:OSPatch/Attribute:functionalcis_list+' => 'Todos os sistemas onde essa Atualização de SO está instalada', 'Class:OSPatch/Attribute:osversion_id' => 'Versão do SO', 'Class:OSPatch/Attribute:osversion_id+' => '', + 'Class:OSPatch/Attribute:osfamily_id' => 'OS Family~~', + 'Class:OSPatch/Attribute:osfamily_id+' => '', 'Class:OSPatch/Attribute:osversion_name' => 'Nome da versão do SO', 'Class:OSPatch/Attribute:osversion_name+' => '', ]); @@ -1010,6 +1012,8 @@ Dict::Add('PT BR', 'Brazilian', 'Brazilian', [ 'Class:OSLicence/ComplementaryName' => '%1$s - %2$s~~', 'Class:OSLicence/Attribute:osversion_id' => 'Versão do SO', 'Class:OSLicence/Attribute:osversion_id+' => '', + 'Class:OSLicence/Attribute:osfamily_id' => 'OS Family~~', + 'Class:OSLicence/Attribute:osfamily_id+' => '~~', 'Class:OSLicence/Attribute:osversion_name' => 'Nome da versão do SO', 'Class:OSLicence/Attribute:osversion_name+' => '', 'Class:OSLicence/Attribute:virtualmachines_list' => 'Máquinas virtuais (VMs)', diff --git a/datamodels/2.x/itop-config-mgmt/dictionaries/ru.dict.itop-config-mgmt.php b/datamodels/2.x/itop-config-mgmt/dictionaries/ru.dict.itop-config-mgmt.php index a4e422cbea..aad16bcbf6 100644 --- a/datamodels/2.x/itop-config-mgmt/dictionaries/ru.dict.itop-config-mgmt.php +++ b/datamodels/2.x/itop-config-mgmt/dictionaries/ru.dict.itop-config-mgmt.php @@ -947,6 +947,8 @@ Dict::Add('RU RU', 'Russian', 'Русский', [ 'Class:OSPatch/Attribute:functionalcis_list+' => 'Все системы, где установлен этот патч', 'Class:OSPatch/Attribute:osversion_id' => 'Версия ОС', 'Class:OSPatch/Attribute:osversion_id+' => '', + 'Class:OSPatch/Attribute:osfamily_id' => 'OS Family~~', + 'Class:OSPatch/Attribute:osfamily_id+' => '', 'Class:OSPatch/Attribute:osversion_name' => 'Версия ОС', 'Class:OSPatch/Attribute:osversion_name+' => '', ]); @@ -1011,6 +1013,8 @@ Dict::Add('RU RU', 'Russian', 'Русский', [ 'Class:OSLicence/ComplementaryName' => '%1$s - %2$s~~', 'Class:OSLicence/Attribute:osversion_id' => 'Версия ОС', 'Class:OSLicence/Attribute:osversion_id+' => '', + 'Class:OSLicence/Attribute:osfamily_id' => 'OS Family~~', + 'Class:OSLicence/Attribute:osfamily_id+' => '~~', 'Class:OSLicence/Attribute:osversion_name' => 'Версия ОС', 'Class:OSLicence/Attribute:osversion_name+' => '', 'Class:OSLicence/Attribute:virtualmachines_list' => 'Виртуальные машины', diff --git a/datamodels/2.x/itop-config-mgmt/dictionaries/sk.dict.itop-config-mgmt.php b/datamodels/2.x/itop-config-mgmt/dictionaries/sk.dict.itop-config-mgmt.php index cf5c883773..288434749a 100644 --- a/datamodels/2.x/itop-config-mgmt/dictionaries/sk.dict.itop-config-mgmt.php +++ b/datamodels/2.x/itop-config-mgmt/dictionaries/sk.dict.itop-config-mgmt.php @@ -946,6 +946,8 @@ Dict::Add('SK SK', 'Slovak', 'Slovenčina', [ 'Class:OSPatch/Attribute:functionalcis_list+' => 'All the systems where this patch is installed~~', 'Class:OSPatch/Attribute:osversion_id' => 'Verzia OS', 'Class:OSPatch/Attribute:osversion_id+' => '~~', + 'Class:OSPatch/Attribute:osfamily_id' => 'OS Family~~', + 'Class:OSPatch/Attribute:osfamily_id+' => '~~', 'Class:OSPatch/Attribute:osversion_name' => 'Názov OS verzie', 'Class:OSPatch/Attribute:osversion_name+' => '~~', ]); @@ -1010,6 +1012,8 @@ Dict::Add('SK SK', 'Slovak', 'Slovenčina', [ 'Class:OSLicence/ComplementaryName' => '%1$s - %2$s~~', 'Class:OSLicence/Attribute:osversion_id' => 'Verzia OS', 'Class:OSLicence/Attribute:osversion_id+' => '~~', + 'Class:OSLicence/Attribute:osfamily_id' => 'OS Family~~', + 'Class:OSLicence/Attribute:osfamily_id+' => '~~', 'Class:OSLicence/Attribute:osversion_name' => 'Názov OS verzie', 'Class:OSLicence/Attribute:osversion_name+' => '~~', 'Class:OSLicence/Attribute:virtualmachines_list' => 'Virtuálne zariadenia', diff --git a/datamodels/2.x/itop-config-mgmt/dictionaries/tr.dict.itop-config-mgmt.php b/datamodels/2.x/itop-config-mgmt/dictionaries/tr.dict.itop-config-mgmt.php index 0757c47f78..c88d026d1e 100644 --- a/datamodels/2.x/itop-config-mgmt/dictionaries/tr.dict.itop-config-mgmt.php +++ b/datamodels/2.x/itop-config-mgmt/dictionaries/tr.dict.itop-config-mgmt.php @@ -947,6 +947,8 @@ Dict::Add('TR TR', 'Turkish', 'Türkçe', [ 'Class:OSPatch/Attribute:functionalcis_list+' => 'Bu yamanın kurulduğu tüm sistemler', 'Class:OSPatch/Attribute:osversion_id' => 'OS Sürümü', 'Class:OSPatch/Attribute:osversion_id+' => '~~', + 'Class:OSPatch/Attribute:osfamily_id' => 'OS Family~~', + 'Class:OSPatch/Attribute:osfamily_id+' => '~~', 'Class:OSPatch/Attribute:osversion_name' => 'OS Sürüm Adı', 'Class:OSPatch/Attribute:osversion_name+' => '~~', ]); @@ -1011,6 +1013,8 @@ Dict::Add('TR TR', 'Turkish', 'Türkçe', [ 'Class:OSLicence/ComplementaryName' => '%1$s - %2$s~~', 'Class:OSLicence/Attribute:osversion_id' => 'OS Sürümü', 'Class:OSLicence/Attribute:osversion_id+' => '~~', + 'Class:OSLicence/Attribute:osfamily_id' => 'OS Family~~', + 'Class:OSLicence/Attribute:osfamily_id+' => '~~', 'Class:OSLicence/Attribute:osversion_name' => 'OS Sürüm Adı', 'Class:OSLicence/Attribute:osversion_name+' => '~~', 'Class:OSLicence/Attribute:virtualmachines_list' => 'Sanal Makineler', diff --git a/datamodels/2.x/itop-config-mgmt/dictionaries/zh_cn.dict.itop-config-mgmt.php b/datamodels/2.x/itop-config-mgmt/dictionaries/zh_cn.dict.itop-config-mgmt.php index 48c17bfa04..ab8fb2b4a9 100644 --- a/datamodels/2.x/itop-config-mgmt/dictionaries/zh_cn.dict.itop-config-mgmt.php +++ b/datamodels/2.x/itop-config-mgmt/dictionaries/zh_cn.dict.itop-config-mgmt.php @@ -963,6 +963,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [ 'Class:OSPatch/Attribute:functionalcis_list+' => '已安装此补丁的所有系统', 'Class:OSPatch/Attribute:osversion_id' => '操作系统版本', 'Class:OSPatch/Attribute:osversion_id+' => '', + 'Class:OSPatch/Attribute:osfamily_id' => 'OS Family~~', + 'Class:OSPatch/Attribute:osfamily_id+' => '', 'Class:OSPatch/Attribute:osversion_name' => '名称', 'Class:OSPatch/Attribute:osversion_name+' => '', ]); @@ -1027,6 +1029,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [ 'Class:OSLicence/ComplementaryName' => '%1$s - %2$s', 'Class:OSLicence/Attribute:osversion_id' => '操作系统版本', 'Class:OSLicence/Attribute:osversion_id+' => '', + 'Class:OSLicence/Attribute:osfamily_id' => 'OS Family~~', + 'Class:OSLicence/Attribute:osfamily_id+' => '~~', 'Class:OSLicence/Attribute:osversion_name' => '名称', 'Class:OSLicence/Attribute:osversion_name+' => '', 'Class:OSLicence/Attribute:virtualmachines_list' => '虚拟机', diff --git a/datamodels/2.x/itop-config-mgmt/images/icons8-ios-version-software.svg b/datamodels/2.x/itop-config-mgmt/images/icons8-ios-version-software.svg new file mode 100644 index 0000000000..24d5e02eaf --- /dev/null +++ b/datamodels/2.x/itop-config-mgmt/images/icons8-ios-version-software.svg @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + x.y + x.y + I + I + diff --git a/datamodels/2.x/itop-config-mgmt/images/icons8-os-family-software.svg b/datamodels/2.x/itop-config-mgmt/images/icons8-os-family-software.svg new file mode 100644 index 0000000000..eba3dc3ba9 --- /dev/null +++ b/datamodels/2.x/itop-config-mgmt/images/icons8-os-family-software.svg @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/datamodels/2.x/itop-config-mgmt/images/icons8-os-version-software.svg b/datamodels/2.x/itop-config-mgmt/images/icons8-os-version-software.svg new file mode 100644 index 0000000000..eebdf49e7a --- /dev/null +++ b/datamodels/2.x/itop-config-mgmt/images/icons8-os-version-software.svg @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + x.y + x.y + diff --git a/datamodels/2.x/itop-datacenter-mgmt/datamodel.itop-datacenter-mgmt.xml b/datamodels/2.x/itop-datacenter-mgmt/datamodel.itop-datacenter-mgmt.xml index b35689d46c..d11b5f888e 100755 --- a/datamodels/2.x/itop-datacenter-mgmt/datamodel.itop-datacenter-mgmt.xml +++ b/datamodels/2.x/itop-datacenter-mgmt/datamodel.itop-datacenter-mgmt.xml @@ -255,7 +255,7 @@ diff --git a/datamodels/2.x/itop-request-mgmt-itil/datamodel.itop-request-mgmt-itil.xml b/datamodels/2.x/itop-request-mgmt-itil/datamodel.itop-request-mgmt-itil.xml index fa3bfa29ab..766272cbec 100755 --- a/datamodels/2.x/itop-request-mgmt-itil/datamodel.itop-request-mgmt-itil.xml +++ b/datamodels/2.x/itop-request-mgmt-itil/datamodel.itop-request-mgmt-itil.xml @@ -1598,9 +1598,6 @@ 10 - - 10 - 20 diff --git a/datamodels/2.x/itop-structure/data/data.sample.persons.xml b/datamodels/2.x/itop-structure/data/data.sample.persons.xml index 9c7b59d0f8..b2f187beee 100644 --- a/datamodels/2.x/itop-structure/data/data.sample.persons.xml +++ b/datamodels/2.x/itop-structure/data/data.sample.persons.xml @@ -753,4 +753,25 @@ + + Gourmaud + active + 3 + jamy.gourmaud@it.com + + yes + + Jamy + + + 0 + 0 + + image/png + Lenaick.png + + iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAC3KSURBVHhe7Z13fFzVlfi/771500ca9WZbslxwNy5gjAlgeigJJiQkYRMIIWRJNmVDEkh2N5tkw26yyYaU3fwWp/ALpFJSIQQMwTTjbmPcq6zeptc3r/3+eKORNFZDluTB/L6fjyzr3ldm3j3v3HPPPfdcIRwOm5wlGIZBKBRiy5YtbN26le3bt3PkyBG6u7sRBAAh+3t4TBPAxDShsrKSuXPnct5553H++eezatUqiouLEUUx/7S3LMJbXQB0XaepqYnHHnuMZ555hn379qLrOqIoIAgigjB6ow+HaYJpmhiGgWmayLKdJUuWcPXVV3PTTTdRX1//lheGt6wAJBIJnnzySX7605+ya9cuDMNAkkREcZytPUYMw0TXDSRJYtmyZXz0ox/l+uuvx+125x/6luAtJwDBYJCHH36YBx98kK6uTmw26Yy9hYZhoGkGtbU13H33J7j11lvx+/35hxU0bxkB0DSNxx9/nK985SsEAr3YbBLCeHX7BGOaJpqmU11dw/33388NN9yAJEn5hxUkbwkBOHz4MJ/97GfZsmUzkiRNupofL1b3oHPRRe/ggQceoLGxMf+QguPM6M4xYpomP//5z1m7di3btm1Flm0F2/gAoiggyzY2bXqViy++mEceeQTTGlYULAWrAeLxOHfeeSfPPvssslw46n6smKaJqupcc801rF+/Hq/Xm39IQVCQAtDU1MSHP/xh9u/fh8321uhLh0NVNRYsWMgjjzxCQ0NDfvUZp+C6gK1bt3LVVVdx4MD+t3zjA8iyjQMH9nPVVVexc+fO/OozTkFpgNdee42bb74ZVVXO2NBusjAMA4/Hx1NPPcWCBQvyq88YBfOUX3/9dd7//veflY0PIIoiiUSM97znPRw/fjy/+oxREE+6paWFW265hWQycVY2fh+iKBII9HDTTTfR1dWVX31GOONPO5VKcccddxAI9CJJZ/zjTDqiKNLW1srtt9+Ooij51VPOGX/iX/3qV9m5c8fbovH7kCSRrVu38q//+q/5VVPOGX3qjz76KD/+8Y+RZVt+1VmPLEv8eP16Hn300fyqKeWMjQKam5u58MILUVXlLefkmUicTjevvvoqdXV1+VVTwhnRAIZhcM8996Ao6bd14wMkkwm++MUvnjGX8RkRgD/84Q88//zzb6t+fzhEUeDZZ5/h6aefzq+aEqa8CwgEAqxevZpwOFTQEztTiWGY1NTU8sorr+Dz+fKrJ5UpfwXXr19PKBT8/40/AFEUaG9r4yc/+Ul+1aQzpRogFAqxfPlyksn4mPt+WbYxt76elYsWsGLhfOqqKqksK0VVNVLpNJ29AU52dHDoxEneOHSEo80tZFQ1/zITgs1mo6G2hvmzZrJw9izq62qorahAFAUMw6Q7EKSls4s3jhxlx979tHR2jblvN02T8vJKtm3bNqXhZVMqAD/60Y/4ylf+ZcyTPEvOmcO/3H0Xc+qnj0lgTNMkEo/zwpbtvLRtB9v3HSAaj+cf9qbw+3xccO4SLr/gfC5Yuhifxz2mz2KYJrsPHOK/HnqEvUeO5lcPiapqfPvb3+GOO+7Ir5o0pkwAFEXhvPPOo6urY0wP8L3XXMmX7roD6TRcw6Zp0hUI0t7dQzAcIZFKoWQyKKpKRlVRMpamcNhlHLKM3W7HIct43C5Ki4upq6qgsrR0TJ93ODRd51s/fohH/7ohv+oUDMNk9uw5vPzyy1MWUjZlArB582auu+46ZHnkLyYA73vnVXzprjtO68EXGj/73R/5wSO/HrVLUFWdjRs3snjx4vyqSWH8r9eb5OGHHx6T4ffuy9dy31nW+AAfWfcuPnLTu0b9XoIAP/vZz/KLJ40pEYB4PM4zzzwz6kzfgtmNfOmujyCO8pDeigiCwD988BauWnNBftUgJEnk6aefRtO0/KpJYeQWmSD2799PKBQacYWOTZL454/fidPhyK86a5AkiXtu/xCuEb6jIAh0dXWxd+/e/KpJYUoEYMOGDaOq/+UL57NgduGHUZ8uVeVlrLvysvziQUiSyDPPPJNfPClMugAYhjGq21cQBD54/TtH7R/PFt53zZUjdnOiKPDKK6/kF08Kw7fKBKEoCocPHx6xcUuKili9dGqs3kJg5rQ65s8aXtsJgsiePXtGHTFMBJMuAMePHyeZTOQXD2LN8qVndd8/FCMZg4IA0Wh0SmIHJ10Adu/ePeLbD3DZqvPzi856Vi5amF80CFEU2L59e37xhDPpAtDU1DSiAMg2GwvnDK8Oz1bmNTbgdjrzi3OIonB2aICOjpFdv6X+YirLyvKLz3psksTiubPziwcg0N7enl844Uy6AHR1dY0oAPNmNjB87dnNwjmz8otyCIJAZ2dnfvGEM+kCEAwGR3QAzW2ozy962zCjpjq/KIcgWM9uspl0AYiPMh3bUFebX/S2obq8PL9oEKM9u4lg0gUgFotl5/iGpq6yIr/obUOR15NfNIizQgA0TRuxC3C7hreEz3ZG832okxTZNJBJFwCHw5HNvTc0siznF71tGMk4BrDb7flFE86kC4D1JUaQgJGk4ywnmUrlFw3CMYqGmAgmXQA8npH7uY7eQH7R24bWru78okFMRXDopIeEXXfddWzfvnVYdfdPf38n77vmyvxiAHpCYQ4eO8HR5hYC4QgZVcXrdlNVVsqM2mqm11RT7vfjdEy+qhyKtJKhJxSipaOTk+2d9ASCxFMpHLJMWYmf2TOmMa9xJuUlQ+cO/PVTf+WbP34ovxiy8YErV57HX/7yl/yqCWXSBeADH/gAzz//3LDxAJ+7/UPcduP1g8p27j/I//zyUba9sQ8lkxlUNxCbJOFxuVg0dxYXn7eCd6xYxsxptaNGHo0XXdc52tzKy9t38tL2XRw4dpxEKo2u6/mH5nDa7axetpR/uPV9LMrz/D3yxyf5zkOPDCrrwzAMLrvsCn7zm9/kV00oky4An/vc53jkkYeHjAewyzKPfOvfmNc4E7Jf+oe/+A0P/uYJKkpLaKirpaS4CJfTQTSeIByN0R0I0tbdM+RDF0WRuqoKblh7MVetWc28xpkjjkDGgmGa7DtyjGde3sSTG1+mKxDEMIz8w5BtNuqqKqkoLcFf5KPI4yGZThOMRDnR2kYoEuWeOz7E7etuyGnDtq5u1n3qniGFXNcNbr317/je976XXzWhTLoAPPDAA9x//zeGXAvw1X/4OOuu6I+OefC3T/DClu18+kPvZ9XSxYNDwk0zl7g5mU7zyvZdbNy6g8179tI5hB0hCAKzZkzjthtv4LpLL8LjcuUfMiLxZIonX3iJ//v7P9HU1jHk3HxtZQWrly5m7aoVXLhsKS6ns1/7DJA8Tdd5eftOfviL33LLO6/ilmuvytX94k9P8e2fPZz7uw9N07nvvi/x+c9/Pr9qQpl0AXjiiSe4666PnZIDYMGsRn79X/+R+3vfkWNs3LqDuz9w82AVnn3wpmlYQmAM+I0lEAePN/H0K5v580ub6A6G+s/NUuYv5okffoeaipE9b300tbXz3s/cO+SikmlVFdxw8RquXrOKOTOyC1b6MpOLotXw2Szl+epH1TS+9/Nfcss7r2ZGreUG1g2Dv/vCP7H/2OCZP1XVePDB9dx8882Dyica6b777vtqfuHpYmgqx37xP7Q/90cMEx7d8MIpCx2uvWQNq89dCtlB4vGWNtZduba/8U3rH9M0wTQwDQNTU9FTCbR4DDUSJBMJokbDFJkZVs6s47Z1N7Bm2VKKPB4SqTTRRBLDNFEyKpevPp+6qspBn2E4dh88xO+e/RtkVfu8+uncuPYi7r3tA3zqXVexuMxLkWiiJ2KoiSi6kgZdxzB0BFGyHJ+C9R0E+rWBJIqsPncJ+44ez80DiILA0ZMtp6we0jSdj61ZSuT536PGoxTNnpzMYpOiATpf+itdm57Hv2g5rZtf5N3/51FseRrgc7f/HbfdeANkV/AwlGPEStiPifUb03qwfZs6YGQFQ9fQUwnSvV2YmoajrBLJ6aK9N0hLTwCP18eyxQtPvf4wGIbBjt2vk1HSzKisoKqkmEwsjBaNIHm8OMoqEWU7gmTrf+sRso2d/Sd7r6E0gWEYg7Tc+kef4H9+NThTiGyaPPX5j+JfuJzuTc8x784v4G2YM+iYiWBSBGDnVz9Bxaq12EvK0XWdd3/iH2nu7BzUAF++6w5uufbqQecNRBdEYrIbUbIh2mwgijQ1NfGbH38fWRKQbTIej5vLr7qeGbV1OAUTm2mgp5KosTAgINntCKKEYLdjc7oRbGPwOpomRkZBV1IYmoqp6xgZBdHuwOYtQpAddPX2cvj4UU62NhMMhZg2ay4r1qylt7eXiqpaKsrLMQ0dU9dAVSnSkvl3GcSDv32CH/26XwAMw+Tcc+byyLe/AUD0yF4wTeZ8+NMDzpoYTjXNTxM1FkaNRdASMTKRIJIksWLhAgxjsJwlUulBfw/CNJFMA0F2YC8pp7i6jqoZDex6fTfRcDeBQBd7Dx/hiede4fkt2+jSBTYePMbeUBJKKnFV1SHZ7VZDqhlMNYOhqmPyOpqmga5mMNQMRiaDqarIvmIcFTXo/kq2tAf5l/+8n1///lE2vvYqf9z4Gi9t2Y6/vJz6xka27NxJxfQZFFXVIBWXIYnZvmCEewcjkUF/G4bBknnW257u7kC0ycSOHRjxGuNlwgVACfQgOV3oGYXuV54l1dnCqqWLThk6tXeP7AUzDYMSNc6smQ3U19dTU1NDJNhDebGX+uoyjnaEiSYVfvvYE7z69ONs2vAHgsk06ZJqot5ybOU1CJINU1UwNA1T10ZySPdjmlZ/rqqYqoLN68P0VxL2VWKUVpPWVEqLXMyZVkk8rROKp3l16y4e+sE3efLXPyUR7qWuro6GmTOpryzHk0kOOYIYSHt3z6C/DcNk2fx5xI4doPvVZ5HcXnQljZ4e2XU8HiZcAFJdrThKK9HiUUqXXgAmLJhR29c55mjv7h30dz6mpqKnk/Tu3YGpW7Ni9bPmUj9nAVW1dTRU+5k3rYwVs6uJtB8lGurlwjUXMWv2bHw10wi4y7BXWEIAliE2NgtAyH5UE8nlwSguJ1pUSfX0GcyeM5ul5y7HX1rBvCXLmVZRTHWJhwsXTMNM9NJ6bD9VtdMBUGNRgvt3YagKGH3W4KkYhkn3EIEfC6tKcJRV4W08BzPr81ATsfzDTpsJF4B0oAeb14eWiOGsrsNVPQ1vKkptZcWgN6Glq2v4N1IQEGUZNRomHeylbdsrZBIx1t18Cyc7egGRdyxu4Lx5M5g7vQJN0ymqmcWcOXNwOZ2UuRxUGinQNSSHC1G2I8r2U4yxoRBEEUGWEe0OBNmOXVepFlX8bheyLLNs+XIMdxmptEJjTQlXnzeXudMrkG0S4bTJ+2/9ELHOVtq2v4Iai6CnU5ahOIwE6IZOTzCc+9s0TeqrK3Gpaez+UpwVNWiJKLK3CKV34rOLTrgAKIEuZG+x1Yg2GT2dxFtWwQXzZg3qBlo7O0mlh7EDTAARuchPqquVeHszza/+DXcqynXXv4em9l40Q8ThcKDqIqpcyr333Etg/25aXvwrvTtfRe1qRY2EQBQRHU4EeYzzBYKAZHci2Z1g6GRCPaSbj9Lx2vO0bXqByLGDfO4z93D4RBsp1cRud2AKNtKmiw9/5BPobcfp3LWVVGcbaiKKzVs0ouCFYzEC4X4B0HWD5Q11OErKwDSxF5Wgp5LYfMWkezoGnTsRTPgoYP9/fx1XXT2J5mNUrFpLursdZ2UtG578E5/+0c+x2/uHgw9+7Z+5YKQVQX1DQF3H0DQEUcxqkeyQMOsdxDQwTcNSlYZhqXtBAEnKvv2O7Fs4dkxdw8go1kjAMKzrAoIkWWN9Mevs6RvyDehiTNO0homi5RQaiVd37uYTX+93iGUyGuu/8AkuuvhSlGA39pJyQru3INrteOoamH7dLYPOP11G/nTjQEvEkBwuBEHse5UxNJW6RDdep2NQN3DoRNOAM4dAEBAQESQbot2effhZdWqaWe+g5REUELLHOawfpwub04Nkd77pxgesazldSE43ksOJaHda3YiYdWjl7m8JpOURFBFs1mew/AOj3/dw08nc/03TpMztoF4JIUgSpq5b3gUBRLsDLXmqZ/J0Gf0TjgfTRLQ7UCMh7MWlJFtOICci3HLxKtaet4JLZlRwzaoVOMeSIlbICoIoIoiS5ReQZUTZjtTX2HYnosOJ5HAh9TWa3Ylgs42ofkdDEETrPg4Xkit7bYcL0eFElB2IshPBbtkXgk1GsNksv0POOTQ6boeda85fxiUN1bxj+bncvGIBmfZm1HgUQZIwNBVxLP6LcTLhXcDB9d/C7i9DS8RwlFfjrKimfcPvSTQfo/Tc1ZStWEPbXx/HXTsDX+M8q48cF1Y3YPaZV/3/TC5m3x2tx2b2DRrGeW8tHiV67ADpng5qr3g3rU/9llRnK2UrLqJk8Upixw8hOZykezspnrOIuitvzL/EaTHhGqBo9gKS7Sexl1agpxKYuk66uwNHeTWeGdYSsKLZC0i0Nln96yhj5OHJ9rs5V+v4GuBNI2RbPNfvj//epmliaCrJluMUzV6Ank5Tfv6liLKdVGcLgmQjE+zBWVlDqqOF4rkjryccDxMuAKVLzifRcgJnRTVaIoaRHc/7559rjclNE3ddPUrA8tub2uRHvhYqpqZiZBQy0TCumhmYho7dX4p35jlosSgANo8v58X01FlxExPJhAuAs7yKosZziJ84jKOiJqcq7SVllpUuCEguD86KalJdrRjqqcEQbxcMNWONksqrLENTtqMlE9iLS6zRD+CoqCayfxdVa66wbJoJZsIFAGDaO99LcM8WMA1Em5yV4kzWYrfwNc4j2XYScwpi3wsVQ82QbG/G1zgPsIaYhpLCUFXkIj9aMo4gSSRajlN98TvzT58QJkUAfI3z8NQ1oAR7UEK9lCw+j1RnG6JsTdAAuOtmkupqy86anRredbZj6hqmoZPu6cRdZ62PVKNh5OJS0j0dlJ67Gi0eJXbsINXvuBqbZ3KSSE+KAADMfM9HCL2+BT2Vonj+ubkhVLrb8mbZPF5sbi+ZcADjbWgHGJqKGg5ic3uQXB5MTUNPJdFTCYrmLMRRWoGWiJNsa6LuqpvyT58wJk0A3HUNVJx/CfGmwyi9XfgXLEONR7CXVuRcmu66BtI9nW9LQ9DUVNI9nbhqZgCQ6m5D9hWDIOKbNZ90TwfhA7upv+GDSK7JWx8waQIAUH/jh1GjIRJtJzAyCo7yajLhAFoibo0GameQ7u20AifeZhiaRrqnA3ftDIyMgqlpqIkY9uISMpEg8ROHcZaWU3nR0GsmJopJFQDJ6WLex+8jdmQ/0cNvIAgC7prp2P2lADir6sgEe62wriFCrScDIzPMBNQUYhrWnIUS6MZZVQeCgL2kHFdVHYaaIbJvJ5lQL+fcdW/WpT55TO7VAc+0mcy57dOE9u4g2dFsfVl/mTUcdDiR3B60eNR6KJOMGg2TCZ8aNTzVmLqOGotg83hzwz/ZVwxA9PAbJFqbWPAPX8HmnvwdxyddAABKl66yhoa7Np/ypjvLq1BCgSmxA6JH9iI539z6gMnA1DUyoV6cFTWDyrVkgvC+nZzzsS/iqp42qG6ymBIBAKi7ch2eunqCuzYNKndW1ua8gpOJqWtEj+xDtE/+itvRMDQNJdiDs7I/O4ppGHS99DTTrrkZ/3wrXH4qmDIBEESRWbd+gtjxg+hKf2ybs6IGJdg96V1AJhrOTqeOd+5hgjBNTF0j3duJq6p/r8BUZyuSw0ntFRM72TMaUyYAALKvmMrVlxPZv6u/rMiPnkqhK8op3cNEoiViYJpkQoHTmIA6fUzDwFDS6EoaOWsMY5qE9+2g7uqbxhW7cDpM7d2A2stuIHr0AJlQL2o0ROcLT2LqGlo8Mql2gC07lo4dP4gaDVkTVRkFI5NGTyfREjHUWBgtbk3CTBamrpGJhDB1jZ5Nz6El48Sbj4FpUrZk6jOmTng8wFgIH3ydY7/4HwSbzLSr1hE/eZRUbyf+BcsnzeVp6hotf/olajxKzWU3DL6PaZJsbyYTCVJ8zhIcZRXjnuIdDS0RI7R3O+7KWuQiP92vPY/N7eOcj33hFKNwKjgjAkB2KIQAgigRObSHww89QPXaG7AX+cccTfNm0ZIJujdtQOntomTxebhqpiOIIloijqmrKKFePNNm4iiryj91YjBNMpEgHc/9kfl3fxnfrPmWE6xvYekZ4MzcNTvzJWTj63wz54JhWAEkk2gM2tweaq+4kfr3fARHeVUuftFZWYO7roHSJasmr/GzWkiLRxFlGe/McwAr9vBMNT5nUgAGItqd+BcsI9XRgq5Ys4WTiSjbcVXV4ZneiORy5xZ6Tpbm6UPPKKS62ihZuOKMNvpACuNTABUXrCXReuLsDRAxTQw1Q6L5GJUXXp5fe8YoGAHwzTwnu8w7PqFCkFasa/UtRu3bVjaVVtB1A03TcxtIZlTLGdV3bN+5E4GhqaixCKJsx1s/8cu8x0vBCIDkcFJ5wVpixw6+qQmbviF9KGqtm1MyKplsgwZCEWySRDKtIAgCumGQyjZqSskgSSKSJJLKdjtpJYNpmui6gZJREUWRQNgaFibTCmpWQPru9Wb8CYaSJn7iEJUXrEWYol1Bx0LBCABA1UVXkWw/ia6kR3QKqVm3cSyRhGwWEZ/HGufLsg273Yqj93rc2GwSDlnG7XQgiSLF2fy8pcXWMFAQBPw+a9KlyGvtC1zkdSNJEnbZhs9jzR24HI5cnqO+fEOGaRKNJzBME22EqCZT19FSCdJdbVRfcm1+9RmloATAWVaFb+Zckm0nMQa4iwei6zqabmCa4HE5EbKh4bbsWzVwNy5HVhBEDLREjGT7SSKH9hBvOowaDWPqVjialoyTbD1h1Z08ihLoQtAsTWHPprK1osCta9uzC1okUbRyHWe1hqYNLQRGJk2y/SRFcxflZv0KhTPmBxiO8IHdHHn4B1Rfeh32opJTLPNkKn1KgulUWsHlHDzJoyXjxJuOkAkHUWMhREnG5vVZuQuSCVLd7eipBIgSNpcbu78MuagEwMoOkk4hyHbcNdPx1M85xWof6nPEkym87rzZRtMgEw7SufEp5n38vlwAaKFQcAJg6hq7v/EZvA1z8dTPRnIOHQ4VjEQpLbZWFSlKBsebzRZqmoOcUfmCNhpKRs1pmJ5QmIphsoHq6STxE4dJdbay5N5vnyJIZ5rC+jRZx0j9utsIH9htZd8axtByDMik/aYbH0unCzbbuMf/fY1P1j4YEtNET6eIHNpD/Y0fKrjGpxAFAKBk0UpkX3HWIOy3BdJKJmdsefLUr6pp6LqOMYzA9GFkFBItJ8hEgujpFFoyQaqzlWR7c/6hp6DrxpAGX5/aTyuZQXaArqRItp/EUVJB8bwlA84oHApSAARRZObNHyW8ZxtaMp4bEfRZ4X3j9oH/TysZJEkacUtWANFuR3K6SLY1ET28h8TJwxgZBWfZ6DkEJUlEFITcPft+m9lchKIo5tK/mYaBlogT3reThvfcPumxfeOl4GyAgRz6ybdRYxFKlq4aFB8XiSVyQ7aMquWs8jeDkc0EJiBYGUTGMTbvu7em6aQUJTcUJTvrF9yzFUeRn7kfndx0r6dDYYpllpnv/SiJ1hMoga5B3sG+xmfAkKzPKTNW54wo27G5vUhuz5gbP/8effe22aRB1r+hKqR7u0i2HKfh5jty5YVIQQuAvbiUme/9KIEdr1qRw9m1hYIg5Boho6qomkZG1dB0nXhyaP/BQJSMmuvHDcPq0/tcxCMRy6aeTSsZDMPyFpIViD6BNA0DNRYlsP1lGm+5C3txNuqnQCloAQCoWHUpRY3zCe7Zai2Zzja8blgGmWGY2CQJh11GEAQ8LteQqeT70A0DWbZh6AbpTIZkKo0kikiSdEoyyz7MbJZyj8uFALicDgRBwDAMDMPo1zqmiRaLENz9Gv55S6k4/5L8SxUcBS8AgiAy+7ZPYaoZIgd2oyWt2D5b1uBzOuy5t08SRUTRMtKG6wok0TLk7HYZp92ON+vq7Tt3KPosf0nqSwxlaSGX09Fv+JlmLtpHEETm3PbpcQ0vp5qCFwAAyeFi4ae/hhLsIbRnG2q8XxMwYNYuFLEmaVxOy0UMEItbeXr7BMIwzFw3oWoapmmiajqJVHrQMQDR7LmSKOZcwtF4ArLexz5M00CNhQnseAU9GWfhZ78+trzEBcBbQgDIRg8v/fJ3EWU7PZv/hhLqza0plLOJE/p2JRn44rlclpMmmW0wQegft/fNI9hlm+XWzZ4Yz+7m5c6eO5B+49NqYFPTUHq76Nz4F+z+MpZ+6bvYXCNvlFVIvGUEAEBF5Pj8S9nYkaT9+T+RaD6Gnk7lGr7I60HT9OxbraGqGjZJQtU0PC4nmq5jGAYZVcXM7jkEVnJmTdPQNA3DMCnyuNE0HZsk5YxLTdfRDSM31JNEAT2dJHp0H60b/sgrMRsn51/M5C5vmXgK2g8wkKbWdu75/v8l7qtDySjMSrRxc+J1ps9fhH/hcmzeYoRsIklV01GUDD6v1ViRWIJin4e0ksFhl1EyKrJNQjdMNE3L9uPWjGJG1XA67ERicYp9XgzTJJlK47Tbc44oa2lXgODrm2k9cZxHi1ZyQi7D6bAz3Qjx/S99Et8o2+UVCm8JAQiGI9z9nz8mVTmHTDpFPNiLnlF4d2Azl/hNJIcL/6KVeOtnW2v/smpaVTUEQUCySbkg74GbNYSjcfxFQy/ANE3Q8roY0zTQ4jGih98gcvB1BEFkU1zid8UrQXZgs9txOF0sc0T55hc+mXfFwqTguwDTNPnBL54gVTYTQZRQEla2zET7cVSbHWd5NfaScoK7NtG+4XfEm49aaWhME1m2YWIiDDAU+yJ8ovFErvHD0TimaRIIRzGBlKLk7AjZZmU201IJogf30Pb0o8SOHcBdNxNnRQ1Ju5tMb6t1TCaDzeVh474TI++HUEAUvACEozG2NIcQZIf1kLMuXCWVoFsVEEQJe1ExvlnzsLk8dL+6gba/Pkb06H70dBJb1j6Qs+q7otSatrVJUm7iyJ0NLPG4nAgD3nibKKAlYoT376T1yV8T3L0ZZ0U13oY52NweEEXa4iq6aaImrRGIrqrIJdVs2f1G9hsUNgUvAH97bTtiWXapdDYxY99iiqBiWAt4RAlBsmEvraB47mJs3mICO1+l5c+/IrhzE0pPJ4KhDwozc7ucuYmjPpeu02HHNAxEXSXZdpLeLRtp+fOviBx4HVdVHUVzFiIXlVix/JIEmITTKppu5GYtRUnC6S/jlW27c/cqZAreBrjz69+j1z87t6Y32tNJJpkgcGgHy5wq9y6vwVFakXcWgImeSqIEuslEgsjeIpyVtTjKKrGXVmBzWusByMbr68k4SqCLdKCHVFcrpqpi95fhKKvILik/1amTCfXwHzs6OCKXIZdNQ/YWUVIzzdrM6sBL/Hn9d/NPKTgKWgBaOrq49d9/Qsmc/vXySiJOPNRL+OgeltrifHFF3TACMADTChHrW/ypJeNW9k3BqkPITg55fMjeIuSikjElklCCPXxzWwtvZJwUz12Oy1eMp6QMgO5dL/LUA/9Mqb+wYgDzKWgB+Nr317Mj6Ubw9IdbmaZJpKudVDiA48hr/Pctl+KSbePLNdi3DK0vBfyboG8G8Qu/fZ6W8nPwTZtNcWVNLupHDXdzfaOPT/zde/POLCwK1gYIRWP8ZfNunP7Bu30KgoC3tBy7r5j4tEV85aUj6NUNOErLEW02BEkc+48sWz/55SP8iLINR2k57pnzeORYmCPOGjw1DfjKKweFfLnKqvnlhk10jLI30pmmYDXAf65/mJfbU4il/Vk0BqIk4sTDAZI9bTiCLdy37jJWNlSjBnusTCDDTAaNF0EQsXmLsJeW0xZJ8B+Pb+BA1KBszhJ85VXIjsEhagBiOoa3+xAPfetfcl7HQqMgBeDA0RPc8bXv03jx9cRHGE8rqQSJYC+ZeITI8X2saaziMzdcSoXbTiYczArC8AtMxoIgStg8Puz+UpK6ya9e3M4vXtyOXDGNkpkLKCqvQhpmPyJRFFG7mlhd6+LLf397bh6hkCg4AQiGI3zovvupWHEZ4bQ26ousZRRigR4MLUO8sxm9p5nb167kvRcuwy4J/UZfJpO1+MZA38ZRHh82jxcTgZf3HeOBP71AdzJDSeNCimsb8PjLRo30ddplevdv4/0XLuTO968bYixxZikoAQiEInz2P34ADeeSMCT0EZaHDcQ0DBLhIEoybmUDaz5MiR7js++6lDXzrE0qTF1HTycxFGsjKAb6BUTR2iPIJiM5nYgOV65hj3X28v0/b2TrkRbclXWUz1mKt6wC25vINuZ1OejYs5mbzpvLJz/0voLSBAUhAKYJz726hW89/Duqzn0HCb0/5OvNoClp4uEguqZCJkXg8G5WN1TyhRsvp9Q39AKT4choOj/ZsIlfbNyOzeunZNZC/DX1ODxDzx2Mht/nof2NLVy7cDqfveODBSMEBSEAj/1lAw88/hzzLr6GYDQxVkU9NKZJKh4lFbX24ku2HcMMtPKft7+bxfX9eflGIqlk+Mef/o49Ld34G+ZRPH023pJyxNMw5ITsgtS2vdtY21jGfXd/JP+QM8LIHdgUoGkaDz72FEsuu45wInV6jY/Vf7t8xRRX1WGzO3DVNmKfMZ8v/vxPtPT2b9A4HKmMyn0P/4n9vUlqll1M+exFFJVXnVbjk7U+gtE40xefz+MvbmPX/kP5h5wRpPvuu++r+YVTSVrJ8PMNm/FPnzWhM2iiKOLweK3gTUEC2cGuPXu4bsXCYdWvaZr88KkX+duhNqoWX0BxVe24Vf5waLqBU5b4wxNPcOxkK7F4EqfDjtNhxzYJW8KMxpR1AaZpkkilicbiNLV1cPj4SQ6caOZ4aycne6MsuGIdodjEb4wIoCkKsWA3qZMH+Np1K1kxy9rgOZ9tR07ymYf+SOXiNZROm4ltuDV/p4FNksh0HqflwB5KqmsJtbeSjIUpdjuZP3sma1YsZcXi+TRMq8Vf5Jt0/8GEC4CuG4Sj1n64Ta3tHD3Zyv4jxzl0/CRRRcWQ7PjKayif0Yi7pBxEG7v+8iiL115L3JDGZfyNiK6S6W1H1zWSGZ2GZAvfuf1dpwzHDMPk7v/9LScML+U107E7ndhLq6Fv9/EJwuWwEzy8Gx2R2ctXI0kihqqSioUJtJwg1NNBItCDoSkUuRwsnTeH85cuZPG8OcyorabMXzysBhsPpyUAyXSaEy3tvHHwCIebmtl3+BhHm1pIqzqiw4mnuAxvWQXeihrcJRWYooSWXYhhmv2RuuloiETzQaatuCSXwmUi0KMBOl5/DamsjkwiihINUV7q5+Hbr8Sdt6L4YFsXd/7v77AXl2FzenB4fWR62qhacgHOktHXDY6V8mIfrz/7BFXnXozNYcUhWFHHNhx2GYcsW6FnuoaaUYh3dxDsbifa3YGSiFFZ7Oaai1fzjvOWMX9WAy7nqR7IN8ObFoDuQJAXt+zkD8++wM59B9EM8JaWU1RWRVFFNUWVNdjcPlTdRFFVdMPK5jEagaNvML1xLinJOSFaQI0GaN62keI5y3Jj+kjzEQw1zb9eu5JLFs4edPwPn3yRx3Y3YfcVUzzdSuJk6BqhQzuZeeHV1o7op4lNknDqKY4f3EvlvOX51TkEQcAhyzgdMk67jGyzIQiCFZKWUeg6cYTuk8dQI71csmIR1156Eeefu+iUFdNjYUwCYJomO/cd5Ce/+T0bXtmCy19KTeM8KutnUVxZS0Y3SCsZUoqCOkyalNEwdJ3gwe00nn8p0cToy7tGwlSSHH/5L/hmLUaS+/txQ9foPbCdaxbU8083X5Er1w2DWx94hPa0QPk5lsBYD9xEU1JEju2l8ZLrsTlGnyIeiVKfm/0vP0PVkjWjehAHIorWAhiX3TIWpey5hqHT3XSU5v27yYS6eN81a7nluitpbLB2IRsLowrAviPH+foP1rNj70GmLziXhkUr8JZVYhgmiXSaeDI17kbPJxXqwSOZSKU1476maRq0bvorkr+Kopp6XEXFiJLNchKFAkTbjlNjy/DQx96V60u7I3Fu/OZP8U2fS0n9XDz+MiRZxtA1UrEIoeZjCMkwdauuHPdqH6ddpvfgLsSSKtwlo8QvjICQTY7hdjlwO+y5ANdkNMyxXZtpO/A6V6xYyJc/9TGmz7A2pBqJYcUwFk/w5e/8Nzfd/XnCUhFX3P4ZFl3yTpzFZQSjMdp6AoSi8XE31FC4Siro7e7GK4/f8g2fOICim1TMWoC3tBzJZq0ZlJ0uisqrcJfX0NLVQzqb8g3gYGsnpiDiq5mBr7wSKbvoQ5RsePxlVM1djKJqxFuPDrjT2BEFgUyoi3gqdVqNT9afkM5kCEZitPUECUSiZFQNd5GfxZdcw2W3fYo9QZUrbv803/3fn5EeJfPqkAKw/+hx1v395/nr5j2sfs/tzL3wckSHk2AkRkcgSDzZv4xqovE3nMPJPVvx5SdbGgNqMkbXwd3MWHkJ8hARPZIs4y2tAHcxe5racuWvn2jDWVyOt6xqyEQOstPFtOXvoGP/jkEZS8aKjM6J3VuoGqHfHw/W0FqhMxCiKxgmnVGxu9wsv3odS6++mfV/2MD7PnkvJ1rb80/Nccq3fWnrTt77yXsRy6ax+ubb8ZVVkUwrdPSGiKfSYzLoTgfRJiP5K0l1N+cieceEadK5+1Uq5i7FPsJmS05vEe6SSg61dUN2HmJvcye+6mnYh5jT78Pu8VE+Zwmdr7+aXzUisiRxctuLVC9cOeY8BONByah0B8N0ByOomkbVzDlc8sGP05URedfH/pGNm3fknwL5AvDilh3c9eX7qV96AeesuQJBEAlF4/SGoxhjnJmbCDwVtbQ3HcfnkE8Zrw9HoruNdDJOaeOC/KpBCKKIq7SC9qC1PkA3DDrCUTwVtaP27/6GeWSSCdIhS3hGQxAEkh0nkN1eHP7TU/1jJZ3J0BkIE4knkB1OVl57M8XTZvGxL/0bT73wSv7h/QKwa/8hPv5P9zN9wTJmrbwIwzTpDkWIjSHhwmTgb1zIiR0v4xlDV2DqOl17tzBt+cVjsq695dV0Jyx/g2YYpHRwjiGBoyCK1Jy7hq43towptsCOTvfhPZRNsOofDdM0icSTdAbCGCYsvex6Sqc38vl/f4Bte/YPOlYku0rmc9/4Lr6KWuZeeBmGYdAdjAxKxjTV2N1eFGzokZ7csGc4wk0H8JRV4Sodm8PGZncQ1qy3PRhLYDo82OzDq/+BOP3lOP3lJNpO5FcNQpJEWna8TN2i88YVdDoRqJpGVyCMbpqsuOYmnCWV3PXlb9Da2a/BRNM0+fcf/YyWrl6WXH4DgiDSG4mOKWXKZFM+ZzFHd2zC5x7eJ6+nk4SbDlK56M3ttxPWBNREjPaubrD1J5kYC5ULVtB9+HUYYctbJdCBLAL+yduAYizohkFXMIIpiKy4ah1xReVTX/0Wum516eLx5jYef/o5Zi49H3eRn2giSVo5841PdhjmnTab7sN7htUCXXu3ULt4FYJt6Li84VAMiLS10NHain2IEcNICDY7VfOXEziwLb8KAEkQ6N63jYpFF+RXnREMw6A7FMHh9bH0suvYte8QP3vsjwD8P973TANjHy0JAAAAAElFTkSuQmCC + + + diff --git a/dictionaries/ui/pages/login/fr.dictionary.itop.login.php b/dictionaries/ui/pages/login/fr.dictionary.itop.login.php index fefa3a0f88..b48c919ad0 100644 --- a/dictionaries/ui/pages/login/fr.dictionary.itop.login.php +++ b/dictionaries/ui/pages/login/fr.dictionary.itop.login.php @@ -36,7 +36,7 @@ Dict::Add('FR FR', 'French', 'Français', [ 'UI:ResetPwd-Ready' => 'Le mot de passe a bien été changé.', 'UI:ResetPwd-Login' => 'Cliquez ici pour vous connecter...', - 'UI:Login:About' => ITOP_APPLICATION.' Powered by Combodo~~', + 'UI:Login:About' => ITOP_APPLICATION.' Powered by Combodo', 'UI:Login:ChangeYourPassword' => 'Changer de mot de passe', 'UI:Login:OldPasswordPrompt' => 'Ancien mot de passe', 'UI:Login:NewPasswordPrompt' => 'Nouveau mot de passe', diff --git a/images/icons/icons8-enclosure.svg b/images/icons/icons8-enclosure.svg new file mode 100644 index 0000000000..02a640dc3c --- /dev/null +++ b/images/icons/icons8-enclosure.svg @@ -0,0 +1,402 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/autoload_runtime.php b/lib/autoload_runtime.php new file mode 100644 index 0000000000..6b53445873 --- /dev/null +++ b/lib/autoload_runtime.php @@ -0,0 +1,31 @@ + 'resources/symfony/.env', + 'project_dir' => dirname(__DIR__, 1), +]); + +[$app, $args] = $runtime + ->getResolver($app) + ->resolve(); + +$app = $app(...$args); + +exit( + $runtime + ->getRunner($app) + ->run() +); diff --git a/lib/composer/autoload_classmap.php b/lib/composer/autoload_classmap.php index 161f6e2dc8..084c426979 100644 --- a/lib/composer/autoload_classmap.php +++ b/lib/composer/autoload_classmap.php @@ -964,6 +964,7 @@ return array( 'IntervalExpression' => $baseDir . '/core/oql/expression.class.inc.php', 'IntervalOqlExpression' => $baseDir . '/core/oql/oqlquery.class.inc.php', 'IntlDateFormatter' => $vendorDir . '/symfony/polyfill-intl-icu/Resources/stubs/IntlDateFormatter.php', + 'IntlListFormatter' => $vendorDir . '/symfony/polyfill-intl-icu/Resources/stubs/IntlListFormatter.php', 'Introspection' => $baseDir . '/core/introspection.class.inc.php', 'InvalidConfigParamException' => $baseDir . '/application/exceptions/InvalidConfigParamException.php', 'InvalidExternalKeyValueException' => $baseDir . '/application/exceptions/InvalidExternalKeyValueException.php', @@ -1610,6 +1611,11 @@ return array( 'Symfony\\Bridge\\Twig\\TokenParser\\TransTokenParser' => $vendorDir . '/symfony/twig-bridge/TokenParser/TransTokenParser.php', 'Symfony\\Bridge\\Twig\\Translation\\TwigExtractor' => $vendorDir . '/symfony/twig-bridge/Translation/TwigExtractor.php', 'Symfony\\Bridge\\Twig\\UndefinedCallableHandler' => $vendorDir . '/symfony/twig-bridge/UndefinedCallableHandler.php', + 'Symfony\\Bundle\\DebugBundle\\Command\\ServerDumpPlaceholderCommand' => $vendorDir . '/symfony/debug-bundle/Command/ServerDumpPlaceholderCommand.php', + 'Symfony\\Bundle\\DebugBundle\\DebugBundle' => $vendorDir . '/symfony/debug-bundle/DebugBundle.php', + 'Symfony\\Bundle\\DebugBundle\\DependencyInjection\\Compiler\\DumpDataCollectorPass' => $vendorDir . '/symfony/debug-bundle/DependencyInjection/Compiler/DumpDataCollectorPass.php', + 'Symfony\\Bundle\\DebugBundle\\DependencyInjection\\Configuration' => $vendorDir . '/symfony/debug-bundle/DependencyInjection/Configuration.php', + 'Symfony\\Bundle\\DebugBundle\\DependencyInjection\\DebugExtension' => $vendorDir . '/symfony/debug-bundle/DependencyInjection/DebugExtension.php', 'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\AbstractPhpFileCacheWarmer' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/AbstractPhpFileCacheWarmer.php', 'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\AnnotationsCacheWarmer' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/AnnotationsCacheWarmer.php', 'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\CachePoolClearerCacheWarmer' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/CachePoolClearerCacheWarmer.php', @@ -1813,6 +1819,7 @@ return array( 'Symfony\\Component\\Cache\\Traits\\Relay\\Relay121Trait' => $vendorDir . '/symfony/cache/Traits/Relay/Relay121Trait.php', 'Symfony\\Component\\Cache\\Traits\\Relay\\Relay12Trait' => $vendorDir . '/symfony/cache/Traits/Relay/Relay12Trait.php', 'Symfony\\Component\\Cache\\Traits\\Relay\\Relay20Trait' => $vendorDir . '/symfony/cache/Traits/Relay/Relay20Trait.php', + 'Symfony\\Component\\Cache\\Traits\\Relay\\Relay21Trait' => $vendorDir . '/symfony/cache/Traits/Relay/Relay21Trait.php', 'Symfony\\Component\\Cache\\Traits\\Relay\\SwapdbTrait' => $vendorDir . '/symfony/cache/Traits/Relay/SwapdbTrait.php', 'Symfony\\Component\\Config\\Builder\\ClassBuilder' => $vendorDir . '/symfony/config/Builder/ClassBuilder.php', 'Symfony\\Component\\Config\\Builder\\ConfigBuilderGenerator' => $vendorDir . '/symfony/config/Builder/ConfigBuilderGenerator.php', @@ -2261,6 +2268,7 @@ return array( 'Symfony\\Component\\Dotenv\\Exception\\FormatException' => $vendorDir . '/symfony/dotenv/Exception/FormatException.php', 'Symfony\\Component\\Dotenv\\Exception\\FormatExceptionContext' => $vendorDir . '/symfony/dotenv/Exception/FormatExceptionContext.php', 'Symfony\\Component\\Dotenv\\Exception\\PathException' => $vendorDir . '/symfony/dotenv/Exception/PathException.php', + 'Symfony\\Component\\Dotenv\\Exception\\VariableCircularReferenceException' => $vendorDir . '/symfony/dotenv/Exception/VariableCircularReferenceException.php', 'Symfony\\Component\\ErrorHandler\\BufferingLogger' => $vendorDir . '/symfony/error-handler/BufferingLogger.php', 'Symfony\\Component\\ErrorHandler\\Debug' => $vendorDir . '/symfony/error-handler/Debug.php', 'Symfony\\Component\\ErrorHandler\\DebugClassLoader' => $vendorDir . '/symfony/error-handler/DebugClassLoader.php', @@ -3078,6 +3086,21 @@ return array( 'Symfony\\Component\\Routing\\RouteCompilerInterface' => $vendorDir . '/symfony/routing/RouteCompilerInterface.php', 'Symfony\\Component\\Routing\\Router' => $vendorDir . '/symfony/routing/Router.php', 'Symfony\\Component\\Routing\\RouterInterface' => $vendorDir . '/symfony/routing/RouterInterface.php', + 'Symfony\\Component\\Runtime\\GenericRuntime' => $vendorDir . '/symfony/runtime/GenericRuntime.php', + 'Symfony\\Component\\Runtime\\Internal\\BasicErrorHandler' => $vendorDir . '/symfony/runtime/Internal/BasicErrorHandler.php', + 'Symfony\\Component\\Runtime\\Internal\\ComposerPlugin' => $vendorDir . '/symfony/runtime/Internal/ComposerPlugin.php', + 'Symfony\\Component\\Runtime\\Internal\\MissingDotenv' => $vendorDir . '/symfony/runtime/Internal/MissingDotenv.php', + 'Symfony\\Component\\Runtime\\Internal\\SymfonyErrorHandler' => $vendorDir . '/symfony/runtime/Internal/SymfonyErrorHandler.php', + 'Symfony\\Component\\Runtime\\ResolverInterface' => $vendorDir . '/symfony/runtime/ResolverInterface.php', + 'Symfony\\Component\\Runtime\\Resolver\\ClosureResolver' => $vendorDir . '/symfony/runtime/Resolver/ClosureResolver.php', + 'Symfony\\Component\\Runtime\\Resolver\\DebugClosureResolver' => $vendorDir . '/symfony/runtime/Resolver/DebugClosureResolver.php', + 'Symfony\\Component\\Runtime\\RunnerInterface' => $vendorDir . '/symfony/runtime/RunnerInterface.php', + 'Symfony\\Component\\Runtime\\Runner\\ClosureRunner' => $vendorDir . '/symfony/runtime/Runner/ClosureRunner.php', + 'Symfony\\Component\\Runtime\\Runner\\Symfony\\ConsoleApplicationRunner' => $vendorDir . '/symfony/runtime/Runner/Symfony/ConsoleApplicationRunner.php', + 'Symfony\\Component\\Runtime\\Runner\\Symfony\\HttpKernelRunner' => $vendorDir . '/symfony/runtime/Runner/Symfony/HttpKernelRunner.php', + 'Symfony\\Component\\Runtime\\Runner\\Symfony\\ResponseRunner' => $vendorDir . '/symfony/runtime/Runner/Symfony/ResponseRunner.php', + 'Symfony\\Component\\Runtime\\RuntimeInterface' => $vendorDir . '/symfony/runtime/RuntimeInterface.php', + 'Symfony\\Component\\Runtime\\SymfonyRuntime' => $vendorDir . '/symfony/runtime/SymfonyRuntime.php', 'Symfony\\Component\\Security\\Core\\AuthenticationEvents' => $vendorDir . '/symfony/security-core/AuthenticationEvents.php', 'Symfony\\Component\\Security\\Core\\Authentication\\AuthenticationTrustResolver' => $vendorDir . '/symfony/security-core/Authentication/AuthenticationTrustResolver.php', 'Symfony\\Component\\Security\\Core\\Authentication\\AuthenticationTrustResolverInterface' => $vendorDir . '/symfony/security-core/Authentication/AuthenticationTrustResolverInterface.php', @@ -3569,6 +3592,7 @@ return array( 'Symfony\\Polyfill\\Intl\\Icu\\Exception\\RuntimeException' => $vendorDir . '/symfony/polyfill-intl-icu/Exception/RuntimeException.php', 'Symfony\\Polyfill\\Intl\\Icu\\Icu' => $vendorDir . '/symfony/polyfill-intl-icu/Icu.php', 'Symfony\\Polyfill\\Intl\\Icu\\IntlDateFormatter' => $vendorDir . '/symfony/polyfill-intl-icu/IntlDateFormatter.php', + 'Symfony\\Polyfill\\Intl\\Icu\\IntlListFormatter' => $vendorDir . '/symfony/polyfill-intl-icu/IntlListFormatter.php', 'Symfony\\Polyfill\\Intl\\Icu\\Locale' => $vendorDir . '/symfony/polyfill-intl-icu/Locale.php', 'Symfony\\Polyfill\\Intl\\Icu\\NumberFormatter' => $vendorDir . '/symfony/polyfill-intl-icu/NumberFormatter.php', 'Symfony\\Polyfill\\Intl\\Idn\\Idn' => $vendorDir . '/symfony/polyfill-intl-idn/Idn.php', @@ -3578,6 +3602,13 @@ return array( 'Symfony\\Polyfill\\Intl\\Normalizer\\Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Normalizer.php', 'Symfony\\Polyfill\\Mbstring\\Mbstring' => $vendorDir . '/symfony/polyfill-mbstring/Mbstring.php', 'Symfony\\Polyfill\\Php83\\Php83' => $vendorDir . '/symfony/polyfill-php83/Php83.php', + 'Symfony\\Runtime\\Symfony\\Component\\Console\\ApplicationRuntime' => $vendorDir . '/symfony/runtime/Internal/Console/ApplicationRuntime.php', + 'Symfony\\Runtime\\Symfony\\Component\\Console\\Command\\CommandRuntime' => $vendorDir . '/symfony/runtime/Internal/Console/Command/CommandRuntime.php', + 'Symfony\\Runtime\\Symfony\\Component\\Console\\Input\\InputInterfaceRuntime' => $vendorDir . '/symfony/runtime/Internal/Console/Input/InputInterfaceRuntime.php', + 'Symfony\\Runtime\\Symfony\\Component\\Console\\Output\\OutputInterfaceRuntime' => $vendorDir . '/symfony/runtime/Internal/Console/Output/OutputInterfaceRuntime.php', + 'Symfony\\Runtime\\Symfony\\Component\\HttpFoundation\\RequestRuntime' => $vendorDir . '/symfony/runtime/Internal/HttpFoundation/RequestRuntime.php', + 'Symfony\\Runtime\\Symfony\\Component\\HttpFoundation\\ResponseRuntime' => $vendorDir . '/symfony/runtime/Internal/HttpFoundation/ResponseRuntime.php', + 'Symfony\\Runtime\\Symfony\\Component\\HttpKernel\\HttpKernelInterfaceRuntime' => $vendorDir . '/symfony/runtime/Internal/HttpKernel/HttpKernelInterfaceRuntime.php', 'SynchroExceptionNotStarted' => $baseDir . '/application/exceptions/SynchroExceptionNotStarted.php', 'System' => $vendorDir . '/pear/pear-core-minimal/src/System.php', 'TCPDF' => $vendorDir . '/tecnickcom/tcpdf/tcpdf.php', diff --git a/lib/composer/autoload_files.php b/lib/composer/autoload_files.php index 26e7e23456..b0244afb94 100644 --- a/lib/composer/autoload_files.php +++ b/lib/composer/autoload_files.php @@ -10,8 +10,8 @@ return array( '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', '662a729f963d39afe703c9d9b7ab4a8c' => $vendorDir . '/symfony/polyfill-php83/bootstrap.php', - 'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php', '667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php', + 'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php', '89efb1254ef2d1c5d80096acd12c4098' => $vendorDir . '/twig/twig/src/Resources/core.php', 'ffecb95d45175fd40f75be8a23b34f90' => $vendorDir . '/twig/twig/src/Resources/debug.php', 'c7baa00073ee9c61edf148c51917cfb4' => $vendorDir . '/twig/twig/src/Resources/escaper.php', diff --git a/lib/composer/autoload_psr4.php b/lib/composer/autoload_psr4.php index 15036b1a53..22fc9f0a3b 100644 --- a/lib/composer/autoload_psr4.php +++ b/lib/composer/autoload_psr4.php @@ -8,6 +8,7 @@ $baseDir = dirname($vendorDir); return array( 'Twig\\' => array($vendorDir . '/twig/twig/src'), 'TheNetworg\\OAuth2\\Client\\' => array($vendorDir . '/thenetworg/oauth2-azure/src'), + 'Symfony\\Runtime\\Symfony\\Component\\' => array($vendorDir . '/symfony/runtime/Internal'), 'Symfony\\Polyfill\\Php83\\' => array($vendorDir . '/symfony/polyfill-php83'), 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'), 'Symfony\\Polyfill\\Intl\\Normalizer\\' => array($vendorDir . '/symfony/polyfill-intl-normalizer'), @@ -27,6 +28,7 @@ return array( 'Symfony\\Component\\Stopwatch\\' => array($vendorDir . '/symfony/stopwatch'), 'Symfony\\Component\\Security\\Csrf\\' => array($vendorDir . '/symfony/security-csrf'), 'Symfony\\Component\\Security\\Core\\' => array($vendorDir . '/symfony/security-core'), + 'Symfony\\Component\\Runtime\\' => array($vendorDir . '/symfony/runtime'), 'Symfony\\Component\\Routing\\' => array($vendorDir . '/symfony/routing'), 'Symfony\\Component\\PropertyInfo\\' => array($vendorDir . '/symfony/property-info'), 'Symfony\\Component\\PropertyAccess\\' => array($vendorDir . '/symfony/property-access'), @@ -50,6 +52,7 @@ return array( 'Symfony\\Bundle\\WebProfilerBundle\\' => array($vendorDir . '/symfony/web-profiler-bundle'), 'Symfony\\Bundle\\TwigBundle\\' => array($vendorDir . '/symfony/twig-bundle'), 'Symfony\\Bundle\\FrameworkBundle\\' => array($vendorDir . '/symfony/framework-bundle'), + 'Symfony\\Bundle\\DebugBundle\\' => array($vendorDir . '/symfony/debug-bundle'), 'Symfony\\Bridge\\Twig\\' => array($vendorDir . '/symfony/twig-bridge'), 'Soundasleep\\' => array($vendorDir . '/soundasleep/html2text/src'), 'ScssPhp\\ScssPhp\\' => array($vendorDir . '/scssphp/scssphp/src'), diff --git a/lib/composer/installed.json b/lib/composer/installed.json index 66435c1a11..7d46b66031 100644 --- a/lib/composer/installed.json +++ b/lib/composer/installed.json @@ -239,17 +239,17 @@ }, { "name": "firebase/php-jwt", - "version": "v7.0.3", - "version_normalized": "7.0.3.0", + "version": "v7.0.5", + "version_normalized": "7.0.5.0", "source": { "type": "git", - "url": "https://github.com/firebase/php-jwt.git", - "reference": "28aa0694bcfdfa5e2959c394d5a1ee7a5083629e" + "url": "https://github.com/googleapis/php-jwt.git", + "reference": "47ad26bab5e7c70ae8a6f08ed25ff83631121380" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/28aa0694bcfdfa5e2959c394d5a1ee7a5083629e", - "reference": "28aa0694bcfdfa5e2959c394d5a1ee7a5083629e", + "url": "https://api.github.com/repos/googleapis/php-jwt/zipball/47ad26bab5e7c70ae8a6f08ed25ff83631121380", + "reference": "47ad26bab5e7c70ae8a6f08ed25ff83631121380", "shasum": "" }, "require": { @@ -257,6 +257,7 @@ }, "require-dev": { "guzzlehttp/guzzle": "^7.4", + "phpfastcache/phpfastcache": "^9.2", "phpspec/prophecy-phpunit": "^2.0", "phpunit/phpunit": "^9.5", "psr/cache": "^2.0||^3.0", @@ -267,7 +268,7 @@ "ext-sodium": "Support EdDSA (Ed25519) signatures", "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" }, - "time": "2026-02-25T22:16:40+00:00", + "time": "2026-04-01T20:38:03+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -298,8 +299,8 @@ "php" ], "support": { - "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v7.0.3" + "issues": "https://github.com/googleapis/php-jwt/issues", + "source": "https://github.com/googleapis/php-jwt/tree/v7.0.5" }, "install-path": "../firebase/php-jwt" }, @@ -520,17 +521,17 @@ }, { "name": "guzzlehttp/psr7", - "version": "2.8.0", - "version_normalized": "2.8.0.0", + "version": "2.9.0", + "version_normalized": "2.9.0.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "21dc724a0583619cd1652f673303492272778051" + "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", - "reference": "21dc724a0583619cd1652f673303492272778051", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/7d0ed42f28e42d61352a7a79de682e5e67fec884", + "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884", "shasum": "" }, "require": { @@ -546,12 +547,13 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "http-interop/http-factory-tests": "0.9.0", + "jshttp/mime-db": "1.54.0.1", "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, - "time": "2025-08-23T21:21:41+00:00", + "time": "2026-03-10T16:41:02+00:00", "type": "library", "extra": { "bamarni-bin": { @@ -619,7 +621,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.8.0" + "source": "https://github.com/guzzle/psr7/tree/2.9.0" }, "funding": [ { @@ -707,21 +709,21 @@ }, { "name": "league/oauth2-google", - "version": "4.1.0", - "version_normalized": "4.1.0.0", + "version": "4.2.0", + "version_normalized": "4.2.0.0", "source": { "type": "git", "url": "https://github.com/thephpleague/oauth2-google.git", - "reference": "8b9bb43740ac6d994aca881a35f7bacbe98c0ffb" + "reference": "72be69505f890ea8b6d4e716f619b3c10a1f5010" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/oauth2-google/zipball/8b9bb43740ac6d994aca881a35f7bacbe98c0ffb", - "reference": "8b9bb43740ac6d994aca881a35f7bacbe98c0ffb", + "url": "https://api.github.com/repos/thephpleague/oauth2-google/zipball/72be69505f890ea8b6d4e716f619b3c10a1f5010", + "reference": "72be69505f890ea8b6d4e716f619b3c10a1f5010", "shasum": "" }, "require": { - "league/oauth2-client": "^2.0", + "league/oauth2-client": "^2.0 || ^3.0", "php": "^7.3 || ^8.0" }, "require-dev": { @@ -729,7 +731,7 @@ "phpunit/phpunit": "^8.0 || ^9.0", "squizlabs/php_codesniffer": "^3.0" }, - "time": "2025-12-15T12:24:14+00:00", + "time": "2026-03-09T09:36:58+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -759,7 +761,7 @@ ], "support": { "issues": "https://github.com/thephpleague/oauth2-google/issues", - "source": "https://github.com/thephpleague/oauth2-google/tree/4.1.0" + "source": "https://github.com/thephpleague/oauth2-google/tree/4.2.0" }, "install-path": "../league/oauth2-google" }, @@ -770,12 +772,12 @@ "source": { "type": "git", "url": "https://github.com/Combodo/PHP-Parser.git", - "reference": "b2cd0735eb27788d5d41fa3c2cfaa01a593fd7fb" + "reference": "b27e577f70d2114b8ba96105e403017919a8611b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Combodo/PHP-Parser/zipball/b2cd0735eb27788d5d41fa3c2cfaa01a593fd7fb", - "reference": "b2cd0735eb27788d5d41fa3c2cfaa01a593fd7fb", + "url": "https://api.github.com/repos/Combodo/PHP-Parser/zipball/b27e577f70d2114b8ba96105e403017919a8611b", + "reference": "b27e577f70d2114b8ba96105e403017919a8611b", "shasum": "" }, "require": { @@ -788,7 +790,7 @@ "ircmaxell/php-yacc": "^0.0.7", "phpunit/phpunit": "^9.0" }, - "time": "2025-09-18T12:29:15+00:00", + "time": "2026-03-31T15:49:45+00:00", "default-branch": true, "bin": [ "bin/php-parse" @@ -1809,17 +1811,17 @@ }, { "name": "symfony/cache", - "version": "v6.4.34", - "version_normalized": "6.4.34.0", + "version": "v6.4.36", + "version_normalized": "6.4.36.0", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "a0a1690543329685c044362c873b78c6de9d4faa" + "reference": "5b94fba945d1f9e7929cffd50e7a17f1ac36f10b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/a0a1690543329685c044362c873b78c6de9d4faa", - "reference": "a0a1690543329685c044362c873b78c6de9d4faa", + "url": "https://api.github.com/repos/symfony/cache/zipball/5b94fba945d1f9e7929cffd50e7a17f1ac36f10b", + "reference": "5b94fba945d1f9e7929cffd50e7a17f1ac36f10b", "shasum": "" }, "require": { @@ -1853,7 +1855,7 @@ "symfony/messenger": "^5.4|^6.0|^7.0", "symfony/var-dumper": "^5.4|^6.0|^7.0" }, - "time": "2026-02-20T15:06:30+00:00", + "time": "2026-03-30T14:52:43+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -1888,7 +1890,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v6.4.34" + "source": "https://github.com/symfony/cache/tree/v6.4.36" }, "funding": [ { @@ -2073,17 +2075,17 @@ }, { "name": "symfony/console", - "version": "v6.4.34", - "version_normalized": "6.4.34.0", + "version": "v6.4.36", + "version_normalized": "6.4.36.0", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "7b1f1c37eff5910ddda2831345467e593a5120ad" + "reference": "9f481cfb580db8bcecc9b2d4c63f3e13df022ad5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/7b1f1c37eff5910ddda2831345467e593a5120ad", - "reference": "7b1f1c37eff5910ddda2831345467e593a5120ad", + "url": "https://api.github.com/repos/symfony/console/zipball/9f481cfb580db8bcecc9b2d4c63f3e13df022ad5", + "reference": "9f481cfb580db8bcecc9b2d4c63f3e13df022ad5", "shasum": "" }, "require": { @@ -2116,7 +2118,7 @@ "symfony/stopwatch": "^5.4|^6.0|^7.0", "symfony/var-dumper": "^5.4|^6.0|^7.0" }, - "time": "2026-02-23T15:42:15+00:00", + "time": "2026-03-27T15:30:51+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -2150,7 +2152,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.34" + "source": "https://github.com/symfony/console/tree/v6.4.36" }, "funding": [ { @@ -2245,18 +2247,99 @@ "install-path": "../symfony/css-selector" }, { - "name": "symfony/dependency-injection", - "version": "v6.4.34", - "version_normalized": "6.4.34.0", + "name": "symfony/debug-bundle", + "version": "v6.4.35", + "version_normalized": "6.4.35.0", "source": { "type": "git", - "url": "https://github.com/symfony/dependency-injection.git", - "reference": "91e49958b8a6092e48e4711894a1aeb1b151c62a" + "url": "https://github.com/symfony/debug-bundle.git", + "reference": "eb79084c2c9778559b21f61cb1507cbd580cc6e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/91e49958b8a6092e48e4711894a1aeb1b151c62a", - "reference": "91e49958b8a6092e48e4711894a1aeb1b151c62a", + "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/eb79084c2c9778559b21f61cb1507cbd580cc6e1", + "reference": "eb79084c2c9778559b21f61cb1507cbd580cc6e1", + "shasum": "" + }, + "require": { + "ext-xml": "*", + "php": ">=8.1", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/twig-bridge": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony/config": "<5.4", + "symfony/dependency-injection": "<5.4" + }, + "require-dev": { + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/web-profiler-bundle": "^5.4|^6.0|^7.0" + }, + "time": "2026-03-02T09:25:10+00:00", + "type": "symfony-bundle", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\DebugBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a tight integration of the Symfony VarDumper component and the ServerLogCommand from MonologBridge into the Symfony full-stack framework", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/debug-bundle/tree/v6.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/debug-bundle" + }, + { + "name": "symfony/dependency-injection", + "version": "v6.4.36", + "version_normalized": "6.4.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "cd7881a6dc84b780411199cd0584e1a53a3b9ba7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/cd7881a6dc84b780411199cd0584e1a53a3b9ba7", + "reference": "cd7881a6dc84b780411199cd0584e1a53a3b9ba7", "shasum": "" }, "require": { @@ -2282,7 +2365,7 @@ "symfony/expression-language": "^5.4|^6.0|^7.0", "symfony/yaml": "^5.4|^6.0|^7.0" }, - "time": "2026-02-24T15:33:38+00:00", + "time": "2026-03-30T16:39:36+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -2310,7 +2393,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v6.4.34" + "source": "https://github.com/symfony/dependency-injection/tree/v6.4.36" }, "funding": [ { @@ -2404,17 +2487,17 @@ }, { "name": "symfony/dotenv", - "version": "v6.4.30", - "version_normalized": "6.4.30.0", + "version": "v6.4.36", + "version_normalized": "6.4.36.0", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "924edbc9631b75302def0258ed1697948b17baf6" + "reference": "cae019cc92a46fe9e498ea011107f26bdf5d897f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/924edbc9631b75302def0258ed1697948b17baf6", - "reference": "924edbc9631b75302def0258ed1697948b17baf6", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/cae019cc92a46fe9e498ea011107f26bdf5d897f", + "reference": "cae019cc92a46fe9e498ea011107f26bdf5d897f", "shasum": "" }, "require": { @@ -2428,7 +2511,7 @@ "symfony/console": "^5.4|^6.0|^7.0", "symfony/process": "^5.4|^6.0|^7.0" }, - "time": "2025-11-14T17:33:48+00:00", + "time": "2026-03-30T07:25:04+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -2461,7 +2544,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v6.4.30" + "source": "https://github.com/symfony/dotenv/tree/v6.4.36" }, "funding": [ { @@ -2485,17 +2568,17 @@ }, { "name": "symfony/error-handler", - "version": "v6.4.32", - "version_normalized": "6.4.32.0", + "version": "v6.4.36", + "version_normalized": "6.4.36.0", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "8c18400784fcb014dc73c8d5601a9576af7f8ad4" + "reference": "2ea68f0e1835ad6a126f93bbc14cd236c10ab361" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/8c18400784fcb014dc73c8d5601a9576af7f8ad4", - "reference": "8c18400784fcb014dc73c8d5601a9576af7f8ad4", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/2ea68f0e1835ad6a126f93bbc14cd236c10ab361", + "reference": "2ea68f0e1835ad6a126f93bbc14cd236c10ab361", "shasum": "" }, "require": { @@ -2512,7 +2595,7 @@ "symfony/http-kernel": "^6.4|^7.0", "symfony/serializer": "^5.4|^6.0|^7.0" }, - "time": "2026-01-19T19:28:19+00:00", + "time": "2026-03-10T15:56:14+00:00", "bin": [ "Resources/bin/patch-type-declarations" ], @@ -2543,7 +2626,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.4.32" + "source": "https://github.com/symfony/error-handler/tree/v6.4.36" }, "funding": [ { @@ -2567,17 +2650,17 @@ }, { "name": "symfony/event-dispatcher", - "version": "v6.4.32", - "version_normalized": "6.4.32.0", + "version": "v6.4.36", + "version_normalized": "6.4.36.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "99d7e101826e6610606b9433248f80c1997cd20b" + "reference": "fc828863e26ceec86e2513b5e46aa0b149d76b69" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/99d7e101826e6610606b9433248f80c1997cd20b", - "reference": "99d7e101826e6610606b9433248f80c1997cd20b", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/fc828863e26ceec86e2513b5e46aa0b149d76b69", + "reference": "fc828863e26ceec86e2513b5e46aa0b149d76b69", "shasum": "" }, "require": { @@ -2602,7 +2685,7 @@ "symfony/service-contracts": "^2.5|^3", "symfony/stopwatch": "^5.4|^6.0|^7.0" }, - "time": "2026-01-05T11:13:48+00:00", + "time": "2026-03-30T11:18:01+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -2630,7 +2713,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.32" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.36" }, "funding": [ { @@ -2877,17 +2960,17 @@ }, { "name": "symfony/form", - "version": "v6.4.34", - "version_normalized": "6.4.34.0", + "version": "v6.4.36", + "version_normalized": "6.4.36.0", "source": { "type": "git", "url": "https://github.com/symfony/form.git", - "reference": "ed9275a133809bb48d949ba6dfdc808a819ebea2" + "reference": "3a38a81150400f0a486f8963e21a195311b30b27" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/ed9275a133809bb48d949ba6dfdc808a819ebea2", - "reference": "ed9275a133809bb48d949ba6dfdc808a819ebea2", + "url": "https://api.github.com/repos/symfony/form/zipball/3a38a81150400f0a486f8963e21a195311b30b27", + "reference": "3a38a81150400f0a486f8963e21a195311b30b27", "shasum": "" }, "require": { @@ -2929,7 +3012,7 @@ "symfony/validator": "^5.4|^6.0|^7.0", "symfony/var-dumper": "^5.4|^6.0|^7.0" }, - "time": "2026-02-23T17:59:52+00:00", + "time": "2026-03-13T14:59:02+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -2957,7 +3040,7 @@ "description": "Allows to easily create, process and reuse HTML forms", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/form/tree/v6.4.34" + "source": "https://github.com/symfony/form/tree/v6.4.36" }, "funding": [ { @@ -2981,17 +3064,17 @@ }, { "name": "symfony/framework-bundle", - "version": "v6.4.34", - "version_normalized": "6.4.34.0", + "version": "v6.4.36", + "version_normalized": "6.4.36.0", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "5b5d19473f22d699811a41b01cef2462bc42b238" + "reference": "147b02cfa45dcc74a290462551f5ee5c7fa8ab17" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/5b5d19473f22d699811a41b01cef2462bc42b238", - "reference": "5b5d19473f22d699811a41b01cef2462bc42b238", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/147b02cfa45dcc74a290462551f5ee5c7fa8ab17", + "reference": "147b02cfa45dcc74a290462551f5ee5c7fa8ab17", "shasum": "" }, "require": { @@ -3085,7 +3168,7 @@ "symfony/yaml": "^5.4|^6.0|^7.0", "twig/twig": "^2.10|^3.0.4" }, - "time": "2026-02-24T16:00:52+00:00", + "time": "2026-03-25T17:41:29+00:00", "type": "symfony-bundle", "installation-source": "dist", "autoload": { @@ -3113,7 +3196,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v6.4.34" + "source": "https://github.com/symfony/framework-bundle/tree/v6.4.36" }, "funding": [ { @@ -3137,17 +3220,17 @@ }, { "name": "symfony/http-foundation", - "version": "v6.4.34", - "version_normalized": "6.4.34.0", + "version": "v6.4.35", + "version_normalized": "6.4.35.0", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "5bb346d1b4b2a616e5c3d99b3ee4d5810735c535" + "reference": "cffffd0a2c037117b742b4f8b379a22a2a33f6d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/5bb346d1b4b2a616e5c3d99b3ee4d5810735c535", - "reference": "5bb346d1b4b2a616e5c3d99b3ee4d5810735c535", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/cffffd0a2c037117b742b4f8b379a22a2a33f6d2", + "reference": "cffffd0a2c037117b742b4f8b379a22a2a33f6d2", "shasum": "" }, "require": { @@ -3169,7 +3252,7 @@ "symfony/mime": "^5.4|^6.0|^7.0", "symfony/rate-limiter": "^5.4|^6.0|^7.0" }, - "time": "2026-02-21T15:48:41+00:00", + "time": "2026-03-06T11:15:58+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -3197,7 +3280,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.34" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.35" }, "funding": [ { @@ -3221,17 +3304,17 @@ }, { "name": "symfony/http-kernel", - "version": "v6.4.34", - "version_normalized": "6.4.34.0", + "version": "v6.4.36", + "version_normalized": "6.4.36.0", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "006a49fc4f41ee21a6ca61e69caed1c30b29f07c" + "reference": "4087ec02119de450e9ebb60806d69c6bb8c6e468" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/006a49fc4f41ee21a6ca61e69caed1c30b29f07c", - "reference": "006a49fc4f41ee21a6ca61e69caed1c30b29f07c", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/4087ec02119de450e9ebb60806d69c6bb8c6e468", + "reference": "4087ec02119de450e9ebb60806d69c6bb8c6e468", "shasum": "" }, "require": { @@ -3290,7 +3373,7 @@ "symfony/var-exporter": "^6.2|^7.0", "twig/twig": "^2.13|^3.0.4" }, - "time": "2026-02-26T08:27:11+00:00", + "time": "2026-03-31T20:38:11+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -3318,7 +3401,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.4.34" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.36" }, "funding": [ { @@ -3429,17 +3512,17 @@ }, { "name": "symfony/mime", - "version": "v6.4.34", - "version_normalized": "6.4.34.0", + "version": "v6.4.36", + "version_normalized": "6.4.36.0", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "2b32fbbe10b36a8379efab6e702ad8b917151839" + "reference": "9c31726137c70798f815fb98293ffb8a2a47694c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/2b32fbbe10b36a8379efab6e702ad8b917151839", - "reference": "2b32fbbe10b36a8379efab6e702ad8b917151839", + "url": "https://api.github.com/repos/symfony/mime/zipball/9c31726137c70798f815fb98293ffb8a2a47694c", + "reference": "9c31726137c70798f815fb98293ffb8a2a47694c", "shasum": "" }, "require": { @@ -3465,7 +3548,7 @@ "symfony/property-info": "^5.4|^6.0|^7.0", "symfony/serializer": "^6.4.3|^7.0.3" }, - "time": "2026-02-02T17:01:23+00:00", + "time": "2026-03-30T09:31:23+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -3497,7 +3580,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.34" + "source": "https://github.com/symfony/mime/tree/v6.4.36" }, "funding": [ { @@ -3674,17 +3757,17 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.33.0", - "version_normalized": "1.33.0.0", + "version": "v1.36.0", + "version_normalized": "1.36.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + "reference": "141046a8f9477948ff284fa65be2095baafb94f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2", "shasum": "" }, "require": { @@ -3696,7 +3779,7 @@ "suggest": { "ext-ctype": "For best performance" }, - "time": "2024-09-09T11:45:10+00:00", + "time": "2026-04-10T16:19:22+00:00", "type": "library", "extra": { "thanks": { @@ -3736,7 +3819,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.36.0" }, "funding": [ { @@ -3760,17 +3843,17 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.33.0", - "version_normalized": "1.33.0.0", + "version": "v1.36.0", + "version_normalized": "1.36.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" + "reference": "ad1b7b9092976d6c948b8a187cec9faaea9ec1df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/ad1b7b9092976d6c948b8a187cec9faaea9ec1df", + "reference": "ad1b7b9092976d6c948b8a187cec9faaea9ec1df", "shasum": "" }, "require": { @@ -3779,7 +3862,7 @@ "suggest": { "ext-intl": "For best performance" }, - "time": "2025-06-27T09:58:17+00:00", + "time": "2026-04-10T16:19:22+00:00", "type": "library", "extra": { "thanks": { @@ -3821,7 +3904,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.36.0" }, "funding": [ { @@ -3845,17 +3928,17 @@ }, { "name": "symfony/polyfill-intl-icu", - "version": "v1.33.0", - "version_normalized": "1.33.0.0", + "version": "v1.36.0", + "version_normalized": "1.36.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c" + "reference": "3510b63d07376b04e57e27e82607d468bb134f78" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c", - "reference": "bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/3510b63d07376b04e57e27e82607d468bb134f78", + "reference": "3510b63d07376b04e57e27e82607d468bb134f78", "shasum": "" }, "require": { @@ -3864,7 +3947,7 @@ "suggest": { "ext-intl": "For best performance and support of other locales than \"en\"" }, - "time": "2025-06-20T22:24:30+00:00", + "time": "2026-04-10T16:50:15+00:00", "type": "library", "extra": { "thanks": { @@ -3912,7 +3995,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.36.0" }, "funding": [ { @@ -3936,8 +4019,8 @@ }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.33.0", - "version_normalized": "1.33.0.0", + "version": "v1.36.0", + "version_normalized": "1.36.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", @@ -4002,7 +4085,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.36.0" }, "funding": [ { @@ -4026,8 +4109,8 @@ }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.33.0", - "version_normalized": "1.33.0.0", + "version": "v1.36.0", + "version_normalized": "1.36.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", @@ -4090,7 +4173,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.36.0" }, "funding": [ { @@ -4114,17 +4197,17 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.33.0", - "version_normalized": "1.33.0.0", + "version": "v1.36.0", + "version_normalized": "1.36.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6a21eb99c6973357967f6ce3708cd55a6bec6315", + "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315", "shasum": "" }, "require": { @@ -4137,7 +4220,7 @@ "suggest": { "ext-mbstring": "For best performance" }, - "time": "2024-12-23T08:48:59+00:00", + "time": "2026-04-10T17:25:58+00:00", "type": "library", "extra": { "thanks": { @@ -4178,7 +4261,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.36.0" }, "funding": [ { @@ -4202,23 +4285,23 @@ }, { "name": "symfony/polyfill-php83", - "version": "v1.33.0", - "version_normalized": "1.33.0.0", + "version": "v1.36.0", + "version_normalized": "1.36.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" + "reference": "3600c2cb22399e25bb226e4a135ce91eeb2a6149" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/3600c2cb22399e25bb226e4a135ce91eeb2a6149", + "reference": "3600c2cb22399e25bb226e4a135ce91eeb2a6149", "shasum": "" }, "require": { "php": ">=7.2" }, - "time": "2025-07-08T02:45:35+00:00", + "time": "2026-04-10T17:25:58+00:00", "type": "library", "extra": { "thanks": { @@ -4261,7 +4344,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.36.0" }, "funding": [ { @@ -4551,18 +4634,104 @@ "install-path": "../symfony/routing" }, { - "name": "symfony/security-core", - "version": "v6.4.31", - "version_normalized": "6.4.31.0", + "name": "symfony/runtime", + "version": "v6.4.30", + "version_normalized": "6.4.30.0", "source": { "type": "git", - "url": "https://github.com/symfony/security-core.git", - "reference": "fa269ad61a021cc54329dc96e57bed78ba720bfe" + "url": "https://github.com/symfony/runtime.git", + "reference": "fb3149ee85d3b639dd3e49ea9dda05656f0537e3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/fa269ad61a021cc54329dc96e57bed78ba720bfe", - "reference": "fa269ad61a021cc54329dc96e57bed78ba720bfe", + "url": "https://api.github.com/repos/symfony/runtime/zipball/fb3149ee85d3b639dd3e49ea9dda05656f0537e3", + "reference": "fb3149ee85d3b639dd3e49ea9dda05656f0537e3", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0|^2.0", + "php": ">=8.1" + }, + "conflict": { + "symfony/dotenv": "<5.4" + }, + "require-dev": { + "composer/composer": "^1.0.2|^2.0", + "symfony/console": "^5.4.9|^6.0.9|^7.0", + "symfony/dotenv": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0" + }, + "time": "2025-12-05T10:55:13+00:00", + "type": "composer-plugin", + "extra": { + "class": "Symfony\\Component\\Runtime\\Internal\\ComposerPlugin" + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Runtime\\": "", + "Symfony\\Runtime\\Symfony\\Component\\": "Internal/" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Enables decoupling PHP applications from global state", + "homepage": "https://symfony.com", + "keywords": [ + "runtime" + ], + "support": { + "source": "https://github.com/symfony/runtime/tree/v6.4.30" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/runtime" + }, + { + "name": "symfony/security-core", + "version": "v6.4.36", + "version_normalized": "6.4.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-core.git", + "reference": "1b7db28bcc3655543abfe58764025aef563705cd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-core/zipball/1b7db28bcc3655543abfe58764025aef563705cd", + "reference": "1b7db28bcc3655543abfe58764025aef563705cd", "shasum": "" }, "require": { @@ -4593,7 +4762,7 @@ "symfony/translation": "^5.4.35|~6.3.12|^6.4.3|^7.0.3", "symfony/validator": "^6.4|^7.0" }, - "time": "2025-12-17T22:32:13+00:00", + "time": "2026-03-31T01:40:43+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -4621,7 +4790,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v6.4.31" + "source": "https://github.com/symfony/security-core/tree/v6.4.36" }, "funding": [ { @@ -5056,17 +5225,17 @@ }, { "name": "symfony/twig-bridge", - "version": "v6.4.34", - "version_normalized": "6.4.34.0", + "version": "v6.4.36", + "version_normalized": "6.4.36.0", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "5169074f4a88dfb02eeccddaba78edfdf212a9b2" + "reference": "3ae963a108fd6fc14d09a7fe5e41fe64d8ac11ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/5169074f4a88dfb02eeccddaba78edfdf212a9b2", - "reference": "5169074f4a88dfb02eeccddaba78edfdf212a9b2", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/3ae963a108fd6fc14d09a7fe5e41fe64d8ac11ba", + "reference": "3ae963a108fd6fc14d09a7fe5e41fe64d8ac11ba", "shasum": "" }, "require": { @@ -5120,7 +5289,7 @@ "twig/inky-extra": "^2.12|^3", "twig/markdown-extra": "^2.12|^3" }, - "time": "2026-02-23T18:17:33+00:00", + "time": "2026-03-30T09:31:23+00:00", "type": "symfony-bridge", "installation-source": "dist", "autoload": { @@ -5148,7 +5317,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v6.4.34" + "source": "https://github.com/symfony/twig-bridge/tree/v6.4.36" }, "funding": [ { @@ -5263,17 +5432,17 @@ }, { "name": "symfony/validator", - "version": "v6.4.34", - "version_normalized": "6.4.34.0", + "version": "v6.4.36", + "version_normalized": "6.4.36.0", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "7c3897b7f739d4ab913481e680405ca82d08084d" + "reference": "14921e87b2bd69dfbd9757cdb1c6974a1316aac5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/7c3897b7f739d4ab913481e680405ca82d08084d", - "reference": "7c3897b7f739d4ab913481e680405ca82d08084d", + "url": "https://api.github.com/repos/symfony/validator/zipball/14921e87b2bd69dfbd9757cdb1c6974a1316aac5", + "reference": "14921e87b2bd69dfbd9757cdb1c6974a1316aac5", "shasum": "" }, "require": { @@ -5314,7 +5483,7 @@ "symfony/translation": "^5.4.35|~6.3.12|^6.4.3|^7.0.3", "symfony/yaml": "^5.4|^6.0|^7.0" }, - "time": "2026-02-23T17:49:24+00:00", + "time": "2026-03-26T15:58:46+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -5343,7 +5512,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v6.4.34" + "source": "https://github.com/symfony/validator/tree/v6.4.36" }, "funding": [ { @@ -5367,17 +5536,17 @@ }, { "name": "symfony/var-dumper", - "version": "v6.4.32", - "version_normalized": "6.4.32.0", + "version": "v6.4.36", + "version_normalized": "6.4.36.0", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "131fc9915e0343052af5ed5040401b481ca192aa" + "reference": "7c8ad9ce4faf6c8a99948e70ce02b601a0439782" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/131fc9915e0343052af5ed5040401b481ca192aa", - "reference": "131fc9915e0343052af5ed5040401b481ca192aa", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/7c8ad9ce4faf6c8a99948e70ce02b601a0439782", + "reference": "7c8ad9ce4faf6c8a99948e70ce02b601a0439782", "shasum": "" }, "require": { @@ -5396,7 +5565,7 @@ "symfony/uid": "^5.4|^6.0|^7.0", "twig/twig": "^2.13|^3.0.4" }, - "time": "2026-01-01T13:34:06+00:00", + "time": "2026-03-30T15:36:00+00:00", "bin": [ "Resources/bin/var-dump-server" ], @@ -5434,7 +5603,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.32" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.36" }, "funding": [ { @@ -5458,17 +5627,17 @@ }, { "name": "symfony/var-exporter", - "version": "v6.4.26", - "version_normalized": "6.4.26.0", + "version": "v6.4.36", + "version_normalized": "6.4.36.0", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "466fcac5fa2e871f83d31173f80e9c2684743bfc" + "reference": "f9c4a9695a9e2bbc65c920e147d8d7ae28f8d79a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/466fcac5fa2e871f83d31173f80e9c2684743bfc", - "reference": "466fcac5fa2e871f83d31173f80e9c2684743bfc", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/f9c4a9695a9e2bbc65c920e147d8d7ae28f8d79a", + "reference": "f9c4a9695a9e2bbc65c920e147d8d7ae28f8d79a", "shasum": "" }, "require": { @@ -5480,7 +5649,7 @@ "symfony/serializer": "^6.4|^7.0", "symfony/var-dumper": "^5.4|^6.0|^7.0" }, - "time": "2025-09-11T09:57:09+00:00", + "time": "2026-03-10T15:06:19+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -5518,7 +5687,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.4.26" + "source": "https://github.com/symfony/var-exporter/tree/v6.4.36" }, "funding": [ { @@ -5542,17 +5711,17 @@ }, { "name": "symfony/web-profiler-bundle", - "version": "v6.4.34", - "version_normalized": "6.4.34.0", + "version": "v6.4.36", + "version_normalized": "6.4.36.0", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "848bc5d5745500f855bb201d57ae066fd7e67448" + "reference": "6f75b4c748886c8e04a3674225d00eaa51f3842d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/848bc5d5745500f855bb201d57ae066fd7e67448", - "reference": "848bc5d5745500f855bb201d57ae066fd7e67448", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/6f75b4c748886c8e04a3674225d00eaa51f3842d", + "reference": "6f75b4c748886c8e04a3674225d00eaa51f3842d", "shasum": "" }, "require": { @@ -5576,7 +5745,7 @@ "symfony/css-selector": "^5.4|^6.0|^7.0", "symfony/stopwatch": "^5.4|^6.0|^7.0" }, - "time": "2026-02-05T15:19:06+00:00", + "time": "2026-03-17T09:05:06+00:00", "type": "symfony-bundle", "installation-source": "dist", "autoload": { @@ -5607,7 +5776,7 @@ "dev" ], "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.4.34" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.4.36" }, "funding": [ { @@ -5710,24 +5879,24 @@ }, { "name": "tecnickcom/tcpdf", - "version": "6.11.0", - "version_normalized": "6.11.0.0", + "version": "6.11.2", + "version_normalized": "6.11.2.0", "source": { "type": "git", "url": "https://github.com/tecnickcom/TCPDF.git", - "reference": "81172e58edb1cfae4019ef150ccbdc0e9a8c85c9" + "reference": "e1e2ade18e574e963473f53271591edd8c0033ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tecnickcom/TCPDF/zipball/81172e58edb1cfae4019ef150ccbdc0e9a8c85c9", - "reference": "81172e58edb1cfae4019ef150ccbdc0e9a8c85c9", + "url": "https://api.github.com/repos/tecnickcom/TCPDF/zipball/e1e2ade18e574e963473f53271591edd8c0033ec", + "reference": "e1e2ade18e574e963473f53271591edd8c0033ec", "shasum": "" }, "require": { "ext-curl": "*", "php": ">=7.1.0" }, - "time": "2026-03-01T09:35:25+00:00", + "time": "2026-03-03T08:58:10+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -5772,7 +5941,7 @@ ], "support": { "issues": "https://github.com/tecnickcom/TCPDF/issues", - "source": "https://github.com/tecnickcom/TCPDF/tree/6.11.0" + "source": "https://github.com/tecnickcom/TCPDF/tree/6.11.2" }, "funding": [ { @@ -5847,17 +6016,17 @@ }, { "name": "twig/twig", - "version": "v3.23.0", - "version_normalized": "3.23.0.0", + "version": "v3.24.0", + "version_normalized": "3.24.0.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "a64dc5d2cc7d6cafb9347f6cd802d0d06d0351c9" + "reference": "a6769aefb305efef849dc25c9fd1653358c148f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/a64dc5d2cc7d6cafb9347f6cd802d0d06d0351c9", - "reference": "a64dc5d2cc7d6cafb9347f6cd802d0d06d0351c9", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/a6769aefb305efef849dc25c9fd1653358c148f0", + "reference": "a6769aefb305efef849dc25c9fd1653358c148f0", "shasum": "" }, "require": { @@ -5867,11 +6036,12 @@ "symfony/polyfill-mbstring": "^1.3" }, "require-dev": { - "phpstan/phpstan": "^2.0", + "php-cs-fixer/shim": "^3.0@stable", + "phpstan/phpstan": "^2.0@stable", "psr/container": "^1.0|^2.0", "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" }, - "time": "2026-01-23T21:00:41+00:00", + "time": "2026-03-17T21:31:11+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -5913,7 +6083,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.23.0" + "source": "https://github.com/twigphp/Twig/tree/v3.24.0" }, "funding": [ { @@ -5930,6 +6100,7 @@ ], "dev": true, "dev-package-names": [ + "symfony/debug-bundle", "symfony/stopwatch", "symfony/web-profiler-bundle" ] diff --git a/lib/composer/platform_check.php b/lib/composer/platform_check.php index dee74e1736..bb733000d3 100644 --- a/lib/composer/platform_check.php +++ b/lib/composer/platform_check.php @@ -4,8 +4,8 @@ $issues = array(); -if (!(PHP_VERSION_ID >= 80100)) { - $issues[] = 'Your Composer dependencies require a PHP version ">= 8.1.0". You are running ' . PHP_VERSION . '.'; +if (!(PHP_VERSION_ID >= 80200)) { + $issues[] = 'Your Composer dependencies require a PHP version ">= 8.2.0". You are running ' . PHP_VERSION . '.'; } $missingExtensions = array(); diff --git a/lib/firebase/php-jwt/CHANGELOG.md b/lib/firebase/php-jwt/CHANGELOG.md index 32a5433ac7..498fb0007a 100644 --- a/lib/firebase/php-jwt/CHANGELOG.md +++ b/lib/firebase/php-jwt/CHANGELOG.md @@ -1,5 +1,20 @@ # Changelog +## [7.0.5](https://github.com/firebase/php-jwt/compare/v7.0.4...v7.0.5) (2026-03-31) + + +### Bug Fixes + +* RSA from JWK sometimes returns empty Instance ([#628](https://github.com/firebase/php-jwt/issues/628)) ([b4c78aa](https://github.com/firebase/php-jwt/commit/b4c78aa731664122198ad36c0033aa29e807397a)) + +## [7.0.4](https://github.com/firebase/php-jwt/compare/v7.0.3...v7.0.4) (2026-03-27) + + +### Bug Fixes + +* readme examples, add tests for all examples ([#626](https://github.com/firebase/php-jwt/issues/626)) ([510a00c](https://github.com/firebase/php-jwt/commit/510a00c0e6353bc7d68412fab67e57a13954cb46)) +* use urlsafeB64Decode everywhere ([#627](https://github.com/firebase/php-jwt/issues/627)) ([b889495](https://github.com/firebase/php-jwt/commit/b889495c83ddc3f3885ca3f0b65b41b1cb37a3b1)) + ## [7.0.3](https://github.com/firebase/php-jwt/compare/v7.0.2...v7.0.3) (2026-02-18) diff --git a/lib/firebase/php-jwt/README.md b/lib/firebase/php-jwt/README.md index 65b6c8609d..2ca7162247 100644 --- a/lib/firebase/php-jwt/README.md +++ b/lib/firebase/php-jwt/README.md @@ -23,16 +23,16 @@ php env does not have libsodium installed: composer require paragonie/sodium_compat ``` -Example -------- +## Example + ```php use Firebase\JWT\JWT; use Firebase\JWT\Key; -$key = 'example_key'; +$key = 'example_key_of_sufficient_length'; $payload = [ - 'iss' => 'http://example.org', - 'aud' => 'http://example.com', + 'iss' => 'example.org', + 'aud' => 'example.com', 'iat' => 1356999524, 'nbf' => 1357000000 ]; @@ -69,8 +69,9 @@ $decoded_array = (array) $decoded; JWT::$leeway = 60; // $leeway in seconds $decoded = JWT::decode($jwt, new Key($key, 'HS256')); ``` -Example encode/decode headers -------- + +## Example encode/decode headers + Decoding the JWT headers without verifying the JWT first is NOT recommended, and is not supported by this library. This is because without verifying the JWT, the header values could have been tampered with. Any value pulled from an unverified header should be treated as if it could be any string sent in from an @@ -80,10 +81,10 @@ header part: ```php use Firebase\JWT\JWT; -$key = 'example_key'; +$key = 'example_key_of_sufficient_length'; $payload = [ - 'iss' => 'http://example.org', - 'aud' => 'http://example.com', + 'iss' => 'example.org', + 'aud' => 'example.com', 'iat' => 1356999524, 'nbf' => 1357000000 ]; @@ -103,8 +104,9 @@ $decoded = json_decode(base64_decode($headersB64), true); print_r($decoded); ``` -Example with RS256 (openssl) ----------------------------- + +## Example with RS256 (openssl) + ```php use Firebase\JWT\JWT; use Firebase\JWT\Key; @@ -172,8 +174,7 @@ $decoded_array = (array) $decoded; echo "Decode:\n" . print_r($decoded_array, true) . "\n"; ``` -Example with a passphrase -------------------------- +## Example with a passphrase ```php use Firebase\JWT\JWT; @@ -209,8 +210,8 @@ $decoded = JWT::decode($jwt, new Key($publicKey, 'RS256')); echo "Decode:\n" . print_r((array) $decoded, true) . "\n"; ``` -Example with EdDSA (libsodium and Ed25519 signature) ----------------------------- +## Example with EdDSA (libsodium and Ed25519 signature) + ```php use Firebase\JWT\JWT; use Firebase\JWT\Key; @@ -238,21 +239,21 @@ echo "Encode:\n" . print_r($jwt, true) . "\n"; $decoded = JWT::decode($jwt, new Key($publicKey, 'EdDSA')); echo "Decode:\n" . print_r((array) $decoded, true) . "\n"; -```` +``` + +## Example with multiple keys -Example with multiple keys --------------------------- ```php use Firebase\JWT\JWT; use Firebase\JWT\Key; // Example RSA keys from previous example -// $privateKey1 = '...'; -// $publicKey1 = '...'; +// $privateRsKey = '...'; +// $publicRsKey = '...'; // Example EdDSA keys from previous example -// $privateKey2 = '...'; -// $publicKey2 = '...'; +// $privateEcKey = '...'; +// $publicEcKey = '...'; $payload = [ 'iss' => 'example.org', @@ -261,14 +262,14 @@ $payload = [ 'nbf' => 1357000000 ]; -$jwt1 = JWT::encode($payload, $privateKey1, 'RS256', 'kid1'); -$jwt2 = JWT::encode($payload, $privateKey2, 'EdDSA', 'kid2'); +$jwt1 = JWT::encode($payload, $privateRsKey, 'RS256', 'kid1'); +$jwt2 = JWT::encode($payload, $privateEcKey, 'EdDSA', 'kid2'); echo "Encode 1:\n" . print_r($jwt1, true) . "\n"; echo "Encode 2:\n" . print_r($jwt2, true) . "\n"; $keys = [ - 'kid1' => new Key($publicKey1, 'RS256'), - 'kid2' => new Key($publicKey2, 'EdDSA'), + 'kid1' => new Key($publicRsKey, 'RS256'), + 'kid2' => new Key($publicEcKey, 'EdDSA'), ]; $decoded1 = JWT::decode($jwt1, $keys); @@ -278,8 +279,7 @@ echo "Decode 1:\n" . print_r((array) $decoded1, true) . "\n"; echo "Decode 2:\n" . print_r((array) $decoded2, true) . "\n"; ``` -Using JWKs ----------- +## Using JWKs ```php use Firebase\JWT\JWK; @@ -291,11 +291,11 @@ $jwks = ['keys' => []]; // JWK::parseKeySet($jwks) returns an associative array of **kid** to Firebase\JWT\Key // objects. Pass this as the second parameter to JWT::decode. -JWT::decode($jwt, JWK::parseKeySet($jwks)); +$decoded = JWT::decode($jwt, JWK::parseKeySet($jwks)); +print_r($decoded); ``` -Using Cached Key Sets ---------------------- +## Using Cached Key Sets The `CachedKeySet` class can be used to fetch and cache JWKS (JSON Web Key Sets) from a public URI. This has the following advantages: @@ -315,7 +315,7 @@ $jwksUri = 'https://www.gstatic.com/iap/verify/public_key-jwk'; $httpClient = new GuzzleHttp\Client(); // Create an HTTP request factory (can be any PSR-17 compatible HTTP request factory) -$httpFactory = new GuzzleHttp\Psr\HttpFactory(); +$httpFactory = new GuzzleHttp\Psr7\HttpFactory(); // Create a cache item pool (can be any PSR-6 compatible cache item pool) $cacheItemPool = Phpfastcache\CacheManager::getInstance('files'); @@ -406,8 +406,8 @@ Tests Run the tests using phpunit: ```bash -$ pear install PHPUnit -$ phpunit --configuration phpunit.xml.dist +$ composer update +$ vendor/bin/phpunit -c phpunit.xml.dist PHPUnit 3.7.10 by Sebastian Bergmann. ..... Time: 0 seconds, Memory: 2.50Mb diff --git a/lib/firebase/php-jwt/composer.json b/lib/firebase/php-jwt/composer.json index 816cfd0bd9..4b988631dc 100644 --- a/lib/firebase/php-jwt/composer.json +++ b/lib/firebase/php-jwt/composer.json @@ -37,6 +37,7 @@ "phpunit/phpunit": "^9.5", "psr/cache": "^2.0||^3.0", "psr/http-client": "^1.0", - "psr/http-factory": "^1.0" + "psr/http-factory": "^1.0", + "phpfastcache/phpfastcache": "^9.2" } } diff --git a/lib/firebase/php-jwt/src/CachedKeySet.php b/lib/firebase/php-jwt/src/CachedKeySet.php index 8e8e8d68ca..37c3f94d2f 100644 --- a/lib/firebase/php-jwt/src/CachedKeySet.php +++ b/lib/firebase/php-jwt/src/CachedKeySet.php @@ -180,7 +180,8 @@ class CachedKeySet implements ArrayAccess $jwksResponse = $this->httpClient->sendRequest($request); if ($jwksResponse->getStatusCode() !== 200) { throw new UnexpectedValueException( - \sprintf('HTTP Error: %d %s for URI "%s"', + \sprintf( + 'HTTP Error: %d %s for URI "%s"', $jwksResponse->getStatusCode(), $jwksResponse->getReasonPhrase(), $this->jwksUri, diff --git a/lib/firebase/php-jwt/src/JWK.php b/lib/firebase/php-jwt/src/JWK.php index d5175b2170..e083c224bb 100644 --- a/lib/firebase/php-jwt/src/JWK.php +++ b/lib/firebase/php-jwt/src/JWK.php @@ -240,6 +240,14 @@ class JWK ): string { $mod = JWT::urlsafeB64Decode($n); $exp = JWT::urlsafeB64Decode($e); + // Correct encoding for ASN1, as ints are represented as unsigned in jwk + // but signed in ASN1. Prepending null byte makes it unsigned. + if (\strlen($mod) > 0 && \ord($mod[0]) >= 128) { + $mod = \chr(0) . $mod; + } + if (\strlen($exp) > 0 && \ord($exp[0]) >= 128) { + $exp = \chr(0) . $exp; + } $modulus = \pack('Ca*a*', 2, self::encodeLength(\strlen($mod)), $mod); $publicExponent = \pack('Ca*a*', 2, self::encodeLength(\strlen($exp)), $exp); diff --git a/lib/firebase/php-jwt/src/JWT.php b/lib/firebase/php-jwt/src/JWT.php index 90f62ca9de..0d2e47c950 100644 --- a/lib/firebase/php-jwt/src/JWT.php +++ b/lib/firebase/php-jwt/src/JWT.php @@ -31,7 +31,7 @@ class JWT private const ASN1_SEQUENCE = 0x10; private const ASN1_BIT_STRING = 0x03; - private const RSA_KEY_MIN_LENGTH=2048; + private const RSA_KEY_MIN_LENGTH = 2048; /** * When checking nbf, iat or expiration times, @@ -284,20 +284,8 @@ class JWT } return $signature; case 'sodium_crypto': - if (!\function_exists('sodium_crypto_sign_detached')) { - throw new DomainException('libsodium is not available'); - } - if (!\is_string($key)) { - throw new InvalidArgumentException('key must be a string when using EdDSA'); - } try { - // The last non-empty line is used as the key. - $lines = array_filter(explode("\n", $key)); - $key = base64_decode((string) end($lines)); - if (\strlen($key) === 0) { - throw new DomainException('Key cannot be empty string'); - } - return sodium_crypto_sign_detached($msg, $key); + return sodium_crypto_sign_detached($msg, self::validateEdDSAKey($key)); } catch (Exception $e) { throw new DomainException($e->getMessage(), 0, $e); } @@ -352,19 +340,8 @@ class JWT 'OpenSSL error: ' . \openssl_error_string() ); case 'sodium_crypto': - if (!\function_exists('sodium_crypto_sign_verify_detached')) { - throw new DomainException('libsodium is not available'); - } - if (!\is_string($keyMaterial)) { - throw new InvalidArgumentException('key must be a string when using EdDSA'); - } try { - // The last non-empty line is used as the key. - $lines = array_filter(explode("\n", $keyMaterial)); - $key = base64_decode((string) end($lines)); - if (\strlen($key) === 0) { - throw new DomainException('Key cannot be empty string'); - } + $key = self::validateEdDSAKey($keyMaterial); if (\strlen($signature) === 0) { throw new DomainException('Signature cannot be empty string'); } @@ -473,7 +450,6 @@ class JWT return \str_replace('=', '', \strtr(\base64_encode($input), '+/', '-_')); } - /** * Determine if an algorithm has been provided for each Key * @@ -745,4 +721,25 @@ class JWT throw new DomainException('Provided key is too short'); } } + + /** + * @param string|OpenSSLAsymmetricKey|OpenSSLCertificate $keyMaterial + * @return non-empty-string + */ + private static function validateEdDSAKey(#[\SensitiveParameter] $keyMaterial): string + { + if (!\function_exists('sodium_crypto_sign_verify_detached')) { + throw new DomainException('libsodium is not available'); + } + if (!\is_string($keyMaterial)) { + throw new InvalidArgumentException('key must be a string when using EdDSA'); + } + // The last non-empty line is used as the key. + $lines = array_filter(explode("\n", $keyMaterial)); + $key = self::urlsafeB64Decode((string) end($lines)); + if (\strlen($key) === 0) { + throw new DomainException('Key cannot be empty string'); + } + return $key; + } } diff --git a/lib/guzzlehttp/psr7/CHANGELOG.md b/lib/guzzlehttp/psr7/CHANGELOG.md index 4a2a121941..6aca386e3f 100644 --- a/lib/guzzlehttp/psr7/CHANGELOG.md +++ b/lib/guzzlehttp/psr7/CHANGELOG.md @@ -5,6 +5,23 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## 2.9.0 - 2026-03-10 + +### Added + +- Added nested array expansion support to `MultipartStream` +- Added `@return static` to `MessageTrait` methods + +### Changed + +- Updated MIME type mappings + +## 2.8.1 - 2026-03-10 + +### Fixed + +- Encode `+` signs in `Uri::withQueryValue()` and `Uri::withQueryValues()` to prevent them being interpreted as spaces + ## 2.8.0 - 2025-08-23 ### Added diff --git a/lib/guzzlehttp/psr7/composer.json b/lib/guzzlehttp/psr7/composer.json index 96098f536c..56a320b9a4 100644 --- a/lib/guzzlehttp/psr7/composer.json +++ b/lib/guzzlehttp/psr7/composer.json @@ -49,6 +49,19 @@ "homepage": "https://sagikazarmark.hu" } ], + "repositories": [ + { + "type": "package", + "package": { + "name": "jshttp/mime-db", + "version": "1.54.0.1", + "dist": { + "url": "https://codeload.github.com/jshttp/mime-db/zip/0a9fd0bfbc87a725ff638495839114e7807b7177", + "type": "zip" + } + } + } + ], "require": { "php": "^7.2.5 || ^8.0", "psr/http-factory": "^1.0", @@ -62,6 +75,7 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "http-interop/http-factory-tests": "0.9.0", + "jshttp/mime-db": "1.54.0.1", "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "suggest": { diff --git a/lib/guzzlehttp/psr7/src/LimitStream.php b/lib/guzzlehttp/psr7/src/LimitStream.php index fb2232557b..c6676f5594 100644 --- a/lib/guzzlehttp/psr7/src/LimitStream.php +++ b/lib/guzzlehttp/psr7/src/LimitStream.php @@ -63,9 +63,9 @@ final class LimitStream implements StreamInterface return null; } elseif ($this->limit === -1) { return $length - $this->offset; - } else { - return min($this->limit, $length - $this->offset); } + + return min($this->limit, $length - $this->offset); } /** diff --git a/lib/guzzlehttp/psr7/src/MessageTrait.php b/lib/guzzlehttp/psr7/src/MessageTrait.php index c15ee63fc0..f612ca1b99 100644 --- a/lib/guzzlehttp/psr7/src/MessageTrait.php +++ b/lib/guzzlehttp/psr7/src/MessageTrait.php @@ -29,6 +29,9 @@ trait MessageTrait return $this->protocol; } + /** + * @return static + */ public function withProtocolVersion($version): MessageInterface { if ($this->protocol === $version) { @@ -69,6 +72,9 @@ trait MessageTrait return implode(', ', $this->getHeader($header)); } + /** + * @return static + */ public function withHeader($header, $value): MessageInterface { $this->assertHeader($header); @@ -85,6 +91,9 @@ trait MessageTrait return $new; } + /** + * @return static + */ public function withAddedHeader($header, $value): MessageInterface { $this->assertHeader($header); @@ -103,6 +112,9 @@ trait MessageTrait return $new; } + /** + * @return static + */ public function withoutHeader($header): MessageInterface { $normalized = strtolower($header); @@ -128,6 +140,9 @@ trait MessageTrait return $this->stream; } + /** + * @return static + */ public function withBody(StreamInterface $body): MessageInterface { if ($body === $this->stream) { diff --git a/lib/guzzlehttp/psr7/src/MimeType.php b/lib/guzzlehttp/psr7/src/MimeType.php index b131bdbe7a..fa493b8615 100644 --- a/lib/guzzlehttp/psr7/src/MimeType.php +++ b/lib/guzzlehttp/psr7/src/MimeType.php @@ -7,22 +7,23 @@ namespace GuzzleHttp\Psr7; final class MimeType { private const MIME_TYPES = [ + '123' => 'application/vnd.lotus-1-2-3', '1km' => 'application/vnd.1000minds.decision-model+xml', + '210' => 'model/step', '3dml' => 'text/vnd.in3d.3dml', '3ds' => 'image/x-3ds', '3g2' => 'video/3gpp2', - '3gp' => 'video/3gp', + '3gp' => 'video/3gpp', '3gpp' => 'video/3gpp', '3mf' => 'model/3mf', '7z' => 'application/x-7z-compressed', '7zip' => 'application/x-7z-compressed', - '123' => 'application/vnd.lotus-1-2-3', 'aab' => 'application/x-authorware-bin', 'aac' => 'audio/aac', 'aam' => 'application/x-authorware-map', 'aas' => 'application/x-authorware-seg', 'abw' => 'application/x-abiword', - 'ac' => 'application/vnd.nokia.n-gage.ac+xml', + 'ac' => 'application/pkix-attr-cert', 'ac3' => 'audio/ac3', 'acc' => 'application/vnd.americandynamics.acc', 'ace' => 'application/x-ace-compressed', @@ -35,7 +36,7 @@ final class MimeType 'afp' => 'application/vnd.ibm.modcap', 'age' => 'application/vnd.age', 'ahead' => 'application/vnd.ahead.space', - 'ai' => 'application/pdf', + 'ai' => 'application/postscript', 'aif' => 'audio/x-aiff', 'aifc' => 'audio/x-aiff', 'aiff' => 'audio/x-aiff', @@ -55,7 +56,7 @@ final class MimeType 'apr' => 'application/vnd.lotus-approach', 'arc' => 'application/x-freearc', 'arj' => 'application/x-arj', - 'asc' => 'application/pgp-signature', + 'asc' => 'application/pgp-keys', 'asf' => 'video/x-ms-asf', 'asm' => 'text/x-asm', 'aso' => 'application/vnd.accpac.simply.aso', @@ -66,7 +67,7 @@ final class MimeType 'atomdeleted' => 'application/atomdeleted+xml', 'atomsvc' => 'application/atomsvc+xml', 'atx' => 'application/vnd.antix.game-component', - 'au' => 'audio/x-au', + 'au' => 'audio/basic', 'avci' => 'image/avci', 'avcs' => 'image/avcs', 'avi' => 'video/x-msvideo', @@ -77,15 +78,18 @@ final class MimeType 'azv' => 'image/vnd.airzip.accelerator.azv', 'azw' => 'application/vnd.amazon.ebook', 'b16' => 'image/vnd.pco.b16', + 'bary' => 'model/vnd.bary', 'bat' => 'application/x-msdownload', 'bcpio' => 'application/x-bcpio', 'bdf' => 'application/x-font-bdf', 'bdm' => 'application/vnd.syncml.dm+wbxml', - 'bdoc' => 'application/x-bdoc', + 'bdo' => 'application/vnd.nato.bindingdataobject+xml', + 'bdoc' => 'application/bdoc', 'bed' => 'application/vnd.realvnc.bed', 'bh2' => 'application/vnd.fujitsu.oasysprs', 'bin' => 'application/octet-stream', 'blb' => 'application/x-blorb', + 'blend' => 'application/x-blender', 'blorb' => 'application/x-blorb', 'bmi' => 'application/vnd.bmi', 'bmml' => 'application/vnd.balsamiq.bmml+xml', @@ -95,6 +99,8 @@ final class MimeType 'boz' => 'application/x-bzip2', 'bpk' => 'application/octet-stream', 'bpmn' => 'application/octet-stream', + 'brush' => 'application/vnd.procreate.brush', + 'brushset' => 'application/vnd.procreate.brushset', 'bsp' => 'model/vnd.valve.source.compiled-map', 'btf' => 'image/prs.btif', 'btif' => 'image/prs.btif', @@ -102,13 +108,13 @@ final class MimeType 'bz' => 'application/x-bzip', 'bz2' => 'application/x-bzip2', 'c' => 'text/x-c', + 'c11amc' => 'application/vnd.cluetrust.cartomobile-config', + 'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg', 'c4d' => 'application/vnd.clonk.c4group', 'c4f' => 'application/vnd.clonk.c4group', 'c4g' => 'application/vnd.clonk.c4group', 'c4p' => 'application/vnd.clonk.c4group', 'c4u' => 'application/vnd.clonk.c4group', - 'c11amc' => 'application/vnd.cluetrust.cartomobile-config', - 'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg', 'cab' => 'application/vnd.ms-cab-compressed', 'caf' => 'audio/x-caf', 'cap' => 'application/vnd.tcpdump.pcap', @@ -132,7 +138,6 @@ final class MimeType 'cdmid' => 'application/cdmi-domain', 'cdmio' => 'application/cdmi-object', 'cdmiq' => 'application/cdmi-queue', - 'cdr' => 'application/cdr', 'cdx' => 'chemical/x-cdx', 'cdxml' => 'application/vnd.chemdraw+xml', 'cdy' => 'application/vnd.cinderella', @@ -147,7 +152,7 @@ final class MimeType 'cil' => 'application/vnd.ms-artgalry', 'cjs' => 'application/node', 'cla' => 'application/vnd.claymore', - 'class' => 'application/octet-stream', + 'class' => 'application/java-vm', 'cld' => 'model/vnd.cld', 'clkk' => 'application/vnd.crick.clicker.keyboard', 'clkp' => 'application/vnd.crick.clicker.palette', @@ -194,6 +199,8 @@ final class MimeType 'davmount' => 'application/davmount+xml', 'dbf' => 'application/vnd.dbf', 'dbk' => 'application/docbook+xml', + 'dcm' => 'application/dicom', + 'dcmp' => 'application/vnd.dcmp+xml', 'dcr' => 'application/x-director', 'dcurl' => 'text/vnd.curl.dcurl', 'dd2' => 'application/vnd.oma.dd2+xml', @@ -221,19 +228,22 @@ final class MimeType 'dmp' => 'application/vnd.tcpdump.pcap', 'dms' => 'application/octet-stream', 'dna' => 'application/vnd.dna', + 'dng' => 'image/x-adobe-dng', 'doc' => 'application/msword', - 'docm' => 'application/vnd.ms-word.template.macroEnabled.12', + 'docm' => 'application/vnd.ms-word.document.macroenabled.12', 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'dot' => 'application/msword', - 'dotm' => 'application/vnd.ms-word.template.macroEnabled.12', + 'dotm' => 'application/vnd.ms-word.template.macroenabled.12', 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', 'dp' => 'application/vnd.osgi.dp', 'dpg' => 'application/vnd.dpgraph', 'dpx' => 'image/dpx', 'dra' => 'audio/vnd.dra', 'drle' => 'image/dicom-rle', + 'drm' => 'application/vnd.procreate.dream', 'dsc' => 'text/prs.lines.tag', 'dssc' => 'application/dssc+der', + 'dst' => 'application/octet-stream', 'dtb' => 'application/x-dtbook+xml', 'dtd' => 'application/xml-dtd', 'dts' => 'audio/vnd.dts', @@ -285,10 +295,12 @@ final class MimeType 'f4v' => 'video/mp4', 'f77' => 'text/x-fortran', 'f90' => 'text/x-fortran', + 'facti' => 'image/vnd.blockfact.facti', 'fbs' => 'image/vnd.fastbidsheet', + 'fbx' => 'application/vnd.autodesk.fbx', 'fcdt' => 'application/vnd.adobe.formscentral.fcdt', 'fcs' => 'application/vnd.isac.fcs', - 'fdf' => 'application/vnd.fdf', + 'fdf' => 'application/fdf', 'fdt' => 'application/fdt+xml', 'fe_launch' => 'application/vnd.denovo.fcselayout-link', 'fg5' => 'application/vnd.fujitsu.oasysgp', @@ -330,21 +342,25 @@ final class MimeType 'gca' => 'application/x-gca-compressed', 'gdl' => 'model/vnd.gdl', 'gdoc' => 'application/vnd.google-apps.document', + 'gdraw' => 'application/vnd.google-apps.drawing', 'ged' => 'text/vnd.familysearch.gedcom', 'geo' => 'application/vnd.dynageo', 'geojson' => 'application/geo+json', 'gex' => 'application/vnd.geometry-explorer', + 'gform' => 'application/vnd.google-apps.form', 'ggb' => 'application/vnd.geogebra.file', + 'ggs' => 'application/vnd.geogebra.slides', 'ggt' => 'application/vnd.geogebra.tool', 'ghf' => 'application/vnd.groove-help', 'gif' => 'image/gif', 'gim' => 'application/vnd.groove-identity-message', + 'gjam' => 'application/vnd.google-apps.jam', 'glb' => 'model/gltf-binary', 'gltf' => 'model/gltf+json', + 'gmap' => 'application/vnd.google-apps.map', 'gml' => 'application/gml+xml', 'gmx' => 'application/vnd.gmx', 'gnumeric' => 'application/x-gnumeric', - 'gpg' => 'application/gpg-keys', 'gph' => 'application/vnd.flographit', 'gpx' => 'application/gpx+xml', 'gqf' => 'application/vnd.grafeq', @@ -354,8 +370,10 @@ final class MimeType 'gre' => 'application/vnd.geometry-explorer', 'grv' => 'application/vnd.groove-injector', 'grxml' => 'application/srgs+xml', + 'gscript' => 'application/vnd.google-apps.script', 'gsf' => 'application/x-font-ghostscript', 'gsheet' => 'application/vnd.google-apps.spreadsheet', + 'gsite' => 'application/vnd.google-apps.site', 'gslides' => 'application/vnd.google-apps.presentation', 'gtar' => 'application/x-gtar', 'gtm' => 'application/vnd.groove-tool-message', @@ -387,7 +405,6 @@ final class MimeType 'hpid' => 'application/vnd.hp-hpid', 'hps' => 'application/vnd.hp-hps', 'hqx' => 'application/mac-binhex40', - 'hsj2' => 'image/hsj2', 'htc' => 'text/x-component', 'htke' => 'application/vnd.kenameaapp', 'htm' => 'text/html', @@ -399,7 +416,7 @@ final class MimeType 'icc' => 'application/vnd.iccprofile', 'ice' => 'x-conference/x-cooltalk', 'icm' => 'application/vnd.iccprofile', - 'ico' => 'image/x-icon', + 'ico' => 'image/vnd.microsoft.icon', 'ics' => 'text/calendar', 'ief' => 'image/ief', 'ifb' => 'text/calendar', @@ -414,6 +431,7 @@ final class MimeType 'imp' => 'application/vnd.accpac.simply.imp', 'ims' => 'application/vnd.ms-ims', 'in' => 'text/plain', + 'indd' => 'application/x-indesign', 'ini' => 'text/plain', 'ink' => 'application/inkml+xml', 'inkml' => 'application/inkml+xml', @@ -421,6 +439,7 @@ final class MimeType 'iota' => 'application/vnd.astraea-software.iota', 'ipfix' => 'application/ipfix', 'ipk' => 'application/vnd.shana.informed.package', + 'ipynb' => 'application/x-ipynb+json', 'irm' => 'application/vnd.ibm.rights-management', 'irp' => 'application/vnd.irepository.package+xml', 'iso' => 'application/x-iso9660-image', @@ -430,10 +449,13 @@ final class MimeType 'ivu' => 'application/vnd.immervision-ivu', 'jad' => 'text/vnd.sun.j2me.app-descriptor', 'jade' => 'text/jade', + 'jaii' => 'image/jaii', + 'jais' => 'image/jais', 'jam' => 'application/vnd.jam', 'jar' => 'application/java-archive', 'jardiff' => 'application/x-java-archive-diff', 'java' => 'text/x-java-source', + 'jfif' => 'image/jpeg', 'jhc' => 'image/jphc', 'jisp' => 'application/vnd.jisp', 'jls' => 'image/jls', @@ -447,18 +469,19 @@ final class MimeType 'jpf' => 'image/jpx', 'jpg' => 'image/jpeg', 'jpg2' => 'image/jp2', - 'jpgm' => 'video/jpm', + 'jpgm' => 'image/jpm', 'jpgv' => 'video/jpeg', 'jph' => 'image/jph', - 'jpm' => 'video/jpm', + 'jpm' => 'image/jpm', 'jpx' => 'image/jpx', - 'js' => 'application/javascript', + 'js' => 'text/javascript', 'json' => 'application/json', 'json5' => 'application/json5', 'jsonld' => 'application/ld+json', 'jsonml' => 'application/jsonml+json', 'jsx' => 'text/jsx', 'jt' => 'model/jt', + 'jxl' => 'image/jxl', 'jxr' => 'image/jxr', 'jxra' => 'image/jxra', 'jxrs' => 'image/jxrs', @@ -468,9 +491,10 @@ final class MimeType 'jxss' => 'image/jxss', 'kar' => 'audio/midi', 'karbon' => 'application/vnd.kde.karbon', + 'kbl' => 'application/kbl+xml', 'kdb' => 'application/octet-stream', 'kdbx' => 'application/x-keepass2', - 'key' => 'application/x-iwork-keynote-sffkey', + 'key' => 'application/vnd.apple.keynote', 'kfo' => 'application/vnd.kde.kformula', 'kia' => 'application/vnd.kidspiration', 'kml' => 'application/vnd.google-earth.kml+xml', @@ -495,7 +519,7 @@ final class MimeType 'les' => 'application/vnd.hhe.lesson-player', 'less' => 'text/less', 'lgr' => 'application/lgr+xml', - 'lha' => 'application/octet-stream', + 'lha' => 'application/x-lzh-compressed', 'link66' => 'application/vnd.route66.link66+xml', 'list' => 'text/plain', 'list3820' => 'application/vnd.ibm.modcap', @@ -504,6 +528,7 @@ final class MimeType 'lnk' => 'application/x-ms-shortcut', 'log' => 'text/plain', 'lostxml' => 'application/lost+xml', + 'lottie' => 'application/zip+dotlottie', 'lrf' => 'application/octet-stream', 'lrm' => 'application/vnd.ms-lrm', 'ltf' => 'application/vnd.frogans.ltf', @@ -511,21 +536,24 @@ final class MimeType 'luac' => 'application/x-lua-bytecode', 'lvp' => 'audio/vnd.lucent.voice', 'lwp' => 'application/vnd.lotus-wordpro', - 'lzh' => 'application/octet-stream', - 'm1v' => 'video/mpeg', - 'm2a' => 'audio/mpeg', - 'm2v' => 'video/mpeg', - 'm3a' => 'audio/mpeg', - 'm3u' => 'text/plain', - 'm3u8' => 'application/vnd.apple.mpegurl', - 'm4a' => 'audio/x-m4a', - 'm4p' => 'application/mp4', - 'm4s' => 'video/iso.segment', - 'm4u' => 'application/vnd.mpegurl', - 'm4v' => 'video/x-m4v', + 'lzh' => 'application/x-lzh-compressed', 'm13' => 'application/x-msmediaview', 'm14' => 'application/x-msmediaview', + 'm1v' => 'video/mpeg', 'm21' => 'application/mp21', + 'm2a' => 'audio/mpeg', + 'm2t' => 'video/mp2t', + 'm2ts' => 'video/mp2t', + 'm2v' => 'video/mpeg', + 'm3a' => 'audio/mpeg', + 'm3u' => 'audio/x-mpegurl', + 'm3u8' => 'application/vnd.apple.mpegurl', + 'm4a' => 'audio/mp4', + 'm4b' => 'audio/mp4', + 'm4p' => 'application/mp4', + 'm4s' => 'video/iso.segment', + 'm4u' => 'video/vnd.mpegurl', + 'm4v' => 'video/x-m4v', 'ma' => 'application/mathematica', 'mads' => 'application/mads+xml', 'maei' => 'application/mmt-aei+xml', @@ -556,6 +584,8 @@ final class MimeType 'mft' => 'application/rpki-manifest', 'mgp' => 'application/vnd.osgeo.mapguide.package', 'mgz' => 'application/vnd.proteus.magazine', + 'mht' => 'message/rfc822', + 'mhtml' => 'message/rfc822', 'mid' => 'audio/midi', 'midi' => 'audio/midi', 'mie' => 'application/x-mie', @@ -564,11 +594,11 @@ final class MimeType 'mj2' => 'video/mj2', 'mjp2' => 'video/mj2', 'mjs' => 'text/javascript', - 'mk3d' => 'video/x-matroska', - 'mka' => 'audio/x-matroska', + 'mk3d' => 'video/matroska-3d', + 'mka' => 'audio/matroska', 'mkd' => 'text/x-markdown', 'mks' => 'video/x-matroska', - 'mkv' => 'video/x-matroska', + 'mkv' => 'video/matroska', 'mlp' => 'application/vnd.dolby.mlp', 'mmd' => 'application/vnd.chipnuts.karaoke-mmd', 'mmf' => 'application/vnd.smaf', @@ -581,13 +611,13 @@ final class MimeType 'mov' => 'video/quicktime', 'movie' => 'video/x-sgi-movie', 'mp2' => 'audio/mpeg', + 'mp21' => 'application/mp21', 'mp2a' => 'audio/mpeg', 'mp3' => 'audio/mpeg', 'mp4' => 'video/mp4', 'mp4a' => 'audio/mp4', 'mp4s' => 'application/mp4', 'mp4v' => 'video/mp4', - 'mp21' => 'application/mp21', 'mpc' => 'application/vnd.mophun.certificate', 'mpd' => 'application/dash+xml', 'mpe' => 'video/mpeg', @@ -612,7 +642,7 @@ final class MimeType 'msf' => 'application/vnd.epson.msf', 'msg' => 'application/vnd.ms-outlook', 'msh' => 'model/mesh', - 'msi' => 'application/x-msdownload', + 'msi' => 'application/octet-stream', 'msix' => 'application/msix', 'msixbundle' => 'application/msixbundle', 'msl' => 'application/vnd.mobius.msl', @@ -620,7 +650,7 @@ final class MimeType 'msp' => 'application/octet-stream', 'msty' => 'application/vnd.muvee.style', 'mtl' => 'model/mtl', - 'mts' => 'model/vnd.mts', + 'mts' => 'video/mp2t', 'mus' => 'application/vnd.musician', 'musd' => 'application/mmt-usd+xml', 'musicxml' => 'application/vnd.recordare.musicxml+xml', @@ -639,6 +669,7 @@ final class MimeType 'nbp' => 'application/vnd.wolfram.player', 'nc' => 'application/x-netcdf', 'ncx' => 'application/x-dtbncx+xml', + 'ndjson' => 'application/x-ndjson', 'nfo' => 'text/x-nfo', 'ngdat' => 'application/vnd.nokia.n-gage.data', 'nitf' => 'application/vnd.nitf', @@ -653,7 +684,7 @@ final class MimeType 'nsf' => 'application/vnd.lotus-notes', 'nt' => 'application/n-triples', 'ntf' => 'application/vnd.nitf', - 'numbers' => 'application/x-iwork-numbers-sffnumbers', + 'numbers' => 'application/vnd.apple.numbers', 'nzb' => 'application/x-nzb', 'oa2' => 'application/vnd.fujitsu.oasys2', 'oa3' => 'application/vnd.fujitsu.oasys3', @@ -678,6 +709,8 @@ final class MimeType 'ogv' => 'video/ogg', 'ogx' => 'application/ogg', 'omdoc' => 'application/omdoc+xml', + 'one' => 'application/onenote', + 'onea' => 'application/onenote', 'onepkg' => 'application/onenote', 'onetmp' => 'application/onenote', 'onetoc' => 'application/onenote', @@ -686,7 +719,7 @@ final class MimeType 'opml' => 'text/x-opml', 'oprc' => 'application/vnd.palm', 'opus' => 'audio/ogg', - 'org' => 'text/x-org', + 'org' => 'application/vnd.lotus-organizer', 'osf' => 'application/vnd.yamaha.openscoreformat', 'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml', 'osm' => 'application/vnd.openstreetmap.data+xml', @@ -704,17 +737,20 @@ final class MimeType 'oxps' => 'application/oxps', 'oxt' => 'application/vnd.openofficeorg.extension', 'p' => 'text/x-pascal', + 'p10' => 'application/pkcs10', + 'p12' => 'application/x-pkcs12', + 'p21' => 'model/step', 'p7a' => 'application/x-pkcs7-signature', 'p7b' => 'application/x-pkcs7-certificates', 'p7c' => 'application/pkcs7-mime', + 'p7e' => 'application/pkcs7-mime', 'p7m' => 'application/pkcs7-mime', 'p7r' => 'application/x-pkcs7-certreqresp', 'p7s' => 'application/pkcs7-signature', 'p8' => 'application/pkcs8', - 'p10' => 'application/x-pkcs10', - 'p12' => 'application/x-pkcs12', 'pac' => 'application/x-ns-proxy-autoconfig', - 'pages' => 'application/x-iwork-pages-sffpages', + 'pages' => 'application/vnd.apple.pages', + 'parquet' => 'application/vnd.apache.parquet', 'pas' => 'text/x-pascal', 'paw' => 'application/vnd.pawaafile', 'pbd' => 'application/vnd.powerbuilder6', @@ -725,8 +761,8 @@ final class MimeType 'pclxl' => 'application/vnd.hp-pclxl', 'pct' => 'image/x-pict', 'pcurl' => 'application/vnd.curl.pcurl', - 'pcx' => 'image/x-pcx', - 'pdb' => 'application/x-pilot', + 'pcx' => 'image/vnd.zbrush.pcx', + 'pdb' => 'application/vnd.palm', 'pde' => 'text/x-processing', 'pdf' => 'application/pdf', 'pem' => 'application/x-x509-user-cert', @@ -737,7 +773,7 @@ final class MimeType 'pfx' => 'application/x-pkcs12', 'pgm' => 'image/x-portable-graymap', 'pgn' => 'application/x-chess-pgn', - 'pgp' => 'application/pgp', + 'pgp' => 'application/pgp-encrypted', 'phar' => 'application/octet-stream', 'php' => 'application/x-httpd-php', 'php3' => 'application/x-httpd-php', @@ -760,17 +796,17 @@ final class MimeType 'pnm' => 'image/x-portable-anymap', 'portpkg' => 'application/vnd.macports.portpkg', 'pot' => 'application/vnd.ms-powerpoint', - 'potm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12', + 'potm' => 'application/vnd.ms-powerpoint.template.macroenabled.12', 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', 'ppa' => 'application/vnd.ms-powerpoint', - 'ppam' => 'application/vnd.ms-powerpoint.addin.macroEnabled.12', + 'ppam' => 'application/vnd.ms-powerpoint.addin.macroenabled.12', 'ppd' => 'application/vnd.cups-ppd', 'ppm' => 'image/x-portable-pixmap', 'pps' => 'application/vnd.ms-powerpoint', - 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12', + 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroenabled.12', 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', - 'ppt' => 'application/powerpoint', - 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12', + 'ppt' => 'application/vnd.ms-powerpoint', + 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroenabled.12', 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'pqa' => 'application/vnd.palm', 'prc' => 'model/prc', @@ -779,14 +815,16 @@ final class MimeType 'provx' => 'application/provenance+xml', 'ps' => 'application/postscript', 'psb' => 'application/vnd.3gpp.pic-bw-small', - 'psd' => 'application/x-photoshop', + 'psd' => 'image/vnd.adobe.photoshop', 'psf' => 'application/x-font-linux-psf', 'pskcxml' => 'application/pskc+xml', 'pti' => 'image/prs.pti', 'ptid' => 'application/vnd.pvi.ptid1', 'pub' => 'application/x-mspublisher', + 'pv' => 'application/octet-stream', 'pvb' => 'application/vnd.3gpp.pic-bw-var', 'pwn' => 'application/vnd.3m.post-it-notes', + 'pxf' => 'application/octet-stream', 'pya' => 'audio/vnd.ms-playready.media.pya', 'pyo' => 'model/vnd.pytha.pyox', 'pyox' => 'model/vnd.pytha.pyox', @@ -806,7 +844,7 @@ final class MimeType 'ram' => 'audio/x-pn-realaudio', 'raml' => 'application/raml+yaml', 'rapd' => 'application/route-apd+xml', - 'rar' => 'application/x-rar', + 'rar' => 'application/vnd.rar', 'ras' => 'image/x-cmu-raster', 'rcprofile' => 'application/vnd.ipunplugged.rcprofile', 'rdf' => 'application/rdf+xml', @@ -821,7 +859,7 @@ final class MimeType 'rl' => 'application/resource-lists+xml', 'rlc' => 'image/vnd.fujixerox.edmics-rlc', 'rld' => 'application/resource-lists-diff+xml', - 'rm' => 'audio/x-pn-realaudio', + 'rm' => 'application/vnd.rn-realmedia', 'rmi' => 'audio/midi', 'rmp' => 'audio/x-pn-realaudio-plugin', 'rms' => 'application/vnd.jcp.javame.midlet-rms', @@ -831,7 +869,7 @@ final class MimeType 'roa' => 'application/rpki-roa', 'roff' => 'text/troff', 'rp9' => 'application/vnd.cloanto.rp9', - 'rpm' => 'audio/x-pn-realaudio-plugin', + 'rpm' => 'application/x-redhat-package-manager', 'rpss' => 'application/vnd.nokia.radio-presets', 'rpst' => 'application/vnd.nokia.radio-preset', 'rq' => 'application/sparql-query', @@ -865,7 +903,7 @@ final class MimeType 'sdkm' => 'application/vnd.solent.sdkm+xml', 'sdp' => 'application/sdp', 'sdw' => 'application/vnd.stardivision.writer', - 'sea' => 'application/octet-stream', + 'sea' => 'application/x-sea', 'see' => 'application/vnd.seemail', 'seed' => 'application/vnd.fdsn.seed', 'sema' => 'application/vnd.sema', @@ -910,8 +948,8 @@ final class MimeType 'slt' => 'application/vnd.epson.salt', 'sm' => 'application/vnd.stepmania.stepchart', 'smf' => 'application/vnd.stardivision.math', - 'smi' => 'application/smil', - 'smil' => 'application/smil', + 'smi' => 'application/smil+xml', + 'smil' => 'application/smil+xml', 'smv' => 'video/x-smv', 'smzip' => 'application/vnd.stepmania.package', 'snd' => 'audio/basic', @@ -925,7 +963,9 @@ final class MimeType 'spp' => 'application/scvp-vp-response', 'spq' => 'application/scvp-vp-request', 'spx' => 'audio/ogg', - 'sql' => 'application/x-sql', + 'sql' => 'application/sql', + 'sqlite' => 'application/vnd.sqlite3', + 'sqlite3' => 'application/vnd.sqlite3', 'src' => 'application/x-wais-source', 'srt' => 'application/x-subrip', 'sru' => 'application/sru+xml', @@ -938,12 +978,13 @@ final class MimeType 'st' => 'application/vnd.sailingtracker.track', 'stc' => 'application/vnd.sun.xml.calc.template', 'std' => 'application/vnd.sun.xml.draw.template', - 'step' => 'application/STEP', + 'step' => 'model/step', 'stf' => 'application/vnd.wt.stf', 'sti' => 'application/vnd.sun.xml.impress.template', 'stk' => 'application/hyperstudio', 'stl' => 'model/stl', - 'stp' => 'application/STEP', + 'stp' => 'model/step', + 'stpnc' => 'model/step', 'stpx' => 'model/step+xml', 'stpxz' => 'model/step-xml+zip', 'stpz' => 'model/step+zip', @@ -951,7 +992,7 @@ final class MimeType 'stw' => 'application/vnd.sun.xml.writer.template', 'styl' => 'text/stylus', 'stylus' => 'text/stylus', - 'sub' => 'text/vnd.dvb.subtitle', + 'sub' => 'image/vnd.dvb.subtitle', 'sus' => 'application/vnd.sus-calendar', 'susp' => 'application/vnd.sus-calendar', 'sv4cpio' => 'application/x-sv4cpio', @@ -970,6 +1011,7 @@ final class MimeType 'sxi' => 'application/vnd.sun.xml.impress', 'sxm' => 'application/vnd.sun.xml.math', 'sxw' => 'application/vnd.sun.xml.writer', + 'systemverify' => 'application/vnd.pp.systemverify+xml', 't' => 'text/troff', 't3' => 'application/x-t3vm-image', 't38' => 'image/t38', @@ -991,7 +1033,7 @@ final class MimeType 'tfm' => 'application/x-tex-tfm', 'tfx' => 'image/tiff-fx', 'tga' => 'image/x-tga', - 'tgz' => 'application/x-tar', + 'tgz' => 'application/gzip', 'thmx' => 'application/vnd.ms-officetheme', 'tif' => 'image/tiff', 'tiff' => 'image/tiff', @@ -1017,12 +1059,12 @@ final class MimeType 'txd' => 'application/vnd.genomatix.tuxedo', 'txf' => 'application/vnd.mobius.txf', 'txt' => 'text/plain', + 'u32' => 'application/x-authorware-bin', 'u3d' => 'model/u3d', 'u8dsn' => 'message/global-delivery-status', 'u8hdr' => 'message/global-headers', 'u8mdn' => 'message/global-disposition-notification', 'u8msg' => 'message/global', - 'u32' => 'application/x-authorware-bin', 'ubj' => 'application/ubjson', 'udeb' => 'application/x-debian-package', 'ufd' => 'application/vnd.ufdl', @@ -1078,16 +1120,18 @@ final class MimeType 'vcx' => 'application/vnd.vcx', 'vdi' => 'application/x-virtualbox-vdi', 'vds' => 'model/vnd.sap.vds', + 'vdx' => 'application/vnd.ms-visio.viewer', + 'vec' => 'application/vec+xml', 'vhd' => 'application/x-virtualbox-vhd', 'vis' => 'application/vnd.visionary', 'viv' => 'video/vnd.vivo', - 'vlc' => 'application/videolan', 'vmdk' => 'application/x-virtualbox-vmdk', 'vob' => 'video/x-ms-vob', 'vor' => 'application/vnd.stardivision.writer', 'vox' => 'application/x-authorware-bin', 'vrml' => 'model/vrml', 'vsd' => 'application/vnd.visio', + 'vsdx' => 'application/vnd.visio', 'vsf' => 'application/vnd.vsf', 'vss' => 'application/vnd.visio', 'vst' => 'application/vnd.visio', @@ -1095,17 +1139,18 @@ final class MimeType 'vtf' => 'image/vnd.valve.source.texture', 'vtt' => 'text/vtt', 'vtu' => 'model/vnd.vtu', + 'vtx' => 'application/vnd.visio', 'vxml' => 'application/voicexml+xml', 'w3d' => 'application/x-director', 'wad' => 'application/x-doom', 'wadl' => 'application/vnd.sun.wadl+xml', 'war' => 'application/java-archive', 'wasm' => 'application/wasm', - 'wav' => 'audio/x-wav', + 'wav' => 'audio/wav', 'wax' => 'audio/x-ms-wax', 'wbmp' => 'image/vnd.wap.wbmp', 'wbs' => 'application/vnd.criticaltools.wbs+xml', - 'wbxml' => 'application/wbxml', + 'wbxml' => 'application/vnd.wap.wbxml', 'wcm' => 'application/vnd.ms-works', 'wdb' => 'application/vnd.ms-works', 'wdp' => 'image/vnd.ms-photo', @@ -1124,12 +1169,12 @@ final class MimeType 'wmd' => 'application/x-ms-wmd', 'wmf' => 'image/wmf', 'wml' => 'text/vnd.wap.wml', - 'wmlc' => 'application/wmlc', + 'wmlc' => 'application/vnd.wap.wmlc', 'wmls' => 'text/vnd.wap.wmlscript', 'wmlsc' => 'application/vnd.wap.wmlscriptc', 'wmv' => 'video/x-ms-wmv', 'wmx' => 'video/x-ms-wmx', - 'wmz' => 'application/x-msmetafile', + 'wmz' => 'application/x-ms-wmz', 'woff' => 'font/woff', 'woff2' => 'font/woff2', 'word' => 'application/msword', @@ -1144,13 +1189,13 @@ final class MimeType 'wspolicy' => 'application/wspolicy+xml', 'wtb' => 'application/vnd.webturbo', 'wvx' => 'video/x-ms-wvx', + 'x32' => 'application/x-authorware-bin', 'x3d' => 'model/x3d+xml', 'x3db' => 'model/x3d+fastinfoset', 'x3dbz' => 'model/x3d+binary', 'x3dv' => 'model/x3d-vrml', 'x3dvz' => 'model/x3d+vrml', 'x3dz' => 'model/x3d+xml', - 'x32' => 'application/x-authorware-bin', 'x_b' => 'model/vnd.parasolid.transmit.binary', 'x_t' => 'model/vnd.parasolid.transmit.text', 'xaml' => 'application/xaml+xml', @@ -1162,6 +1207,7 @@ final class MimeType 'xbm' => 'image/x-xbitmap', 'xca' => 'application/xcap-caps+xml', 'xcs' => 'application/calendar+xml', + 'xdcf' => 'application/vnd.gov.sk.xmldatacontainer+xml', 'xdf' => 'application/xcap-diff+xml', 'xdm' => 'application/vnd.syncml.dm+xml', 'xdp' => 'application/vnd.adobe.xdp+xml', @@ -1177,18 +1223,18 @@ final class MimeType 'xhtml' => 'application/xhtml+xml', 'xhvml' => 'application/xv+xml', 'xif' => 'image/vnd.xiff', - 'xl' => 'application/excel', + 'xl' => 'application/vnd.ms-excel', 'xla' => 'application/vnd.ms-excel', - 'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12', + 'xlam' => 'application/vnd.ms-excel.addin.macroenabled.12', 'xlc' => 'application/vnd.ms-excel', 'xlf' => 'application/xliff+xml', 'xlm' => 'application/vnd.ms-excel', 'xls' => 'application/vnd.ms-excel', - 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12', - 'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12', + 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroenabled.12', + 'xlsm' => 'application/vnd.ms-excel.sheet.macroenabled.12', 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'xlt' => 'application/vnd.ms-excel', - 'xltm' => 'application/vnd.ms-excel.template.macroEnabled.12', + 'xltm' => 'application/vnd.ms-excel.template.macroenabled.12', 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', 'xlw' => 'application/vnd.ms-excel', 'xm' => 'audio/xm', @@ -1205,7 +1251,7 @@ final class MimeType 'xpx' => 'application/vnd.intercon.formnet', 'xsd' => 'application/xml', 'xsf' => 'application/prs.xsf+xml', - 'xsl' => 'application/xml', + 'xsl' => 'application/xslt+xml', 'xslt' => 'application/xslt+xml', 'xsm' => 'application/vnd.syncml+xml', 'xspf' => 'application/xspf+xml', diff --git a/lib/guzzlehttp/psr7/src/MultipartStream.php b/lib/guzzlehttp/psr7/src/MultipartStream.php index 43d718f658..bca326a51b 100644 --- a/lib/guzzlehttp/psr7/src/MultipartStream.php +++ b/lib/guzzlehttp/psr7/src/MultipartStream.php @@ -23,11 +23,18 @@ final class MultipartStream implements StreamInterface /** * @param array $elements Array of associative arrays, each containing a * required "name" key mapping to the form field, - * name, a required "contents" key mapping to a - * StreamInterface/resource/string, an optional - * "headers" associative array of custom headers, - * and an optional "filename" key mapping to a - * string to send as the filename in the part. + * name, a required "contents" key mapping to any + * value accepted by Utils::streamFor() (scalar, + * null, resource, StreamInterface, Iterator, or + * callable), or an array for nested expansion. + * Optional keys include "headers" (associative + * array of custom headers) and "filename" (string + * to send as the filename in the part). + * When "contents" is an array, it is recursively + * expanded into multiple fields using bracket notation + * (e.g., name[0][key]). Empty arrays produce no fields. + * The "filename" and "headers" options cannot be used + * with array contents. * @param string $boundary You can optionally provide a specific boundary * * @throws \InvalidArgumentException @@ -91,6 +98,22 @@ final class MultipartStream implements StreamInterface } } + if (!is_string($element['name']) && !is_int($element['name'])) { + throw new \InvalidArgumentException("The 'name' key must be a string or integer"); + } + + if (is_array($element['contents'])) { + if (array_key_exists('filename', $element) || array_key_exists('headers', $element)) { + throw new \InvalidArgumentException( + "The 'filename' and 'headers' options cannot be used when 'contents' is an array" + ); + } + + $this->addNestedElements($stream, $element['contents'], (string) $element['name']); + + return; + } + $element['contents'] = Utils::streamFor($element['contents']); if (empty($element['filename'])) { @@ -101,7 +124,7 @@ final class MultipartStream implements StreamInterface } [$body, $headers] = $this->createElement( - $element['name'], + (string) $element['name'], $element['contents'], $element['filename'] ?? null, $element['headers'] ?? [] @@ -112,6 +135,24 @@ final class MultipartStream implements StreamInterface $stream->addStream(Utils::streamFor("\r\n")); } + /** + * Recursively expand array contents into multiple form fields. + * + * @param array $contents + */ + private function addNestedElements(AppendStream $stream, array $contents, string $root): void + { + foreach ($contents as $key => $value) { + $fieldName = $root === '' ? sprintf('[%s]', (string) $key) : sprintf('%s[%s]', $root, (string) $key); + + if (is_array($value)) { + $this->addNestedElements($stream, $value, $fieldName); + } else { + $this->addElement($stream, ['name' => $fieldName, 'contents' => $value]); + } + } + } + /** * @param string[] $headers * diff --git a/lib/guzzlehttp/psr7/src/Request.php b/lib/guzzlehttp/psr7/src/Request.php index faafe1ad8b..b63bcac561 100644 --- a/lib/guzzlehttp/psr7/src/Request.php +++ b/lib/guzzlehttp/psr7/src/Request.php @@ -40,7 +40,7 @@ class Request implements RequestInterface string $version = '1.1' ) { $this->assertMethod($method); - if (!($uri instanceof UriInterface)) { + if (!$uri instanceof UriInterface) { $uri = new Uri($uri); } diff --git a/lib/guzzlehttp/psr7/src/Uri.php b/lib/guzzlehttp/psr7/src/Uri.php index a7cdfb0034..bef82e29de 100644 --- a/lib/guzzlehttp/psr7/src/Uri.php +++ b/lib/guzzlehttp/psr7/src/Uri.php @@ -51,7 +51,7 @@ class Uri implements UriInterface, \JsonSerializable * @see https://datatracker.ietf.org/doc/html/rfc3986#section-2.2 */ private const CHAR_SUB_DELIMS = '!\$&\'\(\)\*\+,;='; - private const QUERY_SEPARATORS_REPLACEMENT = ['=' => '%3D', '&' => '%26']; + private const QUERY_SEPARATORS_REPLACEMENT = ['=' => '%3D', '&' => '%26', '+' => '%2B']; /** @var string Uri scheme. */ private $scheme = ''; @@ -661,7 +661,8 @@ class Uri implements UriInterface, \JsonSerializable private static function generateQueryString(string $key, ?string $value): string { - // Query string separators ("=", "&") within the key or value need to be encoded + // Query string separators ("=", "&") and literal plus signs ("+") within the + // key or value need to be encoded // (while preventing double-encoding) before setting the query string. All other // chars that need percent-encoding will be encoded by withQuery(). $queryString = strtr($key, self::QUERY_SEPARATORS_REPLACEMENT); diff --git a/lib/league/oauth2-google/CHANGELOG.md b/lib/league/oauth2-google/CHANGELOG.md index d41761f513..c6436fed3d 100644 --- a/lib/league/oauth2-google/CHANGELOG.md +++ b/lib/league/oauth2-google/CHANGELOG.md @@ -1,6 +1,12 @@ OAuth 2.0 Google Provider Changelog +## 4.2.0 - 2026-03-09 + +### Added + +- Allow `oauth2-client` version 2 or 3, #140 by @garak + ## 4.1.0 - 2025-12-15 ### Added diff --git a/lib/league/oauth2-google/composer.json b/lib/league/oauth2-google/composer.json index 73ce51ed89..6e698ee0ab 100644 --- a/lib/league/oauth2-google/composer.json +++ b/lib/league/oauth2-google/composer.json @@ -20,7 +20,7 @@ "minimum-stability": "stable", "require": { "php": "^7.3 || ^8.0", - "league/oauth2-client": "^2.0" + "league/oauth2-client": "^2.0 || ^3.0" }, "require-dev": { "eloquent/phony-phpunit": "^6.0 || ^7.1", diff --git a/lib/symfony/cache/Adapter/AbstractTagAwareAdapter.php b/lib/symfony/cache/Adapter/AbstractTagAwareAdapter.php index a1af6141b9..0364bc2f66 100644 --- a/lib/symfony/cache/Adapter/AbstractTagAwareAdapter.php +++ b/lib/symfony/cache/Adapter/AbstractTagAwareAdapter.php @@ -192,8 +192,7 @@ abstract class AbstractTagAwareAdapter implements TagAwareAdapterInterface, TagA if (\is_array($e) || 1 === \count($values)) { foreach (\is_array($e) ? $e : array_keys($values) as $id) { $ok = false; - $v = $values[$id]; - $type = get_debug_type($v); + $type = \array_key_exists($id, $values) ? get_debug_type($values[$id]) : 'unknown'; $message = \sprintf('Failed to save key "{key}" of type %s%s', $type, $e instanceof \Exception ? ': '.$e->getMessage() : '.'); CacheItem::log($this->logger, $message, ['key' => substr($id, \strlen($this->namespace)), 'exception' => $e instanceof \Exception ? $e : null, 'cache-adapter' => get_debug_type($this)]); } diff --git a/lib/symfony/cache/Adapter/ArrayAdapter.php b/lib/symfony/cache/Adapter/ArrayAdapter.php index 38e19cbddd..87cd895b32 100644 --- a/lib/symfony/cache/Adapter/ArrayAdapter.php +++ b/lib/symfony/cache/Adapter/ArrayAdapter.php @@ -34,6 +34,7 @@ class ArrayAdapter implements AdapterInterface, CacheInterface, LoggerAwareInter private array $values = []; private array $tags = []; private array $expiries = []; + private array $explicitExpiries = []; private int $defaultLifetime; private float $maxLifetime; private int $maxItems; @@ -58,7 +59,7 @@ class ArrayAdapter implements AdapterInterface, CacheInterface, LoggerAwareInter $this->maxLifetime = $maxLifetime; $this->maxItems = $maxItems; self::$createCacheItem ??= \Closure::bind( - static function ($key, $value, $isHit, $tags) { + static function ($key, $value, $isHit, $tags, $expiry = null) { $item = new CacheItem(); $item->key = $key; $item->value = $value; @@ -66,6 +67,9 @@ class ArrayAdapter implements AdapterInterface, CacheInterface, LoggerAwareInter if (null !== $tags) { $item->metadata[CacheItem::METADATA_TAGS] = $tags; } + if (null !== $expiry) { + $item->metadata[CacheItem::METADATA_EXPIRY] = $expiry; + } return $item; }, @@ -126,7 +130,7 @@ class ArrayAdapter implements AdapterInterface, CacheInterface, LoggerAwareInter $value = $this->storeSerialized ? $this->unfreeze($key, $isHit) : $this->values[$key]; } - return (self::$createCacheItem)($key, $value, $isHit, $this->tags[$key] ?? null); + return (self::$createCacheItem)($key, $value, $isHit, $this->tags[$key] ?? null, $this->explicitExpiries[$key] ?? null); } public function getItems(array $keys = []): iterable @@ -139,7 +143,7 @@ class ArrayAdapter implements AdapterInterface, CacheInterface, LoggerAwareInter public function deleteItem(mixed $key): bool { \assert('' !== CacheItem::validateKey($key)); - unset($this->values[$key], $this->tags[$key], $this->expiries[$key]); + unset($this->values[$key], $this->tags[$key], $this->expiries[$key], $this->explicitExpiries[$key]); return true; } @@ -193,13 +197,19 @@ class ArrayAdapter implements AdapterInterface, CacheInterface, LoggerAwareInter break; } - unset($this->values[$k], $this->tags[$k], $this->expiries[$k]); + unset($this->values[$k], $this->tags[$k], $this->expiries[$k], $this->explicitExpiries[$k]); } } $this->values[$key] = $value; $this->expiries[$key] = $expiry ?? \PHP_INT_MAX; + if (null !== $item["\0*\0expiry"] && \PHP_INT_MAX !== $this->expiries[$key]) { + $this->explicitExpiries[$key] = $this->expiries[$key]; + } else { + unset($this->explicitExpiries[$key]); + } + if (null === $this->tags[$key] = $item["\0*\0newMetadata"][CacheItem::METADATA_TAGS] ?? null) { unset($this->tags[$key]); } @@ -224,7 +234,7 @@ class ArrayAdapter implements AdapterInterface, CacheInterface, LoggerAwareInter foreach ($this->values as $key => $value) { if (!isset($this->expiries[$key]) || $this->expiries[$key] <= $now || str_starts_with($key, $prefix)) { - unset($this->values[$key], $this->tags[$key], $this->expiries[$key]); + unset($this->values[$key], $this->tags[$key], $this->expiries[$key], $this->explicitExpiries[$key]); } } @@ -233,7 +243,7 @@ class ArrayAdapter implements AdapterInterface, CacheInterface, LoggerAwareInter } } - $this->values = $this->tags = $this->expiries = []; + $this->values = $this->tags = $this->expiries = $this->explicitExpiries = []; return true; } @@ -290,7 +300,7 @@ class ArrayAdapter implements AdapterInterface, CacheInterface, LoggerAwareInter } unset($keys[$i]); - yield $key => $f($key, $value, $isHit, $this->tags[$key] ?? null); + yield $key => $f($key, $value, $isHit, $this->tags[$key] ?? null, $this->explicitExpiries[$key] ?? null); } foreach ($keys as $key) { diff --git a/lib/symfony/cache/Adapter/ChainAdapter.php b/lib/symfony/cache/Adapter/ChainAdapter.php index 1d187f65cf..e240408a76 100644 --- a/lib/symfony/cache/Adapter/ChainAdapter.php +++ b/lib/symfony/cache/Adapter/ChainAdapter.php @@ -79,6 +79,7 @@ class ChainAdapter implements AdapterInterface, CacheInterface, PruneableInterfa $item->expiresAt(\DateTimeImmutable::createFromFormat('U.u', \sprintf('%.6F', $item->metadata[CacheItem::METADATA_EXPIRY]))); } elseif (0 < $defaultLifetime) { $item->expiresAfter($defaultLifetime); + $item->newMetadata[CacheItem::METADATA_EXPIRY] = $item->expiry; } return $item; diff --git a/lib/symfony/cache/CacheItem.php b/lib/symfony/cache/CacheItem.php index 1aa5bcdced..e12e456b68 100644 --- a/lib/symfony/cache/CacheItem.php +++ b/lib/symfony/cache/CacheItem.php @@ -170,6 +170,10 @@ final class CacheItem implements ItemInterface } $valueWrapper = self::VALUE_WRAPPER; + if ($this->value instanceof $valueWrapper) { + return new $valueWrapper($this->value->value, $m + ['expiry' => $this->expiry] + $this->value->metadata); + } + return new $valueWrapper($this->value, $m + ['expiry' => $this->expiry]); } diff --git a/lib/symfony/cache/LockRegistry.php b/lib/symfony/cache/LockRegistry.php index 31ec51ced9..545916b934 100644 --- a/lib/symfony/cache/LockRegistry.php +++ b/lib/symfony/cache/LockRegistry.php @@ -65,12 +65,14 @@ final class LockRegistry /** * Defines a set of existing files that will be used as keys to acquire locks. * - * @return array The previously defined set of files + * @param list $files A list of existing files + * + * @return list The previously defined set of files */ public static function setFiles(array $files): array { $previousFiles = self::$files; - self::$files = $files; + self::$files = array_values($files); foreach (self::$openedFiles as $file) { if ($file) { @@ -97,7 +99,7 @@ final class LockRegistry } self::$signalingException ??= unserialize("O:9:\"Exception\":1:{s:16:\"\0Exception\0trace\";a:0:{}}"); - self::$signalingCallback ??= fn () => throw self::$signalingException; + self::$signalingCallback ??= static fn () => throw self::$signalingException; while (true) { try { @@ -123,14 +125,33 @@ final class LockRegistry } // if we failed the race, retry locking in blocking mode to wait for the winner $logger?->info('Item "{key}" is locked, waiting for it to be released', ['key' => $item->getKey()]); - flock($lock, \LOCK_SH); + + $deadline = microtime(true) + 30.0; + $acquired = false; + do { + if ($acquired = flock($lock, \LOCK_SH | \LOCK_NB)) { + break; + } + usleep(100_000); + } while (microtime(true) < $deadline); + + if (!$acquired) { + $logger?->warning('Lock on item "{key}" timed out, evicting slot', ['key' => $item->getKey()]); + unset(self::$files[$key]); + self::setFiles(self::$files); + $lock = null; + + return self::compute($callback, $item, $save, $pool, $setMetadata, $logger, $beta); + } if (\INF === $beta) { $logger?->info('Force-recomputing item "{key}"', ['key' => $item->getKey()]); continue; } } finally { - flock($lock, \LOCK_UN); + if ($lock) { + flock($lock, \LOCK_UN); + } unset(self::$lockedFiles[$key]); } diff --git a/lib/symfony/cache/Psr16Cache.php b/lib/symfony/cache/Psr16Cache.php index 01494d7142..d5c65bc1d5 100644 --- a/lib/symfony/cache/Psr16Cache.php +++ b/lib/symfony/cache/Psr16Cache.php @@ -18,6 +18,7 @@ use Psr\SimpleCache\CacheInterface; use Symfony\Component\Cache\Adapter\AdapterInterface; use Symfony\Component\Cache\Exception\InvalidArgumentException; use Symfony\Component\Cache\Traits\ProxyTrait; +use Symfony\Contracts\Cache\ItemInterface; /** * Turns a PSR-6 cache into a PSR-16 one. @@ -68,6 +69,12 @@ class Psr16Cache implements CacheInterface, PruneableInterface, ResettableInterf }; self::$packCacheItem ??= \Closure::bind( static function (CacheItem $item) { + // Only re-pack if there's timing metadata (for Psr16Adapter compatibility) + // Don't re-pack if only tags metadata exists (TagAwareAdapter direct use case) + if (!isset($item->metadata[ItemInterface::METADATA_CTIME]) && !isset($item->metadata[ItemInterface::METADATA_EXPIRY])) { + return $item->value; + } + $item->newMetadata = $item->metadata; return $item->pack(); diff --git a/lib/symfony/cache/Traits/Relay/Relay21Trait.php b/lib/symfony/cache/Traits/Relay/Relay21Trait.php new file mode 100644 index 0000000000..551e563434 --- /dev/null +++ b/lib/symfony/cache/Traits/Relay/Relay21Trait.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Traits\Relay; + +if (version_compare(phpversion('relay'), '0.21.0', '>=')) { + /** + * @internal + */ + trait Relay21Trait + { + public function gcra($key, $maxBurst, $requestsPerPeriod, $period, $numRequests = 0): \Relay\Relay|array|false + { + return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->gcra(...\func_get_args()); + } + + public function hotkeys($subcmd, $args = null): \Relay\Relay|array|bool + { + return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hotkeys(...\func_get_args()); + } + } +} else { + /** + * @internal + */ + trait Relay21Trait + { + } +} diff --git a/lib/symfony/cache/Traits/RelayProxy.php b/lib/symfony/cache/Traits/RelayProxy.php index 8933e93ac7..5deaac09cd 100644 --- a/lib/symfony/cache/Traits/RelayProxy.php +++ b/lib/symfony/cache/Traits/RelayProxy.php @@ -26,6 +26,7 @@ use Symfony\Component\Cache\Traits\Relay\Relay11Trait; use Symfony\Component\Cache\Traits\Relay\Relay121Trait; use Symfony\Component\Cache\Traits\Relay\Relay12Trait; use Symfony\Component\Cache\Traits\Relay\Relay20Trait; +use Symfony\Component\Cache\Traits\Relay\Relay21Trait; use Symfony\Component\Cache\Traits\Relay\SwapdbTrait; use Symfony\Component\VarExporter\LazyObjectInterface; use Symfony\Component\VarExporter\LazyProxyTrait; @@ -60,6 +61,7 @@ class RelayProxy extends \Relay\Relay implements ResetInterface, LazyObjectInter use Relay12Trait; use Relay121Trait; use Relay20Trait; + use Relay21Trait; use SwapdbTrait; private const LAZY_OBJECT_PROPERTY_SCOPES = []; diff --git a/lib/symfony/console/Formatter/OutputFormatter.php b/lib/symfony/console/Formatter/OutputFormatter.php index a30e44d84d..d60365f843 100644 --- a/lib/symfony/console/Formatter/OutputFormatter.php +++ b/lib/symfony/console/Formatter/OutputFormatter.php @@ -133,6 +133,10 @@ class OutputFormatter implements WrappableOutputFormatterInterface return ''; } + // For ASCII-only strings, byte positions equal character positions, + // so we can use native strlen/substr which is much faster than Helper::length/substr. + $isAscii = !preg_match('/[\x80-\xFF]/', $message); + $offset = 0; $output = ''; $openTagRegex = '[a-z](?:[^\\\\<>]*+ | \\\\.)*'; @@ -147,11 +151,17 @@ class OutputFormatter implements WrappableOutputFormatterInterface continue; } - // convert byte position to character position. - $pos = Helper::length(substr($message, 0, $pos)); - // add the text up to the next tag - $output .= $this->applyCurrentStyle(Helper::substr($message, $offset, $pos - $offset), $output, $width, $currentLineLength); - $offset = $pos + Helper::length($text); + if ($isAscii) { + // For ASCII, byte position = character position, no conversion needed + $output .= $this->applyCurrentStyle(substr($message, $offset, $pos - $offset), $output, $width, $currentLineLength); + $offset = $pos + \strlen($text); + } else { + // convert byte position to character position. + $pos = Helper::length(substr($message, 0, $pos)); + // add the text up to the next tag + $output .= $this->applyCurrentStyle(Helper::substr($message, $offset, $pos - $offset), $output, $width, $currentLineLength); + $offset = $pos + Helper::length($text); + } // opening tag? if ($open = '/' !== $text[1]) { @@ -172,7 +182,7 @@ class OutputFormatter implements WrappableOutputFormatterInterface } } - $output .= $this->applyCurrentStyle(Helper::substr($message, $offset), $output, $width, $currentLineLength); + $output .= $this->applyCurrentStyle($isAscii ? substr($message, $offset) : Helper::substr($message, $offset), $output, $width, $currentLineLength); return strtr($output, ["\0" => '\\', '\\<' => '<', '\\>' => '>']); } diff --git a/lib/symfony/console/Output/ConsoleOutput.php b/lib/symfony/console/Output/ConsoleOutput.php index 5837e74a3d..1e49101783 100644 --- a/lib/symfony/console/Output/ConsoleOutput.php +++ b/lib/symfony/console/Output/ConsoleOutput.php @@ -142,12 +142,27 @@ class ConsoleOutput extends StreamOutput implements ConsoleOutputInterface */ private function openOutputStream() { + static $stdout; + + if ($stdout) { + return $stdout; + } + if (!$this->hasStdoutSupport()) { - return fopen('php://output', 'w'); + return $stdout = fopen('php://output', 'w'); } // Use STDOUT when possible to prevent from opening too many file descriptors - return \defined('STDOUT') ? \STDOUT : (@fopen('php://stdout', 'w') ?: fopen('php://output', 'w')); + if (!\defined('STDOUT')) { + return $stdout = @fopen('php://stdout', 'w') ?: fopen('php://output', 'w'); + } + + // On Windows, STDOUT is opened in text mode; reopen in binary mode to prevent \n to \r\n conversion + if ('\\' === \DIRECTORY_SEPARATOR) { + return $stdout = @fopen('php://stdout', 'w') ?: \STDOUT; + } + + return $stdout = \STDOUT; } /** @@ -155,11 +170,26 @@ class ConsoleOutput extends StreamOutput implements ConsoleOutputInterface */ private function openErrorStream() { + static $stderr; + + if ($stderr) { + return $stderr; + } + if (!$this->hasStderrSupport()) { - return fopen('php://output', 'w'); + return $stderr = fopen('php://output', 'w'); } // Use STDERR when possible to prevent from opening too many file descriptors - return \defined('STDERR') ? \STDERR : (@fopen('php://stderr', 'w') ?: fopen('php://output', 'w')); + if (!\defined('STDERR')) { + return $stderr = @fopen('php://stderr', 'w') ?: fopen('php://output', 'w'); + } + + // On Windows, STDERR is opened in text mode; reopen in binary mode to prevent \n → \r\n conversion + if ('\\' === \DIRECTORY_SEPARATOR) { + return $stderr = @fopen('php://stderr', 'w') ?: \STDERR; + } + + return $stderr ??= \STDERR; } } diff --git a/lib/symfony/console/Tester/ApplicationTester.php b/lib/symfony/console/Tester/ApplicationTester.php index 58aee54d61..dfb04a189b 100644 --- a/lib/symfony/console/Tester/ApplicationTester.php +++ b/lib/symfony/console/Tester/ApplicationTester.php @@ -49,7 +49,7 @@ class ApplicationTester */ public function run(array $input, array $options = []): int { - $prevShellVerbosity = getenv('SHELL_VERBOSITY'); + $prevShellVerbosity = [getenv('SHELL_VERBOSITY'), $_ENV['SHELL_VERBOSITY'] ?? false, $_SERVER['SHELL_VERBOSITY'] ?? false]; try { $this->input = new ArrayInput($input); @@ -63,22 +63,35 @@ class ApplicationTester $this->initOutput($options); + // Temporarily clear SHELL_VERBOSITY to prevent Application::configureIO + // from overriding the interactive and verbosity settings set above + if (\function_exists('putenv')) { + @putenv('SHELL_VERBOSITY'); + } + unset($_ENV['SHELL_VERBOSITY'], $_SERVER['SHELL_VERBOSITY']); + return $this->statusCode = $this->application->run($this->input, $this->output); } finally { // SHELL_VERBOSITY is set by Application::configureIO so we need to unset/reset it // to its previous value to avoid one test's verbosity to spread to the following tests - if (false === $prevShellVerbosity) { + if (false === $prevShellVerbosity[0]) { if (\function_exists('putenv')) { @putenv('SHELL_VERBOSITY'); } - unset($_ENV['SHELL_VERBOSITY']); - unset($_SERVER['SHELL_VERBOSITY']); } else { if (\function_exists('putenv')) { - @putenv('SHELL_VERBOSITY='.$prevShellVerbosity); + @putenv('SHELL_VERBOSITY='.$prevShellVerbosity[0]); } - $_ENV['SHELL_VERBOSITY'] = $prevShellVerbosity; - $_SERVER['SHELL_VERBOSITY'] = $prevShellVerbosity; + } + if (false === $prevShellVerbosity[1]) { + unset($_ENV['SHELL_VERBOSITY']); + } else { + $_ENV['SHELL_VERBOSITY'] = $prevShellVerbosity[1]; + } + if (false === $prevShellVerbosity[2]) { + unset($_SERVER['SHELL_VERBOSITY']); + } else { + $_SERVER['SHELL_VERBOSITY'] = $prevShellVerbosity[2]; } } } diff --git a/lib/symfony/debug-bundle/CHANGELOG.md b/lib/symfony/debug-bundle/CHANGELOG.md new file mode 100644 index 0000000000..685dd1d079 --- /dev/null +++ b/lib/symfony/debug-bundle/CHANGELOG.md @@ -0,0 +1,8 @@ +CHANGELOG +========= + +4.1.0 +----- + + * Added the `server:dump` command to run a server collecting and displaying + dumps on a single place with multiple formats support diff --git a/lib/symfony/debug-bundle/Command/ServerDumpPlaceholderCommand.php b/lib/symfony/debug-bundle/Command/ServerDumpPlaceholderCommand.php new file mode 100644 index 0000000000..69ee83d18b --- /dev/null +++ b/lib/symfony/debug-bundle/Command/ServerDumpPlaceholderCommand.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bundle\DebugBundle\Command; + +use Symfony\Component\Console\Attribute\AsCommand; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Style\SymfonyStyle; +use Symfony\Component\VarDumper\Command\ServerDumpCommand; +use Symfony\Component\VarDumper\Server\DumpServer; + +/** + * A placeholder command easing VarDumper server discovery. + * + * @author Maxime Steinhausser + * + * @internal + */ +#[AsCommand(name: 'server:dump', description: 'Start a dump server that collects and displays dumps in a single place')] +class ServerDumpPlaceholderCommand extends Command +{ + private ServerDumpCommand $replacedCommand; + + public function __construct(?DumpServer $server = null, array $descriptors = []) + { + $this->replacedCommand = new ServerDumpCommand((new \ReflectionClass(DumpServer::class))->newInstanceWithoutConstructor(), $descriptors); + + parent::__construct(); + } + + protected function configure(): void + { + $this->setDefinition($this->replacedCommand->getDefinition()); + $this->setHelp($this->replacedCommand->getHelp()); + $this->setDescription($this->replacedCommand->getDescription()); + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + (new SymfonyStyle($input, $output))->getErrorStyle()->warning('In order to use the VarDumper server, set the "debug.dump_destination" config option to "tcp://%env(VAR_DUMPER_SERVER)%"'); + + return 8; + } +} diff --git a/lib/symfony/debug-bundle/DebugBundle.php b/lib/symfony/debug-bundle/DebugBundle.php new file mode 100644 index 0000000000..0af84fb5a0 --- /dev/null +++ b/lib/symfony/debug-bundle/DebugBundle.php @@ -0,0 +1,72 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bundle\DebugBundle; + +use Symfony\Bundle\DebugBundle\DependencyInjection\Compiler\DumpDataCollectorPass; +use Symfony\Component\Console\Application; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\HttpKernel\Bundle\Bundle; +use Symfony\Component\VarDumper\VarDumper; + +/** + * @author Nicolas Grekas + */ +class DebugBundle extends Bundle +{ + /** + * @return void + */ + public function boot() + { + if ($this->container->getParameter('kernel.debug')) { + $container = $this->container; + + // This code is here to lazy load the dump stack. This default + // configuration is overridden in CLI mode on 'console.command' event. + // The dump data collector is used by default, so dump output is sent to + // the WDT. In a CLI context, if dump is used too soon, the data collector + // will buffer it, and release it at the end of the script. + VarDumper::setHandler(function ($var, ?string $label = null) use ($container) { + $dumper = $container->get('data_collector.dump'); + $cloner = $container->get('var_dumper.cloner'); + $handler = function ($var, ?string $label = null) use ($dumper, $cloner) { + $var = $cloner->cloneVar($var); + if (null !== $label) { + $var = $var->withContext(['label' => $label]); + } + + $dumper->dump($var); + }; + VarDumper::setHandler($handler); + $handler($var, $label); + }); + } + } + + /** + * @return void + */ + public function build(ContainerBuilder $container) + { + parent::build($container); + + $container->addCompilerPass(new DumpDataCollectorPass()); + } + + /** + * @return void + */ + public function registerCommands(Application $application) + { + // noop + } +} diff --git a/lib/symfony/debug-bundle/DependencyInjection/Compiler/DumpDataCollectorPass.php b/lib/symfony/debug-bundle/DependencyInjection/Compiler/DumpDataCollectorPass.php new file mode 100644 index 0000000000..3d0b27380e --- /dev/null +++ b/lib/symfony/debug-bundle/DependencyInjection/Compiler/DumpDataCollectorPass.php @@ -0,0 +1,49 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bundle\DebugBundle\DependencyInjection\Compiler; + +use Symfony\Bundle\WebProfilerBundle\EventListener\WebDebugToolbarListener; +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Reference; + +/** + * Registers the file link format for the {@link \Symfony\Component\HttpKernel\DataCollector\DumpDataCollector}. + * + * @author Christian Flothmann + */ +class DumpDataCollectorPass implements CompilerPassInterface +{ + /** + * @return void + */ + public function process(ContainerBuilder $container) + { + if (!$container->hasDefinition('data_collector.dump')) { + return; + } + + $definition = $container->getDefinition('data_collector.dump'); + + if (!$container->has('.virtual_request_stack')) { + $definition->replaceArgument(3, new Reference('request_stack')); + } + + if (!$container->hasParameter('web_profiler.debug_toolbar.mode') || WebDebugToolbarListener::DISABLED === $container->getParameter('web_profiler.debug_toolbar.mode')) { + $definition->replaceArgument(3, null); + } + + if (!$container->hasParameter('kernel.runtime_mode.web')) { + $definition->replaceArgument(5, null); + } + } +} diff --git a/lib/symfony/debug-bundle/DependencyInjection/Configuration.php b/lib/symfony/debug-bundle/DependencyInjection/Configuration.php new file mode 100644 index 0000000000..caf7359690 --- /dev/null +++ b/lib/symfony/debug-bundle/DependencyInjection/Configuration.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 Symfony\Bundle\DebugBundle\DependencyInjection; + +use Symfony\Component\Config\Definition\Builder\TreeBuilder; +use Symfony\Component\Config\Definition\ConfigurationInterface; + +/** + * DebugExtension configuration structure. + * + * @author Nicolas Grekas + */ +class Configuration implements ConfigurationInterface +{ + public function getConfigTreeBuilder(): TreeBuilder + { + $treeBuilder = new TreeBuilder('debug'); + + $rootNode = $treeBuilder->getRootNode(); + $rootNode->children() + ->integerNode('max_items') + ->info('Max number of displayed items past the first level, -1 means no limit') + ->min(-1) + ->defaultValue(2500) + ->end() + ->integerNode('min_depth') + ->info('Minimum tree depth to clone all the items, 1 is default') + ->min(0) + ->defaultValue(1) + ->end() + ->integerNode('max_string_length') + ->info('Max length of displayed strings, -1 means no limit') + ->min(-1) + ->defaultValue(-1) + ->end() + ->scalarNode('dump_destination') + ->info('A stream URL where dumps should be written to') + ->example('php://stderr, or tcp://%env(VAR_DUMPER_SERVER)% when using the "server:dump" command') + ->defaultNull() + ->end() + ->enumNode('theme') + ->info('Changes the color of the dump() output when rendered directly on the templating. "dark" (default) or "light"') + ->example('dark') + ->values(['dark', 'light']) + ->defaultValue('dark') + ->end() + ; + + return $treeBuilder; + } +} diff --git a/lib/symfony/debug-bundle/DependencyInjection/DebugExtension.php b/lib/symfony/debug-bundle/DependencyInjection/DebugExtension.php new file mode 100644 index 0000000000..d00d6111c1 --- /dev/null +++ b/lib/symfony/debug-bundle/DependencyInjection/DebugExtension.php @@ -0,0 +1,102 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bundle\DebugBundle\DependencyInjection; + +use Symfony\Bridge\Monolog\Command\ServerLogCommand; +use Symfony\Bundle\DebugBundle\Command\ServerDumpPlaceholderCommand; +use Symfony\Component\Config\FileLocator; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Extension\Extension; +use Symfony\Component\DependencyInjection\Loader\PhpFileLoader; +use Symfony\Component\DependencyInjection\Reference; +use Symfony\Component\VarDumper\Caster\ReflectionCaster; + +/** + * DebugExtension. + * + * @author Nicolas Grekas + */ +class DebugExtension extends Extension +{ + /** + * @return void + */ + public function load(array $configs, ContainerBuilder $container) + { + $configuration = new Configuration(); + $config = $this->processConfiguration($configuration, $configs); + + $loader = new PhpFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); + $loader->load('services.php'); + + $container->getDefinition('var_dumper.cloner') + ->addMethodCall('setMaxItems', [$config['max_items']]) + ->addMethodCall('setMinDepth', [$config['min_depth']]) + ->addMethodCall('setMaxString', [$config['max_string_length']]) + ->addMethodCall('addCasters', [ReflectionCaster::UNSET_CLOSURE_FILE_INFO]); + + if ('dark' !== $config['theme']) { + $container->getDefinition('var_dumper.html_dumper') + ->addMethodCall('setTheme', [$config['theme']]); + } + + if (null === $config['dump_destination']) { + $container->getDefinition('var_dumper.command.server_dump') + ->setClass(ServerDumpPlaceholderCommand::class) + ; + } elseif (str_starts_with($config['dump_destination'], 'tcp://')) { + $container->getDefinition('debug.dump_listener') + ->replaceArgument(2, new Reference('var_dumper.server_connection')) + ; + $container->getDefinition('data_collector.dump') + ->replaceArgument(4, new Reference('var_dumper.server_connection')) + ; + $container->getDefinition('var_dumper.dump_server') + ->replaceArgument(0, $config['dump_destination']) + ; + $container->getDefinition('var_dumper.server_connection') + ->replaceArgument(0, $config['dump_destination']) + ; + } else { + $container->getDefinition('var_dumper.cli_dumper') + ->replaceArgument(0, $config['dump_destination']) + ; + $container->getDefinition('data_collector.dump') + ->replaceArgument(4, new Reference('var_dumper.cli_dumper')) + ; + $container->getDefinition('var_dumper.command.server_dump') + ->setClass(ServerDumpPlaceholderCommand::class) + ; + } + + $container->getDefinition('var_dumper.cli_dumper') + ->addMethodCall('setDisplayOptions', [[ + 'fileLinkFormat' => new Reference('debug.file_link_formatter', ContainerBuilder::IGNORE_ON_INVALID_REFERENCE), + ]]) + ; + + if (!class_exists(Command::class) || !class_exists(ServerLogCommand::class)) { + $container->removeDefinition('monolog.command.server_log'); + } + } + + public function getXsdValidationBasePath(): string|false + { + return __DIR__.'/../Resources/config/schema'; + } + + public function getNamespace(): string + { + return 'http://symfony.com/schema/dic/debug'; + } +} diff --git a/lib/symfony/debug-bundle/LICENSE b/lib/symfony/debug-bundle/LICENSE new file mode 100644 index 0000000000..29f72d5e95 --- /dev/null +++ b/lib/symfony/debug-bundle/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2014-present Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/lib/symfony/debug-bundle/README.md b/lib/symfony/debug-bundle/README.md new file mode 100644 index 0000000000..bed2f5b6d6 --- /dev/null +++ b/lib/symfony/debug-bundle/README.md @@ -0,0 +1,13 @@ +DebugBundle +=========== + +DebugBundle provides a tight integration of the Symfony VarDumper component and +the ServerLogCommand from MonologBridge into the Symfony full-stack framework. + +Resources +--------- + + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/lib/symfony/debug-bundle/Resources/config/schema/debug-1.0.xsd b/lib/symfony/debug-bundle/Resources/config/schema/debug-1.0.xsd new file mode 100644 index 0000000000..3230688602 --- /dev/null +++ b/lib/symfony/debug-bundle/Resources/config/schema/debug-1.0.xsd @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/lib/symfony/debug-bundle/Resources/config/services.php b/lib/symfony/debug-bundle/Resources/config/services.php new file mode 100644 index 0000000000..0193f65a27 --- /dev/null +++ b/lib/symfony/debug-bundle/Resources/config/services.php @@ -0,0 +1,141 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\DependencyInjection\Loader\Configurator; + +use Monolog\Formatter\FormatterInterface; +use Symfony\Bridge\Monolog\Command\ServerLogCommand; +use Symfony\Bridge\Monolog\Formatter\ConsoleFormatter; +use Symfony\Bridge\Twig\Extension\DumpExtension; +use Symfony\Component\HttpKernel\DataCollector\DumpDataCollector; +use Symfony\Component\HttpKernel\EventListener\DumpListener; +use Symfony\Component\VarDumper\Cloner\VarCloner; +use Symfony\Component\VarDumper\Command\Descriptor\CliDescriptor; +use Symfony\Component\VarDumper\Command\Descriptor\HtmlDescriptor; +use Symfony\Component\VarDumper\Command\ServerDumpCommand; +use Symfony\Component\VarDumper\Dumper\CliDumper; +use Symfony\Component\VarDumper\Dumper\ContextProvider\CliContextProvider; +use Symfony\Component\VarDumper\Dumper\ContextProvider\RequestContextProvider; +use Symfony\Component\VarDumper\Dumper\ContextProvider\SourceContextProvider; +use Symfony\Component\VarDumper\Dumper\ContextualizedDumper; +use Symfony\Component\VarDumper\Dumper\HtmlDumper; +use Symfony\Component\VarDumper\Server\Connection; +use Symfony\Component\VarDumper\Server\DumpServer; + +return static function (ContainerConfigurator $container) { + $container->parameters() + ->set('env(VAR_DUMPER_SERVER)', '127.0.0.1:9912') + ; + + $container->services() + + ->set('twig.extension.dump', DumpExtension::class) + ->args([ + service('var_dumper.cloner'), + service('var_dumper.html_dumper'), + ]) + ->tag('twig.extension') + + ->set('data_collector.dump', DumpDataCollector::class) + ->public() + ->args([ + service('debug.stopwatch')->ignoreOnInvalid(), + service('debug.file_link_formatter')->ignoreOnInvalid(), + param('kernel.charset'), + service('.virtual_request_stack'), + null, // var_dumper.cli_dumper or var_dumper.server_connection when debug.dump_destination is set + param('kernel.runtime_mode.web'), + ]) + ->tag('data_collector', [ + 'id' => 'dump', + 'template' => '@Debug/Profiler/dump.html.twig', + 'priority' => 240, + ]) + + ->set('debug.dump_listener', DumpListener::class) + ->args([ + service('var_dumper.cloner'), + service('var_dumper.cli_dumper'), + null, + ]) + ->tag('kernel.event_subscriber') + + ->set('var_dumper.cloner', VarCloner::class) + ->public() + + ->set('var_dumper.cli_dumper', CliDumper::class) + ->args([ + null, // debug.dump_destination, + param('kernel.charset'), + 0, // flags + ]) + + ->set('var_dumper.contextualized_cli_dumper', ContextualizedDumper::class) + ->decorate('var_dumper.cli_dumper') + ->args([ + service('var_dumper.contextualized_cli_dumper.inner'), + [ + 'source' => inline_service(SourceContextProvider::class)->args([ + param('kernel.charset'), + param('kernel.project_dir'), + service('debug.file_link_formatter')->nullOnInvalid(), + ]), + ], + ]) + + ->set('var_dumper.html_dumper', HtmlDumper::class) + ->args([ + null, + param('kernel.charset'), + 0, // flags + ]) + ->call('setDisplayOptions', [ + ['fileLinkFormat' => service('debug.file_link_formatter')->ignoreOnInvalid()], + ]) + + ->set('var_dumper.server_connection', Connection::class) + ->args([ + '', // server host + [ + 'source' => inline_service(SourceContextProvider::class)->args([ + param('kernel.charset'), + param('kernel.project_dir'), + service('debug.file_link_formatter')->nullOnInvalid(), + ]), + 'request' => inline_service(RequestContextProvider::class)->args([service('request_stack')]), + 'cli' => inline_service(CliContextProvider::class), + ], + ]) + + ->set('var_dumper.dump_server', DumpServer::class) + ->args([ + '', // server host + service('logger')->nullOnInvalid(), + ]) + ->tag('monolog.logger', ['channel' => 'debug']) + + ->set('var_dumper.command.server_dump', ServerDumpCommand::class) + ->args([ + service('var_dumper.dump_server'), + [ + 'cli' => inline_service(CliDescriptor::class)->args([service('var_dumper.contextualized_cli_dumper.inner')]), + 'html' => inline_service(HtmlDescriptor::class)->args([service('var_dumper.html_dumper')]), + ], + ]) + ->tag('console.command') + + ->set('monolog.command.server_log', ServerLogCommand::class) + ; + + if (class_exists(ConsoleFormatter::class) && interface_exists(FormatterInterface::class)) { + $container->services()->get('monolog.command.server_log')->tag('console.command'); + } +}; diff --git a/lib/symfony/debug-bundle/Resources/views/Profiler/dump.html.twig b/lib/symfony/debug-bundle/Resources/views/Profiler/dump.html.twig new file mode 100644 index 0000000000..e98e524748 --- /dev/null +++ b/lib/symfony/debug-bundle/Resources/views/Profiler/dump.html.twig @@ -0,0 +1,83 @@ +{% extends '@WebProfiler/Profiler/layout.html.twig' %} + +{% block toolbar %} + {% if collector.dumpsCount %} + {% set icon %} + {{ source('@Debug/Profiler/icon.svg') }} + {{ collector.dumpsCount }} + {% endset %} + + {% set text %} + {% for dump in collector.getDumps('html') %} +
+ + {% if dump.label is defined and '' != dump.label %} + {{ dump.label }} in + {% endif %} + {% if dump.file %} + {% set link = dump.file|file_link(dump.line) %} + {% if link %} + {{ dump.name }} + {% else %} + {{ dump.name }} + {% endif %} + {% else %} + {{ dump.name }} + {% endif %} + + line {{ dump.line }} + + {{ dump.data|raw }} +
+ {% endfor %} + {% endset %} + + {{ include('@WebProfiler/Profiler/toolbar_item.html.twig', { 'link': true }) }} + {% endif %} +{% endblock %} + +{% block menu %} + + {{ source('@Debug/Profiler/icon.svg') }} + Debug + +{% endblock %} + +{% block panel %} +

Dumped Contents

+ + {% for dump in collector.getDumps('html') %} +
+ + + + + {{ dump.data|raw }} +
+ {% else %} +
+

No content was dumped.

+
+ {% endfor %} +{% endblock %} diff --git a/lib/symfony/debug-bundle/Resources/views/Profiler/icon.svg b/lib/symfony/debug-bundle/Resources/views/Profiler/icon.svg new file mode 100644 index 0000000000..9ba3a7d94d --- /dev/null +++ b/lib/symfony/debug-bundle/Resources/views/Profiler/icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/lib/symfony/debug-bundle/composer.json b/lib/symfony/debug-bundle/composer.json new file mode 100644 index 0000000000..1d058228fe --- /dev/null +++ b/lib/symfony/debug-bundle/composer.json @@ -0,0 +1,41 @@ +{ + "name": "symfony/debug-bundle", + "type": "symfony-bundle", + "description": "Provides a tight integration of the Symfony VarDumper component and the ServerLogCommand from MonologBridge into the Symfony full-stack framework", + "keywords": [], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=8.1", + "ext-xml": "*", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/twig-bridge": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "require-dev": { + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/web-profiler-bundle": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony/config": "<5.4", + "symfony/dependency-injection": "<5.4" + }, + "autoload": { + "psr-4": { "Symfony\\Bundle\\DebugBundle\\": "" }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "minimum-stability": "dev" +} diff --git a/lib/symfony/dependency-injection/Dumper/PhpDumper.php b/lib/symfony/dependency-injection/Dumper/PhpDumper.php index 1f9f4d31f8..2fe6a6f0e0 100644 --- a/lib/symfony/dependency-injection/Dumper/PhpDumper.php +++ b/lib/symfony/dependency-injection/Dumper/PhpDumper.php @@ -1295,16 +1295,9 @@ EOF; } } - if (Container::class !== $this->baseClass) { - $r = $this->container->getReflectionClass($this->baseClass, false); - if (null !== $r - && (null !== $constructor = $r->getConstructor()) - && 0 === $constructor->getNumberOfRequiredParameters() - && Container::class !== $constructor->getDeclaringClass()->name - ) { - $code .= " parent::__construct();\n"; - $code .= " \$this->parameterBag = null;\n\n"; - } + if ($this->needsUnsetParameterBag()) { + $code .= " parent::__construct();\n"; + $code .= " unset(\$this->parameterBag);\n\n"; } if ($this->container->getParameterBag()->all()) { @@ -1582,9 +1575,22 @@ EOF; return $code ? \sprintf("\n \$this->privates['service_container'] = static function (\$container) {%s\n };\n", $code) : ''; } + private function needsUnsetParameterBag(): bool + { + if (Container::class === $this->baseClass) { + return false; + } + $r = $this->container->getReflectionClass($this->baseClass, false); + + return null !== $r + && (null !== $constructor = $r->getConstructor()) + && 0 === $constructor->getNumberOfRequiredParameters() + && Container::class !== $constructor->getDeclaringClass()->name; + } + private function addDefaultParametersMethod(): string { - if (!$this->container->getParameterBag()->all()) { + if (!$this->container->getParameterBag()->all() && !$this->needsUnsetParameterBag()) { return ''; } diff --git a/lib/symfony/dependency-injection/Loader/Configurator/AbstractConfigurator.php b/lib/symfony/dependency-injection/Loader/Configurator/AbstractConfigurator.php index d96eacb6dc..f1a1bc07b7 100644 --- a/lib/symfony/dependency-injection/Loader/Configurator/AbstractConfigurator.php +++ b/lib/symfony/dependency-injection/Loader/Configurator/AbstractConfigurator.php @@ -77,6 +77,18 @@ abstract class AbstractConfigurator $value = (self::$valuePreProcessor)($value, $allowServices); } + if ($value instanceof ParamConfigurator) { + return (string) $value; + } + + if (\is_scalar($value ?? '') || $value instanceof \UnitEnum) { + return $value; + } + + if (!$allowServices) { + throw new InvalidArgumentException(\sprintf('Cannot use values of type "%s" in service configuration files.', get_debug_type($value))); + } + if ($value instanceof ReferenceConfigurator) { $reference = new Reference($value->id, $value->invalidBehavior); @@ -90,29 +102,18 @@ abstract class AbstractConfigurator return $def; } - if ($value instanceof ParamConfigurator) { - return (string) $value; - } - if ($value instanceof self) { throw new InvalidArgumentException(\sprintf('"%s()" can be used only at the root of service configuration files.', $value::FACTORY)); } switch (true) { - case null === $value: - case \is_scalar($value): - case $value instanceof \UnitEnum: - return $value; - case $value instanceof ArgumentInterface: case $value instanceof Definition: case $value instanceof Expression: case $value instanceof Parameter: case $value instanceof AbstractArgument: case $value instanceof Reference: - if ($allowServices) { - return $value; - } + return $value; } throw new InvalidArgumentException(\sprintf('Cannot use values of type "%s" in service configuration files.', get_debug_type($value))); diff --git a/lib/symfony/dotenv/Dotenv.php b/lib/symfony/dotenv/Dotenv.php index 2d726285f4..fa19650543 100644 --- a/lib/symfony/dotenv/Dotenv.php +++ b/lib/symfony/dotenv/Dotenv.php @@ -14,6 +14,7 @@ namespace Symfony\Component\Dotenv; use Symfony\Component\Dotenv\Exception\FormatException; use Symfony\Component\Dotenv\Exception\FormatExceptionContext; use Symfony\Component\Dotenv\Exception\PathException; +use Symfony\Component\Dotenv\Exception\VariableCircularReferenceException; use Symfony\Component\Process\Exception\ExceptionInterface as ProcessException; use Symfony\Component\Process\Process; @@ -81,6 +82,7 @@ final class Dotenv public function load(string $path, string ...$extraPaths): void { $this->doLoad(false, \func_get_args()); + $this->resolveLoadedVars(); } /** @@ -100,33 +102,42 @@ final class Dotenv */ public function loadEnv(string $path, ?string $envKey = null, string $defaultEnv = 'dev', array $testEnvs = ['test'], bool $overrideExistingVars = false): void { - $k = $envKey ?? $this->envKey; + try { + $k = $envKey ?? $this->envKey; - if (is_file($path) || !is_file($p = "$path.dist")) { - $this->doLoad($overrideExistingVars, [$path]); - } else { - $this->doLoad($overrideExistingVars, [$p]); - } + if (is_file($path) || !is_file($p = "$path.dist")) { + $this->doLoad($overrideExistingVars, [$path]); + } else { + $this->doLoad($overrideExistingVars, [$p]); + } - if (null === $env = $_SERVER[$k] ?? $_ENV[$k] ?? null) { - $this->populate([$k => $env = $defaultEnv], $overrideExistingVars); - } + if (null === $env = $_SERVER[$k] ?? $_ENV[$k] ?? null) { + $this->populate([$k => $env = $defaultEnv], $overrideExistingVars); + } elseif (str_contains($env, '$') || str_contains($env, "\x00") || str_contains($env, '\\')) { + $env = $this->resolveEnvKey($env, $k); + } - if (!\in_array($env, $testEnvs, true) && is_file($p = "$path.local")) { - $this->doLoad($overrideExistingVars, [$p]); - $env = $_SERVER[$k] ?? $_ENV[$k] ?? $env; - } + if (!\in_array($env, $testEnvs, true) && is_file($p = "$path.local")) { + $this->doLoad($overrideExistingVars, [$p]); + $env = $_SERVER[$k] ?? $_ENV[$k] ?? $env; + if (str_contains($env, '$') || str_contains($env, "\x00") || str_contains($env, '\\')) { + $env = $this->resolveEnvKey($env, $k); + } + } - if ('local' === $env) { - return; - } + if ('local' === $env) { + return; + } - if (is_file($p = "$path.$env")) { - $this->doLoad($overrideExistingVars, [$p]); - } + if (is_file($p = "$path.$env")) { + $this->doLoad($overrideExistingVars, [$p]); + } - if (is_file($p = "$path.$env.local")) { - $this->doLoad($overrideExistingVars, [$p]); + if (is_file($p = "$path.$env.local")) { + $this->doLoad($overrideExistingVars, [$p]); + } + } finally { + $this->resolveLoadedVars(); } } @@ -168,6 +179,7 @@ final class Dotenv public function overload(string $path, string ...$extraPaths): void { $this->doLoad(true, \func_get_args()); + $this->resolveLoadedVars(); } /** @@ -236,6 +248,48 @@ final class Dotenv $this->values = []; $name = ''; + $loadedVars = array_flip(explode(',', $_SERVER['SYMFONY_DOTENV_VARS'] ?? $_ENV['SYMFONY_DOTENV_VARS'] ?? '')); + unset($loadedVars['']); + + $this->skipEmptyLines(); + + while ($this->cursor < $this->end) { + switch ($state) { + case self::STATE_VARNAME: + $name = $this->lexVarname(); + $state = self::STATE_VALUE; + break; + + case self::STATE_VALUE: + $this->values[$name] = $this->resolveValue($this->lexValue(), $loadedVars); + $state = self::STATE_VARNAME; + break; + } + } + + if (self::STATE_VALUE === $state) { + $this->values[$name] = ''; + } + + try { + return $this->values; + } finally { + $this->values = []; + unset($this->path, $this->cursor, $this->lineno, $this->data, $this->end); + } + } + + private function parseRaw(string $data, string $path = '.env'): array + { + $this->path = $path; + $this->data = str_replace(["\r\n", "\r"], "\n", $data); + $this->lineno = 1; + $this->cursor = 0; + $this->end = \strlen($this->data); + $state = self::STATE_VARNAME; + $this->values = []; + $name = ''; + $this->skipEmptyLines(); while ($this->cursor < $this->end) { @@ -260,10 +314,22 @@ final class Dotenv return $this->values; } finally { $this->values = []; - unset($this->path, $this->cursor, $this->lineno, $this->data, $this->end); } } + /** + * Resolves a raw value by expanding commands, variables, backslash escapes, + * and restoring literal $ markers. + */ + private function resolveValue(string $value, array $loadedVars): string + { + $resolved = $this->resolveCommands($value, $loadedVars); + $resolved = $this->resolveVariables($resolved, $loadedVars); + $resolved = str_replace('\\\\', '\\', $resolved); + + return str_replace("\x00", '$', $resolved); + } + private function lexVarname(): string { // var name + optional export @@ -305,8 +371,6 @@ final class Dotenv throw $this->createFormatException('Whitespace are not supported before the value'); } - $loadedVars = array_flip(explode(',', $_SERVER['SYMFONY_DOTENV_VARS'] ?? $_ENV['SYMFONY_DOTENV_VARS'] ?? '')); - unset($loadedVars['']); $v = ''; do { @@ -321,7 +385,10 @@ final class Dotenv } } while ("'" !== $this->data[$this->cursor + $len]); - $v .= substr($this->data, 1 + $this->cursor, $len - 1); + // In single-quoted strings, $ is literal and \ has no special meaning. + // Double backslashes so they survive the unescape in resolveValue(), + // and mark $ as \x00 so it's not treated as a variable reference. + $v .= str_replace(['\\', '$'], ['\\\\', "\x00"], substr($this->data, 1 + $this->cursor, $len - 1)); $this->cursor += 1 + $len; } elseif ('"' === $this->data[$this->cursor]) { $value = ''; @@ -340,11 +407,8 @@ final class Dotenv } ++$this->cursor; $value = str_replace(['\\"', '\r', '\n'], ['"', "\r", "\n"], $value); - $resolvedValue = $value; - $resolvedValue = $this->resolveCommands($resolvedValue, $loadedVars); - $resolvedValue = $this->resolveVariables($resolvedValue, $loadedVars); - $resolvedValue = str_replace('\\\\', '\\', $resolvedValue); - $v .= $resolvedValue; + // Mark escaped $ (\$) as \x00 so it's treated as literal + $v .= $this->protectEscapedDollars($value); } else { $value = ''; $prevChr = $this->data[$this->cursor - 1]; @@ -363,12 +427,9 @@ final class Dotenv ++$this->cursor; } $value = rtrim($value); - $resolvedValue = $value; - $resolvedValue = $this->resolveCommands($resolvedValue, $loadedVars); - $resolvedValue = $this->resolveVariables($resolvedValue, $loadedVars); - $resolvedValue = str_replace('\\\\', '\\', $resolvedValue); + $resolvedValue = $this->protectEscapedDollars($value); - if ($resolvedValue === $value && preg_match('/\s+/', $value)) { + if ($resolvedValue === $value && preg_match('/\s+/', $value) && !str_contains($value, '$')) { throw $this->createFormatException('A value containing spaces must be surrounded by quotes'); } @@ -385,6 +446,26 @@ final class Dotenv return $v; } + /** + * Converts \$ (escaped dollar) to \x00 (literal marker), handling + * even/odd backslash counts correctly: \$ → \x00, \\$ → \\$ (unchanged). + */ + private function protectEscapedDollars(string $value): string + { + if (!str_contains($value, '$')) { + return $value; + } + + return preg_replace_callback('/\\\\+\$/', static function ($m) { + $bs = substr($m[0], 0, -1); + if (1 === \strlen($bs) % 2) { + return substr($bs, 0, -1)."\x00"; + } + + return $m[0]; + }, $value); + } + private function lexNestedExpression(): string { ++$this->cursor; @@ -559,7 +640,148 @@ final class Dotenv throw new FormatException('Loading files starting with a byte-order-mark (BOM) is not supported.', new FormatExceptionContext($data, $path, 1, 0)); } - $this->populate($this->parse($data, $path), $overrideExistingVars); + if (str_contains($data, "\0")) { + throw new FormatException('Loading files containing NUL bytes is not supported.', new FormatExceptionContext($data, $path, 1, 0)); + } + + $this->populate($this->parseRaw($data, $path), $overrideExistingVars); } } + + /** + * Eagerly resolves a raw env key value so that loadEnv() can determine + * which additional .env files to load before full deferred resolution. + */ + private function resolveEnvKey(string $value, string $name): string + { + $loadedVars = array_flip(explode(',', $_SERVER['SYMFONY_DOTENV_VARS'] ?? $_ENV['SYMFONY_DOTENV_VARS'] ?? '')); + unset($loadedVars['']); + + // Save and clear own value so self-referencing defaults work + $envBackup = $_ENV[$name] ?? null; + $serverBackup = $_SERVER[$name] ?? null; + unset($_ENV[$name], $_SERVER[$name]); + if ($this->usePutenv) { + $getenvBackup = (string) getenv($name); + putenv($name); + } + + $this->values = []; + $this->path = ''; + $this->data = ''; + $this->lineno = 0; + $this->cursor = 0; + $this->end = 0; + + $resolved = $this->resolveCommands($value, $loadedVars); + $resolved = $this->resolveVariables($resolved, $loadedVars); + $resolved = str_replace(["\x00", '\\\\'], ['$', '\\'], $resolved); + + if (null !== $envBackup) { + $_ENV[$name] = $envBackup; + } + if (null !== $serverBackup) { + $_SERVER[$name] = $serverBackup; + } + if ($this->usePutenv) { + putenv("$name=$getenvBackup"); + } + + $this->values = []; + + return $resolved; + } + + private function resolveLoadedVars(): void + { + $loadedVars = array_flip(explode(',', $_SERVER['SYMFONY_DOTENV_VARS'] ?? $_ENV['SYMFONY_DOTENV_VARS'] ?? '')); + unset($loadedVars['']); + + $this->values = []; + $this->path = ''; + $this->data = ''; + $this->lineno = 0; + $this->cursor = 0; + $this->end = 0; + + // Detect variables that were originally defined as self-referencing + // (e.g. MY_VAR="${MY_VAR:-default}") so their own raw value is hidden + // during resolution, allowing the default to trigger correctly. + $selfReferencingVars = []; + foreach ($loadedVars as $name => $_) { + if ('SYMFONY_DOTENV_VARS' === $name) { + continue; + } + $value = $_ENV[$name] ?? ''; + if (str_contains($value, '$') && preg_match('/\$\{?'.preg_quote($name, '/').'(?![A-Za-z0-9_])/', $value)) { + $selfReferencingVars[$name] = true; + } + } + + for ($pass = 0; $pass < 5; ++$pass) { + $resolved = []; + foreach ($loadedVars as $name => $_) { + if ('SYMFONY_DOTENV_VARS' === $name) { + continue; + } + if (!str_contains($value = $_ENV[$name] ?? '', '$')) { + continue; + } + + if (isset($selfReferencingVars[$name])) { + $envBackup = $_ENV[$name] ?? null; + $serverBackup = $_SERVER[$name] ?? null; + unset($_ENV[$name], $_SERVER[$name]); + if ($this->usePutenv) { + $getenvBackup = $this->usePutenv ? (string) getenv($name) : null; + putenv($name); + } + } + + $resolvedValue = $this->resolveCommands($value, $loadedVars); + $resolvedValue = $this->resolveVariables($resolvedValue, $loadedVars); + + if (isset($selfReferencingVars[$name])) { + if (null !== $envBackup) { + $_ENV[$name] = $envBackup; + } + if (null !== $serverBackup) { + $_SERVER[$name] = $serverBackup; + } + if ($this->usePutenv) { + putenv("$name=$getenvBackup"); + } + } + + if ($value !== $resolvedValue) { + $resolved[$name] = $resolvedValue; + } + } + if (!$resolved) { + break; + } + $this->populate($resolved, true); + } + if (5 === $pass && $resolved) { + throw new VariableCircularReferenceException('Too many levels of variable indirection in env vars: '.implode(', ', array_keys($resolved)).'.'); + } + + // Restore literal $ signs and unescape backslashes + $restored = []; + foreach ($loadedVars as $name => $_) { + if ('SYMFONY_DOTENV_VARS' === $name) { + continue; + } + $value = $_ENV[$name] ?? ''; + if ($value !== $newValue = str_replace(["\x00", '\\\\'], ['$', '\\'], $value)) { + $restored[$name] = $newValue; + } + } + if ($restored) { + $this->populate($restored, true); + } + + $this->values = []; + unset($this->path, $this->data, $this->lineno, $this->cursor, $this->end); + } } diff --git a/lib/symfony/dotenv/Exception/VariableCircularReferenceException.php b/lib/symfony/dotenv/Exception/VariableCircularReferenceException.php new file mode 100644 index 0000000000..9ad659cb01 --- /dev/null +++ b/lib/symfony/dotenv/Exception/VariableCircularReferenceException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Dotenv\Exception; + +/** + * Thrown when there are too many levels of variable indirection in env vars. + * + * @author Pascal CESCON + */ +final class VariableCircularReferenceException extends \LogicException implements ExceptionInterface +{ +} diff --git a/lib/symfony/error-handler/DebugClassLoader.php b/lib/symfony/error-handler/DebugClassLoader.php index 078f8af56a..f0c120c3f7 100644 --- a/lib/symfony/error-handler/DebugClassLoader.php +++ b/lib/symfony/error-handler/DebugClassLoader.php @@ -127,6 +127,21 @@ class DebugClassLoader private static array $internalMethods = []; private static array $annotatedParameters = []; private static array $darwinCache = ['/' => ['/', []]]; + /** + * @var array> + * + * Maps an interface FQCN (or an abstract class accumulating entries from its interfaces) to the list of + * "@method" annotations declared on it. For interfaces, the entry is populated directly by parsing the + * annotations from the interface's docblock. For abstract classes, the information from all implemented + * interfaces is merged together, so that the check can later be applied to the first concrete subclass. + * + * Each entry is a tuple of: + * [0] string $interface - FQCN of the interface that carries the "@method" annotation + * [1] bool $static - whether the method is declared static + * [2] string $returnType - return type from the annotation, or '' if absent + * [3] string $name - method name plus its parameter signature, e.g. "foo($arg, int $n)" + * [4] string|null $description - description text (period-normalised), or null if absent + */ private static array $method = []; private static array $returnTypes = []; private static array $methodTraits = []; @@ -398,6 +413,14 @@ class DebugClassLoader if ($refl->isInterface() && isset($doc['method'])) { foreach ($doc['method'] as $name => [$static, $returnType, $signature, $description]) { + if ($refl->hasMethod($static ? '__callStatic' : '__call')) { + // When the interface has "virtual" @method declarations but at the same time contains a __call/__callStatic magic method, + // do not trigger a deprecation notice. This is to address special use cases like in Predis' ClientInterface where the + // "@method" annotations never intend to actually add the method to the interface, but are used to document the "virtual" + // API provided by the interface through the technical implementation of magic calls. This might cause false negatives + // (missing notices) in the case that such interfaces are later amended with actual (real) methods. + continue; + } self::$method[$class][] = [$class, $static, $returnType, $name.$signature, $description]; if ('' !== $returnType) { @@ -420,6 +443,15 @@ class DebugClassLoader } } + // When the parent is a concrete class, we will trigger deprecation notices to make it aware that it needs + // to add the new methods announced with @method. The parent will have to provide all those methods. + // For child classes this means they will not need to deal with @method coming from any of the interfaces + // the parent implements. + // Put those interfaces that we can ignore into $parentInterfaces. + // The ternary makes use of the fact that abstract parent classes will accumulate the methods in self::$method, + // so !isset(self::$method[$parent]) indicates a concrete parent class. + $parentInterfaces = ($parent && !isset(self::$method[$parent])) ? class_implements($parent, false) : []; + // Detect if the parent is annotated foreach ($parentAndOwnInterfaces + class_uses($class, false) as $use) { if (!isset(self::$checkedClasses[$use])) { @@ -435,13 +467,15 @@ class DebugClassLoader $deprecations[] = \sprintf('The "%s" %s is considered internal%s It may change without further notice. You should not use it from "%s".', $use, class_exists($use, false) ? 'class' : (interface_exists($use, false) ? 'interface' : 'trait'), self::$internal[$use], $className); } if (isset(self::$method[$use])) { - if ($refl->isAbstract()) { + if ($refl->isAbstract() || $refl->isInterface()) { + // Abstract classes and interfaces inherit @method from interfaces they + // implement directly or through inheritance. if (isset(self::$method[$class])) { self::$method[$class] = array_merge(self::$method[$class], self::$method[$use]); } else { self::$method[$class] = self::$method[$use]; } - } elseif (!$refl->isInterface()) { + } else { if (!strncmp($vendor, str_replace('_', '\\', $use), $vendorLen) && str_starts_with($className, 'Symfony\\') && (!class_exists(InstalledVersions::class) @@ -450,14 +484,14 @@ class DebugClassLoader // skip "same vendor" @method deprecations for Symfony\* classes unless symfony/symfony is being tested continue; } - $hasCall = $refl->hasMethod('__call'); - $hasStaticCall = $refl->hasMethod('__callStatic'); foreach (self::$method[$use] as [$interface, $static, $returnType, $name, $description]) { - if ($static ? $hasStaticCall : $hasCall) { + if (isset($parentInterfaces[$interface])) { + // The @method annotation comes from an interface that has already been implemented by a concrete parent class, + // so we can ignore it here. continue; } $realName = substr($name, 0, strpos($name, '(')); - if (!$refl->hasMethod($realName) || !($methodRefl = $refl->getMethod($realName))->isPublic() || ($static && !$methodRefl->isStatic()) || (!$static && $methodRefl->isStatic())) { + if (!$refl->hasMethod($realName) || !($methodRefl = $refl->getMethod($realName))->isPublic() || ($static xor $methodRefl->isStatic())) { $deprecations[] = \sprintf('Class "%s" should implement method "%s::%s%s"%s', $className, ($static ? 'static ' : '').$interface, $name, $returnType ? ': '.$returnType : '', null === $description ? '.' : ': '.$description); } } diff --git a/lib/symfony/error-handler/Resources/bin/extract-tentative-return-types.php b/lib/symfony/error-handler/Resources/bin/extract-tentative-return-types.php old mode 100644 new mode 100755 diff --git a/lib/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php b/lib/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php index 2faea04638..12ebb1e674 100644 --- a/lib/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php +++ b/lib/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php @@ -40,6 +40,9 @@ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterfa private EventDispatcherInterface $dispatcher; private array $wrappedListeners = []; private array $orphanedEvents = []; + private array $dispatchDepth = []; + private array $calledListenerInfos = []; + private array $calledOriginalListeners = []; private ?RequestStack $requestStack; private string $currentRequestHash = ''; @@ -155,20 +158,20 @@ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterfa public function getCalledListeners(?Request $request = null): array { - if (null === $this->callStack) { + if (!$this->calledListenerInfos) { return []; } $hash = $request ? spl_object_hash($request) : null; $called = []; - foreach ($this->callStack as $listener) { - [$eventName, $requestHash] = $this->callStack->getInfo(); + + foreach ($this->calledListenerInfos as $requestHash => $infos) { if (null === $hash || $hash === $requestHash) { - $called[] = $listener->getInfo($eventName); + $called[] = $infos; } } - return $called; + return $called ? array_merge(...$called) : []; } public function getNotCalledListeners(?Request $request = null): array @@ -185,16 +188,14 @@ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterfa $hash = $request ? spl_object_hash($request) : null; $calledListeners = []; - if (null !== $this->callStack) { - foreach ($this->callStack as $calledListener) { - [, $requestHash] = $this->callStack->getInfo(); - - if (null === $hash || $hash === $requestHash) { - $calledListeners[] = $calledListener->getWrappedListener(); - } + foreach ($this->calledOriginalListeners as $requestHash => $eventListeners) { + if (null === $hash || $hash === $requestHash) { + $calledListeners[] = array_merge(...array_values($eventListeners)); } } + $calledListeners = $calledListeners ? array_merge(...$calledListeners) : []; + $notCalled = []; foreach ($allListeners as $eventName => $listeners) { @@ -234,6 +235,9 @@ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterfa $this->callStack = null; $this->orphanedEvents = []; $this->currentRequestHash = ''; + $this->dispatchDepth = []; + $this->calledListenerInfos = []; + $this->calledOriginalListeners = []; } /** @@ -267,6 +271,8 @@ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterfa private function preProcess(string $eventName): void { + $this->dispatchDepth[$eventName] = ($this->dispatchDepth[$eventName] ?? 0) + 1; + if (!$this->dispatcher->hasListeners($eventName)) { $this->orphanedEvents[$this->currentRequestHash][] = $eventName; @@ -285,6 +291,8 @@ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterfa private function postProcess(string $eventName): void { + --$this->dispatchDepth[$eventName]; + unset($this->wrappedListeners[$eventName]); $skipped = false; foreach ($this->dispatcher->getListeners($eventName) as $listener) { @@ -302,10 +310,16 @@ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterfa if ($listener->wasCalled()) { $this->logger?->debug('Notified event "{event}" to listener "{listener}".', $context); - } else { - unset($this->callStack[$listener]); + + $original = $listener->getWrappedListener(); + if (!\in_array($original, $this->calledOriginalListeners[$this->currentRequestHash][$eventName] ?? [], true)) { + $this->calledOriginalListeners[$this->currentRequestHash][$eventName][] = $original; + $this->calledListenerInfos[$this->currentRequestHash][] = $listener->getInfo($eventName); + } } + unset($this->callStack[$listener]); + if (null !== $this->logger && $skipped) { $this->logger->debug('Listener "{listener}" was not called for event "{event}".', $context); } @@ -316,6 +330,28 @@ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterfa $skipped = true; } } + + if (0 < $this->dispatchDepth[$eventName]) { + return; + } + + // Clean up stale callStack entries left by nested same-event dispatches + $stale = []; + foreach ($this->callStack as $listener) { + if ($this->callStack->getInfo()[0] === $eventName) { + $stale[] = $listener; + } + } + foreach ($stale as $listener) { + if ($listener->wasCalled()) { + $original = $listener->getWrappedListener(); + if (!\in_array($original, $this->calledOriginalListeners[$this->currentRequestHash][$eventName] ?? [], true)) { + $this->calledOriginalListeners[$this->currentRequestHash][$eventName][] = $original; + $this->calledListenerInfos[$this->currentRequestHash][] = $listener->getInfo($eventName); + } + } + unset($this->callStack[$listener]); + } } private function sortNotCalledListeners(array $a, array $b): int diff --git a/lib/symfony/form/Extension/Validator/ValidatorExtension.php b/lib/symfony/form/Extension/Validator/ValidatorExtension.php index bfad8074fc..95effe760d 100644 --- a/lib/symfony/form/Extension/Validator/ValidatorExtension.php +++ b/lib/symfony/form/Extension/Validator/ValidatorExtension.php @@ -39,17 +39,23 @@ class ValidatorExtension extends AbstractExtension /** @var ClassMetadata $metadata */ $metadata = $validator->getMetadataFor(\Symfony\Component\Form\Form::class); + $this->validator = $validator; + $this->formRenderer = $formRenderer; + $this->translator = $translator; + // Register the form constraints in the validator programmatically. // This functionality is required when using the Form component without // the DIC, where the XML file is loaded automatically. Thus the following // code must be kept synchronized with validation.xml + foreach ($metadata->getConstraints() as $constraint) { + if ($constraint instanceof Form) { + return; + } + } + $metadata->addConstraint(new Form()); $metadata->addConstraint(new Traverse(false)); - - $this->validator = $validator; - $this->formRenderer = $formRenderer; - $this->translator = $translator; } public function loadTypeGuesser(): ?FormTypeGuesserInterface diff --git a/lib/symfony/framework-bundle/DependencyInjection/FrameworkExtension.php b/lib/symfony/framework-bundle/DependencyInjection/FrameworkExtension.php index 20810098a8..ec962ff981 100644 --- a/lib/symfony/framework-bundle/DependencyInjection/FrameworkExtension.php +++ b/lib/symfony/framework-bundle/DependencyInjection/FrameworkExtension.php @@ -1233,8 +1233,7 @@ class FrameworkExtension extends Extension $container->setParameter('request_listener.https_port', $config['https_port']); if (null !== $config['default_uri']) { - $container->getDefinition('router.request_context') - ->replaceArgument(0, $config['default_uri']); + $container->setParameter('router.request_context.base_url', $config['default_uri']); } if ($this->isInitializedConfigEnabled('annotations') && (new \ReflectionClass(AttributeClassLoader::class))->hasProperty('reader')) { @@ -1265,6 +1264,7 @@ class FrameworkExtension extends Extension } $container->setParameter('session.storage.options', $options); + $container->setParameter('session.metadata.cookie_lifetime', $options['cookie_lifetime'] ?? null); // session handler (the internal callback registered with PHP session management) if (null === $config['handler_id']) { diff --git a/lib/symfony/framework-bundle/Resources/config/session.php b/lib/symfony/framework-bundle/Resources/config/session.php index 2e481359aa..649c5cd716 100644 --- a/lib/symfony/framework-bundle/Resources/config/session.php +++ b/lib/symfony/framework-bundle/Resources/config/session.php @@ -43,6 +43,7 @@ return static function (ContainerConfigurator $container) { ->args([ param('session.metadata.storage_key'), param('session.metadata.update_threshold'), + param('session.metadata.cookie_lifetime'), ]), false, ]) @@ -53,6 +54,7 @@ return static function (ContainerConfigurator $container) { ->args([ param('session.metadata.storage_key'), param('session.metadata.update_threshold'), + param('session.metadata.cookie_lifetime'), ]), false, ]) @@ -64,6 +66,7 @@ return static function (ContainerConfigurator $container) { ->args([ param('session.metadata.storage_key'), param('session.metadata.update_threshold'), + param('session.metadata.cookie_lifetime'), ]), ]) diff --git a/lib/symfony/framework-bundle/Test/KernelTestCase.php b/lib/symfony/framework-bundle/Test/KernelTestCase.php index 5a6384b5e0..2b49083fa3 100644 --- a/lib/symfony/framework-bundle/Test/KernelTestCase.php +++ b/lib/symfony/framework-bundle/Test/KernelTestCase.php @@ -12,10 +12,12 @@ namespace Symfony\Bundle\FrameworkBundle\Test; use PHPUnit\Framework\TestCase; +use Symfony\Component\Config\Resource\SelfCheckingResourceChecker; use Symfony\Component\DependencyInjection\Container; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException; use Symfony\Component\Filesystem\Filesystem; +use Symfony\Component\HttpKernel\Kernel; use Symfony\Component\HttpKernel\KernelInterface; use Symfony\Contracts\Service\ResetInterface; @@ -38,6 +40,8 @@ abstract class KernelTestCase extends TestCase protected static $booted = false; + private static bool $kernelHasBeenRebooted = false; + protected function tearDown(): void { static::ensureKernelShutdown(); @@ -88,6 +92,7 @@ abstract class KernelTestCase extends TestCase // reboot a fresh one. if ($kernel->getContainer()->initialized('cache_warmer')) { static::ensureKernelShutdown(); + self::$kernelHasBeenRebooted = true; $kernel = static::createKernel($options); $kernel->boot(); @@ -161,6 +166,20 @@ abstract class KernelTestCase extends TestCase static::$kernel->shutdown(); static::$booted = false; + if (self::$kernelHasBeenRebooted) { + self::$kernelHasBeenRebooted = false; + try { + (new \ReflectionProperty(Kernel::class, 'freshCache'))->setValue(null, []); + } catch (\ReflectionException) { + // ignore if the property doesn't exist + } + try { + (new \ReflectionProperty(SelfCheckingResourceChecker::class, 'cache'))->setValue(null, []); + } catch (\ReflectionException) { + // ignore if the property doesn't exist + } + } + if ($container instanceof ResetInterface) { $container->reset(); } diff --git a/lib/symfony/http-foundation/Session/Storage/MetadataBag.php b/lib/symfony/http-foundation/Session/Storage/MetadataBag.php index 5bb4cfbc7b..5192d14c1e 100644 --- a/lib/symfony/http-foundation/Session/Storage/MetadataBag.php +++ b/lib/symfony/http-foundation/Session/Storage/MetadataBag.php @@ -41,14 +41,18 @@ class MetadataBag implements SessionBagInterface private int $updateThreshold; + private ?int $cookieLifetime; + /** - * @param string $storageKey The key used to store bag in the session - * @param int $updateThreshold The time to wait between two UPDATED updates + * @param string $storageKey The key used to store bag in the session + * @param int $updateThreshold The time to wait between two UPDATED updates + * @param int|null $cookieLifetime The configured cookie lifetime; null to read from php.ini */ - public function __construct(string $storageKey = '_sf2_meta', int $updateThreshold = 0) + public function __construct(string $storageKey = '_sf2_meta', int $updateThreshold = 0, ?int $cookieLifetime = null) { $this->storageKey = $storageKey; $this->updateThreshold = $updateThreshold; + $this->cookieLifetime = $cookieLifetime; } /** @@ -143,6 +147,6 @@ class MetadataBag implements SessionBagInterface { $timeStamp = time(); $this->meta[self::CREATED] = $this->meta[self::UPDATED] = $this->lastUsed = $timeStamp; - $this->meta[self::LIFETIME] = $lifetime ?? (int) \ini_get('session.cookie_lifetime'); + $this->meta[self::LIFETIME] = $lifetime ?? $this->cookieLifetime ?? (int) \ini_get('session.cookie_lifetime'); } } diff --git a/lib/symfony/http-kernel/Controller/ArgumentResolver/RequestPayloadValueResolver.php b/lib/symfony/http-kernel/Controller/ArgumentResolver/RequestPayloadValueResolver.php index e3a092e7b5..4931369208 100644 --- a/lib/symfony/http-kernel/Controller/ArgumentResolver/RequestPayloadValueResolver.php +++ b/lib/symfony/http-kernel/Controller/ArgumentResolver/RequestPayloadValueResolver.php @@ -105,7 +105,7 @@ class RequestPayloadValueResolver implements ValueResolverInterface, EventSubscr try { $payload = $this->$payloadMapper($request, $type, $argument); } catch (PartialDenormalizationException $e) { - $trans = $this->translator ? $this->translator->trans(...) : fn ($m, $p) => strtr($m, $p); + $trans = $this->translator ? $this->translator->trans(...) : static fn ($m, $p) => strtr($m, $p); foreach ($e->getErrors() as $error) { $parameters = []; $template = 'This value was of an unexpected type.'; @@ -187,7 +187,7 @@ class RequestPayloadValueResolver implements ValueResolverInterface, EventSubscr } if (\is_array($data)) { - return $this->serializer->denormalize($data, $type, 'csv', $attribute->serializationContext + self::CONTEXT_DENORMALIZE); + return $this->serializer->denormalize($data, $type, self::hasNonStringScalar($data) ? $format : 'csv', $attribute->serializationContext + self::CONTEXT_DENORMALIZE); } if ('form' === $format) { @@ -202,4 +202,21 @@ class RequestPayloadValueResolver implements ValueResolverInterface, EventSubscr throw new HttpException(Response::HTTP_BAD_REQUEST, \sprintf('Request payload contains invalid "%s" data.', $format), $e); } } + + private static function hasNonStringScalar(array $data): bool + { + $stack = [$data]; + + while ($stack) { + foreach (array_pop($stack) as $v) { + if (\is_array($v)) { + $stack[] = $v; + } elseif (!\is_string($v)) { + return true; + } + } + } + + return false; + } } diff --git a/lib/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php b/lib/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php index 5be3f650ea..cc58079eb8 100644 --- a/lib/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php +++ b/lib/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php @@ -171,6 +171,7 @@ class RegisterControllerArgumentLocatorsPass implements CompilerPassInterface } if ($autowireAttributes) { + $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE; $attribute = $autowireAttributes[0]->newInstance(); $value = $parameterBag->resolveValue($attribute->value); diff --git a/lib/symfony/http-kernel/EventListener/LocaleListener.php b/lib/symfony/http-kernel/EventListener/LocaleListener.php index a3aa30f09a..875551b5f5 100644 --- a/lib/symfony/http-kernel/EventListener/LocaleListener.php +++ b/lib/symfony/http-kernel/EventListener/LocaleListener.php @@ -47,6 +47,7 @@ class LocaleListener implements EventSubscriberInterface public function setDefaultLocale(KernelEvent $event): void { $event->getRequest()->setDefaultLocale($this->defaultLocale); + $this->setRouterLocale($this->defaultLocale); } public function onKernelRequest(RequestEvent $event): void @@ -54,14 +55,12 @@ class LocaleListener implements EventSubscriberInterface $request = $event->getRequest(); $this->setLocale($request); - $this->setRouterContext($request); + $this->setRouterLocale($request->getLocale()); } public function onKernelFinishRequest(FinishRequestEvent $event): void { - if (null !== $parentRequest = $this->requestStack->getParentRequest()) { - $this->setRouterContext($parentRequest); - } + $this->setRouterLocale($this->requestStack->getParentRequest()?->getLocale() ?? $this->defaultLocale); } private function setLocale(Request $request): void @@ -76,9 +75,9 @@ class LocaleListener implements EventSubscriberInterface } } - private function setRouterContext(Request $request): void + private function setRouterLocale(string $locale): void { - $this->router?->getContext()->setParameter('_locale', $request->getLocale()); + $this->router?->getContext()->setParameter('_locale', $locale); } public static function getSubscribedEvents(): array diff --git a/lib/symfony/http-kernel/Kernel.php b/lib/symfony/http-kernel/Kernel.php index cb148d4d24..2c279f1a8f 100644 --- a/lib/symfony/http-kernel/Kernel.php +++ b/lib/symfony/http-kernel/Kernel.php @@ -77,11 +77,11 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl */ private static array $freshCache = []; - public const VERSION = '6.4.34'; - public const VERSION_ID = 60434; + public const VERSION = '6.4.36'; + public const VERSION_ID = 60436; public const MAJOR_VERSION = 6; public const MINOR_VERSION = 4; - public const RELEASE_VERSION = 34; + public const RELEASE_VERSION = 36; public const EXTRA_VERSION = ''; public const END_OF_MAINTENANCE = '11/2026'; diff --git a/lib/symfony/mime/FileBinaryMimeTypeGuesser.php b/lib/symfony/mime/FileBinaryMimeTypeGuesser.php index 465f061a08..f290f9a3ad 100644 --- a/lib/symfony/mime/FileBinaryMimeTypeGuesser.php +++ b/lib/symfony/mime/FileBinaryMimeTypeGuesser.php @@ -44,15 +44,11 @@ class FileBinaryMimeTypeGuesser implements MimeTypeGuesserInterface return $supported; } - if ('\\' === \DIRECTORY_SEPARATOR || !\function_exists('passthru') || !\function_exists('escapeshellarg')) { + if ('\\' === \DIRECTORY_SEPARATOR || !\function_exists('shell_exec') || !\function_exists('escapeshellarg')) { return $supported = false; } - ob_start(); - passthru('command -v file', $exitStatus); - $binPath = trim(ob_get_clean()); - - return $supported = 0 === $exitStatus && '' !== $binPath; + return $supported = '' !== trim(shell_exec('command -v file') ?: ''); } public function guessMimeType(string $path): ?string @@ -65,17 +61,8 @@ class FileBinaryMimeTypeGuesser implements MimeTypeGuesserInterface throw new LogicException(\sprintf('The "%s" guesser is not supported.', __CLASS__)); } - ob_start(); - // need to use --mime instead of -i. see #6641 - passthru(\sprintf($this->cmd, escapeshellarg((str_starts_with($path, '-') ? './' : '').$path)), $return); - if ($return > 0) { - ob_end_clean(); - - return null; - } - - $type = trim(ob_get_clean()); + $type = trim(shell_exec(\sprintf($this->cmd, escapeshellarg((str_starts_with($path, '-') ? './' : '').$path))) ?: ''); if (!preg_match('#^([a-z0-9\-]+/[a-z0-9\-\+\.]+)#i', $type, $match)) { // it's not a type, but an error message diff --git a/lib/symfony/mime/Part/DataPart.php b/lib/symfony/mime/Part/DataPart.php index f550f31fcd..e3d0fcfae2 100644 --- a/lib/symfony/mime/Part/DataPart.php +++ b/lib/symfony/mime/Part/DataPart.php @@ -141,7 +141,7 @@ class DataPart extends TextPart } $this->_headers = $this->getHeaders(); - return ['_headers', '_parent', 'filename', 'mediaType']; + return ['_headers', '_parent', 'filename', 'mediaType', 'cid']; } /** diff --git a/lib/symfony/polyfill-ctype/Ctype.php b/lib/symfony/polyfill-ctype/Ctype.php index ba75a2c95f..e26cc02211 100644 --- a/lib/symfony/polyfill-ctype/Ctype.php +++ b/lib/symfony/polyfill-ctype/Ctype.php @@ -211,6 +211,10 @@ final class Ctype */ private static function convert_int_to_char_for_ctype($int, $function) { + if (\PHP_VERSION_ID >= 80100 && !\is_string($int)) { + @trigger_error($function.'(): Argument of type '.get_debug_type($int).' will be interpreted as string in the future', \E_USER_DEPRECATED); + } + if (!\is_int($int)) { return $int; } @@ -219,10 +223,6 @@ final class Ctype return (string) $int; } - if (\PHP_VERSION_ID >= 80100) { - @trigger_error($function.'(): Argument of type int will be interpreted as string in the future', \E_USER_DEPRECATED); - } - if ($int < 0) { $int += 256; } diff --git a/lib/symfony/polyfill-intl-grapheme/Grapheme.php b/lib/symfony/polyfill-intl-grapheme/Grapheme.php index f9e9e57413..51efbf163c 100644 --- a/lib/symfony/polyfill-intl-grapheme/Grapheme.php +++ b/lib/symfony/polyfill-intl-grapheme/Grapheme.php @@ -27,6 +27,7 @@ namespace Symfony\Polyfill\Intl\Grapheme; * - grapheme_strstr - Returns part of haystack string from the first occurrence of needle to the end of haystack * - grapheme_substr - Return part of a string * - grapheme_str_split - Splits a string into an array of individual or chunks of graphemes + * - grapheme_levenshtein - Calculate the grapheme-unit Levenshtein distance between two strings * * @author Nicolas Grekas * @@ -51,7 +52,7 @@ final class Grapheme if (!\is_scalar($s)) { $hasError = false; - set_error_handler(function () use (&$hasError) { $hasError = true; }); + set_error_handler(static function () use (&$hasError) { $hasError = true; }); $next = substr($s, $start); restore_error_handler(); if ($hasError) { @@ -223,6 +224,54 @@ final class Grapheme return $chunks; } + public static function grapheme_levenshtein($s1, $s2, $insertion_cost = 1, $replacement_cost = 1, $deletion_cost = 1) + { + if (!preg_match('//u', $s1) || !preg_match('//u', $s2)) { + return false; + } + + if (0 > $insertion_cost || 0 > $replacement_cost || 0 > $deletion_cost) { + if (80000 > \PHP_VERSION_ID) { + return false; + } + + throw new \ValueError('grapheme_levenshtein(): Argument #3 ($insertion_cost), #4 ($replacement_cost), and #5 ($deletion_cost) must be greater than or equal to 0'); + } + + preg_match_all('/'.SYMFONY_GRAPHEME_CLUSTER_RX.'/u', $s1, $s1); + preg_match_all('/'.SYMFONY_GRAPHEME_CLUSTER_RX.'/u', $s2, $s2); + + $s1 = $s1[0]; + $s2 = $s2[0]; + $l1 = \count($s1); + $l2 = \count($s2); + + if (0 === $l1) { + return $l2 * $insertion_cost; + } + if (0 === $l2) { + return $l1 * $deletion_cost; + } + + $dp = array_fill(0, $l1 + 1, array_fill(0, $l2 + 1, 0)); + + for ($i = 1; $i <= $l1; ++$i) { + $dp[$i][0] = $dp[$i - 1][0] + $deletion_cost; + } + for ($j = 1; $j <= $l2; ++$j) { + $dp[0][$j] = $dp[0][$j - 1] + $insertion_cost; + } + + for ($i = 1; $i <= $l1; ++$i) { + for ($j = 1; $j <= $l2; ++$j) { + $cost = ($s1[$i - 1] === $s2[$j - 1]) ? 0 : $replacement_cost; + $dp[$i][$j] = min($dp[$i - 1][$j] + $deletion_cost, $dp[$i][$j - 1] + $insertion_cost, $dp[$i - 1][$j - 1] + $cost); + } + } + + return $dp[$l1][$l2]; + } + private static function grapheme_position($s, $needle, $offset, $mode) { $needle = (string) $needle; diff --git a/lib/symfony/polyfill-intl-grapheme/bootstrap.php b/lib/symfony/polyfill-intl-grapheme/bootstrap.php index 374dbd3a7e..8926c3b0f4 100644 --- a/lib/symfony/polyfill-intl-grapheme/bootstrap.php +++ b/lib/symfony/polyfill-intl-grapheme/bootstrap.php @@ -53,5 +53,8 @@ if (!function_exists('grapheme_substr')) { function grapheme_substr($string, $offset, $length = null) { return p\Grapheme::grapheme_substr($string, $offset, $length); } } if (!function_exists('grapheme_str_split')) { - function grapheme_str_split($string, $length = 1) { return p\Grapheme::grapheme_str_split($string, $length); } + function grapheme_str_split(string $string, int $length = 1) { return p\Grapheme::grapheme_str_split($string, $length); } +} +if (!function_exists('grapheme_levenshtein')) { + function grapheme_levenshtein(string $string1, string $string2, int $insertion_cost = 1, int $replacement_cost = 1, int $deletion_cost = 1, string $locale = '') { return p\Php85::grapheme_levenshtein($string1, $string2, $insertion_cost, $replacement_cost, $deletion_cost); } } diff --git a/lib/symfony/polyfill-intl-grapheme/bootstrap80.php b/lib/symfony/polyfill-intl-grapheme/bootstrap80.php index d711755307..acf046215e 100644 --- a/lib/symfony/polyfill-intl-grapheme/bootstrap80.php +++ b/lib/symfony/polyfill-intl-grapheme/bootstrap80.php @@ -14,6 +14,9 @@ use Symfony\Polyfill\Intl\Grapheme as p; if (!function_exists('grapheme_str_split')) { function grapheme_str_split(string $string, int $length = 1): array|false { return p\Grapheme::grapheme_str_split($string, $length); } } +if (!function_exists('grapheme_levenshtein')) { + function grapheme_levenshtein(string $string1, string $string2, int $insertion_cost = 1, int $replacement_cost = 1, int $deletion_cost = 1, string $locale = ''): int|false { return p\Grapheme::grapheme_levenshtein($string1, $string2, $insertion_cost, $replacement_cost, $deletion_cost); } +} if (extension_loaded('intl')) { return; diff --git a/lib/symfony/polyfill-intl-icu/Collator.php b/lib/symfony/polyfill-intl-icu/Collator.php index 2f952cdf53..5055bc4b08 100644 --- a/lib/symfony/polyfill-intl-icu/Collator.php +++ b/lib/symfony/polyfill-intl-icu/Collator.php @@ -118,17 +118,15 @@ abstract class Collator } /** - * Not supported. Compare two Unicode strings. + * Compare two Unicode strings. * * @return int|false * * @see https://php.net/collator.compare - * - * @throws MethodNotImplementedException */ public function compare(string $string1, string $string2) { - throw new MethodNotImplementedException(__METHOD__); + return strcasecmp($string1, $string2) ?: $string2 <=> $string1; } /** diff --git a/lib/symfony/polyfill-intl-icu/DateFormat/FullTransformer.php b/lib/symfony/polyfill-intl-icu/DateFormat/FullTransformer.php index 02d071da57..ee871182a7 100644 --- a/lib/symfony/polyfill-intl-icu/DateFormat/FullTransformer.php +++ b/lib/symfony/polyfill-intl-icu/DateFormat/FullTransformer.php @@ -104,7 +104,7 @@ class FullTransformer // handle unimplemented characters if (false !== strpos($this->notImplementedChars, $dateChars[0])) { - throw new NotImplementedException(sprintf('Unimplemented date character "%s" in format "%s".', $dateChars[0], $this->pattern)); + throw new NotImplementedException(\sprintf('Unimplemented date character "%s" in format "%s".', $dateChars[0], $this->pattern)); } return ''; @@ -212,7 +212,7 @@ class FullTransformer { $specialCharsArray = str_split($specialChars); - $specialCharsMatch = implode('|', array_map(function ($char) { + $specialCharsMatch = implode('|', array_map(static function ($char) { return $char.'+'; }, $specialCharsArray)); diff --git a/lib/symfony/polyfill-intl-icu/DateFormat/MonthTransformer.php b/lib/symfony/polyfill-intl-icu/DateFormat/MonthTransformer.php index 6712ed2827..c54025b77a 100644 --- a/lib/symfony/polyfill-intl-icu/DateFormat/MonthTransformer.php +++ b/lib/symfony/polyfill-intl-icu/DateFormat/MonthTransformer.php @@ -53,7 +53,7 @@ class MonthTransformer extends Transformer public function __construct() { if (0 === \count(self::$shortMonths)) { - self::$shortMonths = array_map(function ($month) { + self::$shortMonths = array_map(static function ($month) { return substr($month, 0, 3); }, self::$months); diff --git a/lib/symfony/polyfill-intl-icu/DateFormat/QuarterTransformer.php b/lib/symfony/polyfill-intl-icu/DateFormat/QuarterTransformer.php index a549deeda2..303e66d61d 100644 --- a/lib/symfony/polyfill-intl-icu/DateFormat/QuarterTransformer.php +++ b/lib/symfony/polyfill-intl-icu/DateFormat/QuarterTransformer.php @@ -39,9 +39,9 @@ class QuarterTransformer extends Transformer $map = [1 => '1st quarter', 2 => '2nd quarter', 3 => '3rd quarter', 4 => '4th quarter']; return $map[$quarter]; - } else { - return $quarter; } + + return $quarter; } } diff --git a/lib/symfony/polyfill-intl-icu/DateFormat/TimezoneTransformer.php b/lib/symfony/polyfill-intl-icu/DateFormat/TimezoneTransformer.php index bab7a96f8b..d9fb64d03f 100644 --- a/lib/symfony/polyfill-intl-icu/DateFormat/TimezoneTransformer.php +++ b/lib/symfony/polyfill-intl-icu/DateFormat/TimezoneTransformer.php @@ -55,7 +55,7 @@ class TimezoneTransformer extends Transformer return $dateTime->format('\G\M\TP'); } - return sprintf('GMT%s%d', $offset >= 0 ? '+' : '', $offset / 100); + return \sprintf('GMT%s%d', $offset >= 0 ? '+' : '', $offset / 100); } public function getReverseMatchingRegExp(int $length): string @@ -97,12 +97,12 @@ class TimezoneTransformer extends Transformer $signal = '-' === $matches['signal'] ? '+' : '-'; if (0 < $minutes) { - throw new NotImplementedException(sprintf('It is not possible to use a GMT time zone with minutes offset different than zero (0). GMT time zone tried: "%s".', $formattedTimeZone)); + throw new NotImplementedException(\sprintf('It is not possible to use a GMT time zone with minutes offset different than zero (0). GMT time zone tried: "%s".', $formattedTimeZone)); } return 'Etc/GMT'.(0 !== $hours ? $signal.$hours : ''); } - throw new \InvalidArgumentException(sprintf('The GMT time zone "%s" does not match with the supported formats GMT[+-]HH:MM or GMT[+-]HHMM.', $formattedTimeZone)); + throw new \InvalidArgumentException(\sprintf('The GMT time zone "%s" does not match with the supported formats GMT[+-]HH:MM or GMT[+-]HHMM.', $formattedTimeZone)); } } diff --git a/lib/symfony/polyfill-intl-icu/Exception/MethodArgumentNotImplementedException.php b/lib/symfony/polyfill-intl-icu/Exception/MethodArgumentNotImplementedException.php index db120a340f..22cd5847af 100644 --- a/lib/symfony/polyfill-intl-icu/Exception/MethodArgumentNotImplementedException.php +++ b/lib/symfony/polyfill-intl-icu/Exception/MethodArgumentNotImplementedException.php @@ -22,7 +22,7 @@ class MethodArgumentNotImplementedException extends NotImplementedException */ public function __construct(string $methodName, string $argName) { - $message = sprintf('The %s() method\'s argument $%s behavior is not implemented.', $methodName, $argName); + $message = \sprintf('The %s() method\'s argument $%s behavior is not implemented.', $methodName, $argName); parent::__construct($message); } } diff --git a/lib/symfony/polyfill-intl-icu/Exception/MethodArgumentValueNotImplementedException.php b/lib/symfony/polyfill-intl-icu/Exception/MethodArgumentValueNotImplementedException.php index bd9204234e..d1f0876b85 100644 --- a/lib/symfony/polyfill-intl-icu/Exception/MethodArgumentValueNotImplementedException.php +++ b/lib/symfony/polyfill-intl-icu/Exception/MethodArgumentValueNotImplementedException.php @@ -24,7 +24,7 @@ class MethodArgumentValueNotImplementedException extends NotImplementedException */ public function __construct(string $methodName, string $argName, $argValue, string $additionalMessage = '') { - $message = sprintf( + $message = \sprintf( 'The %s() method\'s argument $%s value %s behavior is not implemented.%s', $methodName, $argName, diff --git a/lib/symfony/polyfill-intl-icu/Exception/MethodNotImplementedException.php b/lib/symfony/polyfill-intl-icu/Exception/MethodNotImplementedException.php index 9e1a43985e..494bf7a0f7 100644 --- a/lib/symfony/polyfill-intl-icu/Exception/MethodNotImplementedException.php +++ b/lib/symfony/polyfill-intl-icu/Exception/MethodNotImplementedException.php @@ -21,6 +21,6 @@ class MethodNotImplementedException extends NotImplementedException */ public function __construct(string $methodName) { - parent::__construct(sprintf('The %s() is not implemented.', $methodName)); + parent::__construct(\sprintf('The %s() is not implemented.', $methodName)); } } diff --git a/lib/symfony/polyfill-intl-icu/Icu.php b/lib/symfony/polyfill-intl-icu/Icu.php index b9590f43d8..702d1b83d7 100644 --- a/lib/symfony/polyfill-intl-icu/Icu.php +++ b/lib/symfony/polyfill-intl-icu/Icu.php @@ -108,10 +108,10 @@ abstract class Icu public static function setError(int $code, string $message = '') { if (!isset(self::$errorCodes[$code])) { - throw new \InvalidArgumentException(sprintf('No such error code: "%s".', $code)); + throw new \InvalidArgumentException(\sprintf('No such error code: "%s".', $code)); } - self::$errorMessage = $message ? sprintf('%s: %s', $message, self::$errorCodes[$code]) : self::$errorCodes[$code]; + self::$errorMessage = $message ? \sprintf('%s: %s', $message, self::$errorCodes[$code]) : self::$errorCodes[$code]; self::$errorCode = $code; } } diff --git a/lib/symfony/polyfill-intl-icu/IntlDateFormatter.php b/lib/symfony/polyfill-intl-icu/IntlDateFormatter.php index b2674f906e..750f69b008 100644 --- a/lib/symfony/polyfill-intl-icu/IntlDateFormatter.php +++ b/lib/symfony/polyfill-intl-icu/IntlDateFormatter.php @@ -225,7 +225,7 @@ abstract class IntlDateFormatter // behave like the intl extension $argumentError = null; if (!\is_int($datetime) && !$datetime instanceof \DateTimeInterface) { - $argumentError = sprintf('datefmt_format: string \'%s\' is not numeric, which would be required for it to be a valid date', $datetime); + $argumentError = \sprintf('datefmt_format: string \'%s\' is not numeric, which would be required for it to be a valid date', $datetime); } if (null !== $argumentError) { diff --git a/lib/symfony/polyfill-intl-icu/IntlListFormatter.php b/lib/symfony/polyfill-intl-icu/IntlListFormatter.php new file mode 100644 index 0000000000..9dc7ca91fe --- /dev/null +++ b/lib/symfony/polyfill-intl-icu/IntlListFormatter.php @@ -0,0 +1,169 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Intl\Icu; + +/** + * @author Ayesh Karunaratne + * + * @internal + */ +class IntlListFormatter +{ + public const TYPE_AND = 0; + public const TYPE_OR = 1; + public const TYPE_UNITS = 2; + + public const WIDTH_WIDE = 0; + public const WIDTH_SHORT = 1; + public const WIDTH_NARROW = 2; + + private $type; + private $width; + + private const TYPE_MAP = [ + self::TYPE_AND => 'standard', + self::TYPE_OR => 'or', + self::TYPE_UNITS => 'unit', + ]; + + private const WIDTH_MAP = [ + self::WIDTH_WIDE => '', + self::WIDTH_SHORT => '-short', + self::WIDTH_NARROW => '-narrow', + ]; + + private const EN_LIST_PATTERNS = [ + 'listPattern-type-standard' => [ + 'start' => '{0}, {1}', + 'middle' => '{0}, {1}', + 'end' => '{0}, and {1}', + 2 => '{0} and {1}', + ], + 'listPattern-type-or' => [ + 'start' => '{0}, {1}', + 'middle' => '{0}, {1}', + 'end' => '{0}, or {1}', + 2 => '{0} or {1}', + ], + 'listPattern-type-or-narrow' => [ + 'start' => '{0}, {1}', + 'middle' => '{0}, {1}', + 'end' => '{0}, or {1}', + 2 => '{0} or {1}', + ], + 'listPattern-type-or-short' => [ + 'start' => '{0}, {1}', + 'middle' => '{0}, {1}', + 'end' => '{0}, or {1}', + 2 => '{0} or {1}', + ], + 'listPattern-type-standard-narrow' => [ + 'start' => '{0}, {1}', + 'middle' => '{0}, {1}', + 'end' => '{0}, {1}', + 2 => '{0}, {1}', + ], + 'listPattern-type-standard-short' => [ + 'start' => '{0}, {1}', + 'middle' => '{0}, {1}', + 'end' => '{0}, & {1}', + 2 => '{0} & {1}', + ], + 'listPattern-type-unit' => [ + 'start' => '{0}, {1}', + 'middle' => '{0}, {1}', + 'end' => '{0}, {1}', + 2 => '{0}, {1}', + ], + 'listPattern-type-unit-narrow' => [ + 'start' => '{0} {1}', + 'middle' => '{0} {1}', + 'end' => '{0} {1}', + 2 => '{0} {1}', + ], + 'listPattern-type-unit-short' => [ + 'start' => '{0}, {1}', + 'middle' => '{0}, {1}', + 'end' => '{0}, {1}', + 2 => '{0}, {1}', + ], + ]; + + public function __construct(string $locale, int $type = self::TYPE_AND, int $width = self::WIDTH_WIDE) + { + if ('en' !== $locale && 0 !== strpos($locale, 'en')) { + if (80000 > \PHP_VERSION_ID) { + throw new \InvalidArgumentException('Invalid locale, only "en" and "en-*" locales are supported.'); + } + + throw new \ValueError('Invalid locale, only "en" and "en-*" locales are supported.'); + } + + if (!isset(self::TYPE_MAP[$type])) { + if (80000 > \PHP_VERSION_ID) { + throw new \InvalidArgumentException('Argument #2 ($type) must be one of IntlListFormatter::TYPE_AND, IntlListFormatter::TYPE_OR, or IntlListFormatter::TYPE_UNITS.'); + } + + throw new \ValueError('Argument #2 ($type) must be one of IntlListFormatter::TYPE_AND, IntlListFormatter::TYPE_OR, or IntlListFormatter::TYPE_UNITS.'); + } + + if (!isset(self::WIDTH_MAP[$width])) { + if (80000 > \PHP_VERSION_ID) { + throw new \InvalidArgumentException('Argument #3 ($width) must be one of IntlListFormatter::WIDTH_WIDE, IntlListFormatter::WIDTH_SHORT, or IntlListFormatter::WIDTH_NARROW.'); + } + + throw new \ValueError('Argument #3 ($width) must be one of IntlListFormatter::WIDTH_WIDE, IntlListFormatter::WIDTH_SHORT, or IntlListFormatter::WIDTH_NARROW.'); + } + + $this->type = $type; + $this->width = $width; + } + + public function format(array $strings): string + { + $count = \count($strings); + + if (0 === $count) { + return ''; + } + + $strings = array_values($strings); + + if (1 === $count) { + return (string) $strings[0]; + } + + $pattern = self::EN_LIST_PATTERNS['listPattern-type-'.self::TYPE_MAP[$this->type].self::WIDTH_MAP[$this->width]]; + + if (2 === $count) { + return strtr($pattern[2], ['{0}' => (string) $strings[0], '{1}' => (string) $strings[1]]); + } + + $result = strtr($pattern['start'], ['{0}' => (string) $strings[0], '{1}' => (string) $strings[1]]); + + for ($i = 2; $i < $count - 1; ++$i) { + $result = strtr($pattern['middle'], ['{0}' => $result, '{1}' => (string) $strings[$i]]); + } + + return strtr($pattern['end'], ['{0}' => $result, '{1}' => (string) $strings[$count - 1]]); + } + + public function getErrorCode(): int + { + return 0; + } + + public function getErrorMessage(): string + { + return ''; + } +} diff --git a/lib/symfony/polyfill-intl-icu/Locale.php b/lib/symfony/polyfill-intl-icu/Locale.php index f449fd5dff..516c10b643 100644 --- a/lib/symfony/polyfill-intl-icu/Locale.php +++ b/lib/symfony/polyfill-intl-icu/Locale.php @@ -41,6 +41,28 @@ abstract class Locale public const GRANDFATHERED_LANG_TAG = 'grandfathered'; public const PRIVATE_TAG = 'private'; + private const RTL_SCRIPTS = [ + 'Adlm' => true, 'Arab' => true, 'Armi' => true, 'Hebr' => true, + 'Mand' => true, 'Mani' => true, 'Mend' => true, 'Nkoo' => true, + 'Orkh' => true, 'Phnx' => true, 'Rohg' => true, 'Samr' => true, + 'Syrc' => true, 'Thaa' => true, 'Yezi' => true, + ]; + + private const LANG_TO_SCRIPT = [ + 'ar' => 'Arab', + 'ckb' => 'Arab', + 'dv' => 'Thaa', + 'fa' => 'Arab', + 'he' => 'Hebr', + 'ku' => 'Arab', + 'nqo' => 'Nkoo', + 'ps' => 'Arab', + 'sd' => 'Arab', + 'ug' => 'Arab', + 'ur' => 'Arab', + 'yi' => 'Hebr', + ]; + /** * Not supported. Returns the best available locale based on HTTP "Accept-Language" header according to RFC 2616. * @@ -307,4 +329,22 @@ abstract class Locale return true; } + + public static function isRightToLeft(string $locale): bool + { + if ('' === $locale) { + return false; + } + + $parts = preg_split('/[_-]/', $locale); + $language = strtolower($parts[0]); + + foreach ($parts as $part) { + if (4 === \strlen($part) && ctype_alpha($part)) { + return isset(self::RTL_SCRIPTS[ucfirst(strtolower($part))]); + } + } + + return isset(self::LANG_TO_SCRIPT[$language]) && isset(self::RTL_SCRIPTS[self::LANG_TO_SCRIPT[$language]]); + } } diff --git a/lib/symfony/polyfill-intl-icu/NumberFormatter.php b/lib/symfony/polyfill-intl-icu/NumberFormatter.php index cec375db73..9c8193d19c 100644 --- a/lib/symfony/polyfill-intl-icu/NumberFormatter.php +++ b/lib/symfony/polyfill-intl-icu/NumberFormatter.php @@ -261,7 +261,7 @@ abstract class NumberFormatter } if (!\in_array($style, self::$supportedStyles)) { - $message = sprintf('The available styles are: %s.', implode(', ', array_keys(self::$supportedStyles))); + $message = \sprintf('The available styles are: %s.', implode(', ', array_keys(self::$supportedStyles))); throw new MethodArgumentValueNotImplementedException(__METHOD__, 'style', $style, $message); } @@ -352,7 +352,7 @@ abstract class NumberFormatter // The original NumberFormatter does not support this format type if (self::TYPE_CURRENCY === $type) { if (\PHP_VERSION_ID >= 80000) { - throw new \ValueError(sprintf('The format type must be a NumberFormatter::TYPE_* constant (%s given).', $type)); + throw new \ValueError(\sprintf('The format type must be a NumberFormatter::TYPE_* constant (%s given).', $type)); } trigger_error(__METHOD__.'(): Unsupported format type '.$type, \E_USER_WARNING); @@ -361,7 +361,7 @@ abstract class NumberFormatter } if (self::CURRENCY === $this->style) { - throw new NotImplementedException(sprintf('"%s()" method does not support the formatting of currencies (instance with CURRENCY style). "%s".', __METHOD__, NotImplementedException::INTL_INSTALL_MESSAGE)); + throw new NotImplementedException(\sprintf('"%s()" method does not support the formatting of currencies (instance with CURRENCY style). "%s".', __METHOD__, NotImplementedException::INTL_INSTALL_MESSAGE)); } // Only the default type is supported. @@ -496,7 +496,7 @@ abstract class NumberFormatter { if (self::TYPE_DEFAULT === $type || self::TYPE_CURRENCY === $type) { if (\PHP_VERSION_ID >= 80000) { - throw new \ValueError(sprintf('The format type must be a NumberFormatter::TYPE_* constant (%d given).', $type)); + throw new \ValueError(\sprintf('The format type must be a NumberFormatter::TYPE_* constant (%d given).', $type)); } trigger_error(__METHOD__.'(): Unsupported format type '.$type, \E_USER_WARNING); @@ -553,7 +553,7 @@ abstract class NumberFormatter public function setAttribute(int $attribute, $value) { if (!\in_array($attribute, self::$supportedAttributes)) { - $message = sprintf( + $message = \sprintf( 'The available attributes are: %s', implode(', ', array_keys(self::$supportedAttributes)) ); @@ -562,7 +562,7 @@ abstract class NumberFormatter } if (self::$supportedAttributes['ROUNDING_MODE'] === $attribute && $this->isInvalidRoundingMode($value)) { - $message = sprintf( + $message = \sprintf( 'The supported values for ROUNDING_MODE are: %s', implode(', ', array_keys(self::$roundingModes)) ); diff --git a/lib/symfony/polyfill-intl-icu/README.md b/lib/symfony/polyfill-intl-icu/README.md index b7faedc5d2..0ac69a00b9 100644 --- a/lib/symfony/polyfill-intl-icu/README.md +++ b/lib/symfony/polyfill-intl-icu/README.md @@ -13,6 +13,7 @@ It is limited to the "en" locale and to: - [`NumberFormatter`](https://php.net/NumberFormatter) - [`Locale`](https://php.net/Locale) - [`IntlDateFormatter`](https://php.net/IntlDateFormatter) +- [`IntlListFormatter`](https://php.net/IntlListFormatter) More information can be found in the [main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). diff --git a/lib/symfony/polyfill-intl-icu/Resources/stubs/IntlListFormatter.php b/lib/symfony/polyfill-intl-icu/Resources/stubs/IntlListFormatter.php new file mode 100644 index 0000000000..ba7807203d --- /dev/null +++ b/lib/symfony/polyfill-intl-icu/Resources/stubs/IntlListFormatter.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Intl\Icu\IntlListFormatter as IntlListFormatterPolyfill; + +/** + * Stub implementation for the IntlListFormatter class of the intl extension. + * + * @author Ayesh Karunaratne + */ +final class IntlListFormatter extends IntlListFormatterPolyfill +{ +} diff --git a/lib/symfony/polyfill-mbstring/Mbstring.php b/lib/symfony/polyfill-mbstring/Mbstring.php index 31e36a368f..7f256360bd 100644 --- a/lib/symfony/polyfill-mbstring/Mbstring.php +++ b/lib/symfony/polyfill-mbstring/Mbstring.php @@ -133,7 +133,7 @@ final class Mbstring public static function mb_convert_variables($toEncoding, $fromEncoding, &...$vars) { $ok = true; - array_walk_recursive($vars, function (&$v) use (&$ok, $toEncoding, $fromEncoding) { + array_walk_recursive($vars, static function (&$v) use (&$ok, $toEncoding, $fromEncoding) { if (false === $v = self::mb_convert_encoding($v, $toEncoding, $fromEncoding)) { $ok = false; } @@ -194,7 +194,7 @@ final class Mbstring $convmap[$i + 1] += $convmap[$i + 2]; } - $s = preg_replace_callback('/&#(?:0*([0-9]+)|x0*([0-9a-fA-F]+))(?!&);?/', function (array $m) use ($cnt, $convmap) { + $s = preg_replace_callback('/&#(?:0*([0-9]+)|x0*([0-9a-fA-F]+))'.(\PHP_VERSION_ID >= 80200 ? '' : '(?!&)').';?/', static function (array $m) use ($cnt, $convmap) { $c = isset($m[2]) ? (int) hexdec($m[2]) : $m[1]; for ($i = 0; $i < $cnt; $i += 4) { if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) { @@ -268,7 +268,7 @@ final class Mbstring for ($j = 0; $j < $cnt; $j += 4) { if ($c >= $convmap[$j] && $c <= $convmap[$j + 1]) { $cOffset = ($c + $convmap[$j + 2]) & $convmap[$j + 3]; - $result .= $is_hex ? sprintf('&#x%X;', $cOffset) : '&#'.$cOffset.';'; + $result .= $is_hex ? \sprintf('&#x%X;', $cOffset) : '&#'.$cOffset.';'; continue 2; } } @@ -382,7 +382,7 @@ final class Mbstring return false; } - throw new \ValueError(sprintf('Argument #1 ($encoding) must be a valid encoding, "%s" given', $encoding)); + throw new \ValueError(\sprintf('Argument #1 ($encoding) must be a valid encoding, "%s" given', $encoding)); } public static function mb_language($lang = null) @@ -403,7 +403,7 @@ final class Mbstring return false; } - throw new \ValueError(sprintf('Argument #1 ($language) must be a valid language, "%s" given', $lang)); + throw new \ValueError(\sprintf('Argument #1 ($language) must be a valid language, "%s" given', $lang)); } public static function mb_list_encodings() @@ -834,19 +834,32 @@ final class Mbstring return $code; } - public static function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = \STR_PAD_RIGHT, ?string $encoding = null): string + /** @return string|false */ + public static function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = \STR_PAD_RIGHT, ?string $encoding = null) { if (!\in_array($pad_type, [\STR_PAD_RIGHT, \STR_PAD_LEFT, \STR_PAD_BOTH], true)) { + if (\PHP_VERSION_ID < 80000) { + trigger_error('mb_str_pad(): Argument #4 ($pad_type) must be STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH', \E_USER_WARNING); + + return false; + } + throw new \ValueError('mb_str_pad(): Argument #4 ($pad_type) must be STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH'); } if (null === $encoding) { $encoding = self::mb_internal_encoding(); - } else { - self::assertEncoding($encoding, 'mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given'); + } elseif (!self::assertEncoding($encoding, 'mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given')) { + return false; } if (self::mb_strlen($pad_string, $encoding) <= 0) { + if (\PHP_VERSION_ID < 80000) { + trigger_error('mb_str_pad(): Argument #3 ($pad_string) must be a non-empty string', \E_USER_WARNING); + + return false; + } + throw new \ValueError('mb_str_pad(): Argument #3 ($pad_string) must be a non-empty string'); } @@ -869,12 +882,13 @@ final class Mbstring } } - public static function mb_ucfirst(string $string, ?string $encoding = null): string + /** @return string|false */ + public static function mb_ucfirst(string $string, ?string $encoding = null) { if (null === $encoding) { $encoding = self::mb_internal_encoding(); - } else { - self::assertEncoding($encoding, 'mb_ucfirst(): Argument #2 ($encoding) must be a valid encoding, "%s" given'); + } elseif (!self::assertEncoding($encoding, 'mb_ucfirst(): Argument #2 ($encoding) must be a valid encoding, "%s" given')) { + return false; } $firstChar = mb_substr($string, 0, 1, $encoding); @@ -883,12 +897,13 @@ final class Mbstring return $firstChar.mb_substr($string, 1, null, $encoding); } - public static function mb_lcfirst(string $string, ?string $encoding = null): string + /** @return string|false */ + public static function mb_lcfirst(string $string, ?string $encoding = null) { if (null === $encoding) { $encoding = self::mb_internal_encoding(); - } else { - self::assertEncoding($encoding, 'mb_lcfirst(): Argument #2 ($encoding) must be a valid encoding, "%s" given'); + } elseif (!self::assertEncoding($encoding, 'mb_lcfirst(): Argument #2 ($encoding) must be a valid encoding, "%s" given')) { + return false; } $firstChar = mb_substr($string, 0, 1, $encoding); @@ -968,30 +983,42 @@ final class Mbstring return 'UTF-8'; } + if ('UTF-32' === $encoding) { + return 'UTF-32BE'; + } + + if ('UTF-16' === $encoding) { + return 'UTF-16BE'; + } + return $encoding; } - public static function mb_trim(string $string, ?string $characters = null, ?string $encoding = null): string + /** @return string|false */ + public static function mb_trim(string $string, ?string $characters = null, ?string $encoding = null) { return self::mb_internal_trim('{^[%s]+|[%1$s]+$}Du', $string, $characters, $encoding, __FUNCTION__); } - public static function mb_ltrim(string $string, ?string $characters = null, ?string $encoding = null): string + /** @return string|false */ + public static function mb_ltrim(string $string, ?string $characters = null, ?string $encoding = null) { return self::mb_internal_trim('{^[%s]+}Du', $string, $characters, $encoding, __FUNCTION__); } - public static function mb_rtrim(string $string, ?string $characters = null, ?string $encoding = null): string + /** @return string|false */ + public static function mb_rtrim(string $string, ?string $characters = null, ?string $encoding = null) { return self::mb_internal_trim('{[%s]+$}Du', $string, $characters, $encoding, __FUNCTION__); } - private static function mb_internal_trim(string $regex, string $string, ?string $characters, ?string $encoding, string $function): string + /** @return string|false */ + private static function mb_internal_trim(string $regex, string $string, ?string $characters, ?string $encoding, string $function) { if (null === $encoding) { $encoding = self::mb_internal_encoding(); - } else { - self::assertEncoding($encoding, $function.'(): Argument #3 ($encoding) must be a valid encoding, "%s" given'); + } elseif (!self::assertEncoding($encoding, $function.'(): Argument #3 ($encoding) must be a valid encoding, "%s" given')) { + return false; } if ('' === $characters) { @@ -1020,7 +1047,7 @@ final class Mbstring $characters = preg_quote($characters); } - $string = preg_replace(sprintf($regex, $characters), '', $string); + $string = preg_replace(\sprintf($regex, $characters), '', $string); if (null === $encoding) { return $string; @@ -1029,17 +1056,22 @@ final class Mbstring return iconv('UTF-8', $encoding.'//IGNORE', $string); } - private static function assertEncoding(string $encoding, string $errorFormat): void + private static function assertEncoding(string $encoding, string $errorFormat): bool { try { $validEncoding = @self::mb_check_encoding('', $encoding); } catch (\ValueError $e) { - throw new \ValueError(sprintf($errorFormat, $encoding)); + throw new \ValueError(\sprintf($errorFormat, $encoding)); } - // BC for PHP 7.3 and lower if (!$validEncoding) { - throw new \ValueError(sprintf($errorFormat, $encoding)); + if (80000 > \PHP_VERSION_ID) { + trigger_error(\sprintf($errorFormat, $encoding), \E_USER_WARNING); + } else { + throw new \ValueError(\sprintf($errorFormat, $encoding)); + } } + + return $validEncoding; } } diff --git a/lib/symfony/polyfill-mbstring/bootstrap.php b/lib/symfony/polyfill-mbstring/bootstrap.php index ff51ae0796..df3d9f3d4f 100644 --- a/lib/symfony/polyfill-mbstring/bootstrap.php +++ b/lib/symfony/polyfill-mbstring/bootstrap.php @@ -133,30 +133,29 @@ if (!function_exists('mb_str_split')) { } if (!function_exists('mb_str_pad')) { - function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = STR_PAD_RIGHT, ?string $encoding = null): string { return p\Mbstring::mb_str_pad($string, $length, $pad_string, $pad_type, $encoding); } + function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = STR_PAD_RIGHT, ?string $encoding = null) { return p\Mbstring::mb_str_pad($string, $length, $pad_string, $pad_type, $encoding); } } if (!function_exists('mb_ucfirst')) { - function mb_ucfirst(string $string, ?string $encoding = null): string { return p\Mbstring::mb_ucfirst($string, $encoding); } + function mb_ucfirst(string $string, ?string $encoding = null) { return p\Mbstring::mb_ucfirst($string, $encoding); } } if (!function_exists('mb_lcfirst')) { - function mb_lcfirst(string $string, ?string $encoding = null): string { return p\Mbstring::mb_lcfirst($string, $encoding); } + function mb_lcfirst(string $string, ?string $encoding = null) { return p\Mbstring::mb_lcfirst($string, $encoding); } } if (!function_exists('mb_trim')) { - function mb_trim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_trim($string, $characters, $encoding); } + function mb_trim(string $string, ?string $characters = null, ?string $encoding = null) { return p\Mbstring::mb_trim($string, $characters, $encoding); } } if (!function_exists('mb_ltrim')) { - function mb_ltrim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_ltrim($string, $characters, $encoding); } + function mb_ltrim(string $string, ?string $characters = null, ?string $encoding = null) { return p\Mbstring::mb_ltrim($string, $characters, $encoding); } } if (!function_exists('mb_rtrim')) { - function mb_rtrim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_rtrim($string, $characters, $encoding); } + function mb_rtrim(string $string, ?string $characters = null, ?string $encoding = null) { return p\Mbstring::mb_rtrim($string, $characters, $encoding); } } - if (extension_loaded('mbstring')) { return; } diff --git a/lib/symfony/polyfill-php83/Php83.php b/lib/symfony/polyfill-php83/Php83.php index 8b7ee4c700..03409fb0c2 100644 --- a/lib/symfony/polyfill-php83/Php83.php +++ b/lib/symfony/polyfill-php83/Php83.php @@ -32,7 +32,7 @@ final class Php83 } if ($depth > self::JSON_MAX_DEPTH) { - throw new \ValueError(sprintf('json_validate(): Argument #2 ($depth) must be less than %d', self::JSON_MAX_DEPTH)); + throw new \ValueError(\sprintf('json_validate(): Argument #2 ($depth) must be less than %d', self::JSON_MAX_DEPTH)); } json_decode($json, true, $depth, $flags); @@ -40,7 +40,8 @@ final class Php83 return \JSON_ERROR_NONE === json_last_error(); } - public static function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = \STR_PAD_RIGHT, ?string $encoding = null): string + /** @return string|false */ + public static function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = \STR_PAD_RIGHT, ?string $encoding = null) { if (!\in_array($pad_type, [\STR_PAD_RIGHT, \STR_PAD_LEFT, \STR_PAD_BOTH], true)) { throw new \ValueError('mb_str_pad(): Argument #4 ($pad_type) must be STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH'); @@ -50,19 +51,27 @@ final class Php83 $encoding = mb_internal_encoding(); } + $errorToTrigger = null; try { - $validEncoding = @mb_check_encoding('', $encoding); + if (!@mb_check_encoding('', $encoding)) { + $errorToTrigger = \sprintf('mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given', $encoding); + } } catch (\ValueError $e) { - throw new \ValueError(sprintf('mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given', $encoding)); - } - - // BC for PHP 7.3 and lower - if (!$validEncoding) { - throw new \ValueError(sprintf('mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given', $encoding)); + $errorToTrigger = \sprintf('mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given', $encoding); } if (mb_strlen($pad_string, $encoding) <= 0) { - throw new \ValueError('mb_str_pad(): Argument #3 ($pad_string) must be a non-empty string'); + $errorToTrigger = 'mb_str_pad(): Argument #3 ($pad_string) must be a non-empty string'; + } + + if (null !== $errorToTrigger) { + if (80000 > \PHP_VERSION_ID) { + trigger_error($errorToTrigger, \E_USER_WARNING); + + return false; + } + + throw new \ValueError($errorToTrigger); } $paddingRequired = $length - mb_strlen($string, $encoding); @@ -135,7 +144,7 @@ final class Php83 } if (preg_match('/\A(?:0[aA0]?|[aA])\z/', $string)) { - throw new \ValueError(sprintf('str_decrement(): Argument #1 ($string) "%s" is out of decrement range', $string)); + throw new \ValueError(\sprintf('str_decrement(): Argument #1 ($string) "%s" is out of decrement range', $string)); } if (!\in_array(substr($string, -1), ['A', 'a', '0'], true)) { diff --git a/lib/symfony/polyfill-php83/bootstrap.php b/lib/symfony/polyfill-php83/bootstrap.php index a92799cb38..8d721a29ca 100644 --- a/lib/symfony/polyfill-php83/bootstrap.php +++ b/lib/symfony/polyfill-php83/bootstrap.php @@ -19,12 +19,6 @@ if (!function_exists('json_validate')) { function json_validate(string $json, int $depth = 512, int $flags = 0): bool { return p\Php83::json_validate($json, $depth, $flags); } } -if (extension_loaded('mbstring')) { - if (!function_exists('mb_str_pad')) { - function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = STR_PAD_RIGHT, ?string $encoding = null): string { return p\Php83::mb_str_pad($string, $length, $pad_string, $pad_type, $encoding); } - } -} - if (!function_exists('stream_context_set_options')) { function stream_context_set_options($context, array $options): bool { return stream_context_set_option($context, $options); } } @@ -37,8 +31,14 @@ if (!function_exists('str_decrement')) { function str_decrement(string $string): string { return p\Php83::str_decrement($string); } } -if (\PHP_VERSION_ID >= 80100) { - return require __DIR__.'/bootstrap81.php'; +if (\PHP_VERSION_ID >= 80000) { + return require __DIR__.'/bootstrap80.php'; +} + +if (extension_loaded('mbstring')) { + if (!function_exists('mb_str_pad')) { + function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = STR_PAD_RIGHT, ?string $encoding = null) { return p\Php83::mb_str_pad($string, $length, $pad_string, $pad_type, $encoding); } + } } if (!function_exists('ldap_exop_sync') && function_exists('ldap_exop')) { diff --git a/lib/symfony/polyfill-php83/bootstrap80.php b/lib/symfony/polyfill-php83/bootstrap80.php new file mode 100644 index 0000000000..9b812d0244 --- /dev/null +++ b/lib/symfony/polyfill-php83/bootstrap80.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Php83 as p; + +if (extension_loaded('mbstring')) { + if (!function_exists('mb_str_pad')) { + function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = STR_PAD_RIGHT, ?string $encoding = null): string { return p\Php83::mb_str_pad($string, $length, $pad_string, $pad_type, $encoding); } + } +} + +if (\PHP_VERSION_ID >= 80100) { + return require __DIR__.'/bootstrap81.php'; +} + +if (!function_exists('ldap_exop_sync') && function_exists('ldap_exop')) { + function ldap_exop_sync($ldap, string $request_oid, ?string $request_data = null, ?array $controls = null, &$response_data = null, &$response_oid = null): bool { return ldap_exop($ldap, $request_oid, $request_data, $controls, $response_data, $response_oid); } +} + +if (!function_exists('ldap_connect_wallet') && function_exists('ldap_connect')) { + function ldap_connect_wallet(?string $uri, string $wallet, string $password, int $auth_mode = \GSLC_SSL_NO_AUTH) { return ldap_connect($uri, $wallet, $password, $auth_mode); } +} diff --git a/lib/symfony/runtime/CHANGELOG.md b/lib/symfony/runtime/CHANGELOG.md new file mode 100644 index 0000000000..1a608b4cf7 --- /dev/null +++ b/lib/symfony/runtime/CHANGELOG.md @@ -0,0 +1,19 @@ +CHANGELOG +========= + +6.4 +--- + + * Add argument `bool $debug = false` to `HttpKernelRunner::__construct()` + +5.4 +--- + + * The component is not experimental anymore + * Add options "env_var_name" and "debug_var_name" to `GenericRuntime` and `SymfonyRuntime` + * Add option "dotenv_overload" to `SymfonyRuntime` + +5.3.0 +----- + + * Add the component diff --git a/lib/symfony/runtime/GenericRuntime.php b/lib/symfony/runtime/GenericRuntime.php new file mode 100644 index 0000000000..b432630d13 --- /dev/null +++ b/lib/symfony/runtime/GenericRuntime.php @@ -0,0 +1,223 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Runtime; + +use Symfony\Component\Runtime\Internal\BasicErrorHandler; +use Symfony\Component\Runtime\Resolver\ClosureResolver; +use Symfony\Component\Runtime\Resolver\DebugClosureResolver; +use Symfony\Component\Runtime\Runner\ClosureRunner; + +// Help opcache.preload discover always-needed symbols +class_exists(ClosureResolver::class); + +/** + * A runtime to do bare-metal PHP without using superglobals. + * + * It supports the following options: + * - "debug" toggles displaying errors and defaults + * to the "APP_DEBUG" environment variable; + * - "runtimes" maps types to a GenericRuntime implementation + * that knows how to deal with each of them; + * - "error_handler" defines the class to use to handle PHP errors; + * - "env_var_name" and "debug_var_name" define the name of the env + * vars that hold the Symfony env and the debug flag respectively. + * + * The app-callable can declare arguments among either: + * - "array $context" to get a local array similar to $_SERVER; + * - "array $argv" to get the command line arguments when running on the CLI; + * - "array $request" to get a local array with keys "query", "body", "files" and + * "session", which map to $_GET, $_POST, $FILES and &$_SESSION respectively. + * + * It should return a Closure():int|string|null or an instance of RunnerInterface. + * + * In debug mode, the runtime registers a strict error handler + * that throws exceptions when a PHP warning/notice is raised. + * + * @author Nicolas Grekas + */ +class GenericRuntime implements RuntimeInterface +{ + protected $options; + + /** + * @param array { + * debug?: ?bool, + * runtimes?: ?array, + * error_handler?: string|false, + * env_var_name?: string, + * debug_var_name?: string, + * } $options + */ + public function __construct(array $options = []) + { + $options['env_var_name'] ??= 'APP_ENV'; + $debugKey = $options['debug_var_name'] ??= 'APP_DEBUG'; + + $debug = $options['debug'] ?? $_SERVER[$debugKey] ?? $_ENV[$debugKey] ?? true; + + if (!\is_bool($debug)) { + $debug = filter_var($debug, \FILTER_VALIDATE_BOOL); + } + + if ($debug) { + umask(0000); + $_SERVER[$debugKey] = $_ENV[$debugKey] = '1'; + } else { + $_SERVER[$debugKey] = $_ENV[$debugKey] = '0'; + } + + if (false !== $errorHandler = ($options['error_handler'] ?? BasicErrorHandler::class)) { + $errorHandler::register($debug); + $options['error_handler'] = false; + } + + $this->options = $options; + } + + public function getResolver(callable $callable, ?\ReflectionFunction $reflector = null): ResolverInterface + { + $callable = $callable(...); + $parameters = ($reflector ?? new \ReflectionFunction($callable))->getParameters(); + $arguments = function () use ($parameters) { + $arguments = []; + + try { + foreach ($parameters as $parameter) { + $type = $parameter->getType(); + $arguments[] = $this->getArgument($parameter, $type instanceof \ReflectionNamedType ? $type->getName() : null); + } + } catch (\InvalidArgumentException $e) { + if (!$parameter->isOptional()) { + throw $e; + } + } + + return $arguments; + }; + + if ($_SERVER[$this->options['debug_var_name']]) { + return new DebugClosureResolver($callable, $arguments); + } + + return new ClosureResolver($callable, $arguments); + } + + public function getRunner(?object $application): RunnerInterface + { + $application ??= static fn () => 0; + + if ($application instanceof RunnerInterface) { + return $application; + } + + if (!$application instanceof \Closure) { + if ($runtime = $this->resolveRuntime($application::class)) { + return $runtime->getRunner($application); + } + + if (!\is_callable($application)) { + throw new \LogicException(\sprintf('"%s" doesn\'t know how to handle apps of type "%s".', get_debug_type($this), get_debug_type($application))); + } + + $application = $application(...); + } + + if ($_SERVER[$this->options['debug_var_name']] && ($r = new \ReflectionFunction($application)) && $r->getNumberOfRequiredParameters()) { + throw new \ArgumentCountError(\sprintf('Zero argument should be required by the runner callable, but at least one is in "%s" on line "%d.', $r->getFileName(), $r->getStartLine())); + } + + return new ClosureRunner($application); + } + + protected function getArgument(\ReflectionParameter $parameter, ?string $type): mixed + { + if ('array' === $type) { + switch ($parameter->name) { + case 'context': + $context = $_SERVER; + + if ($_ENV && !isset($_SERVER['PATH']) && !isset($_SERVER['Path'])) { + $context += $_ENV; + } + + return $context; + + case 'argv': + return $_SERVER['argv'] ?? []; + + case 'request': + return [ + 'query' => $_GET, + 'body' => $_POST, + 'files' => $_FILES, + 'session' => &$_SESSION, + ]; + } + } + + if (RuntimeInterface::class === $type) { + return $this; + } + + if (!$runtime = $this->getRuntime($type)) { + $r = $parameter->getDeclaringFunction(); + + throw new \InvalidArgumentException(\sprintf('Cannot resolve argument "%s $%s" in "%s" on line "%d": "%s" supports only arguments "array $context", "array $argv" and "array $request", or a runtime named "Symfony\Runtime\%1$sRuntime".', $type, $parameter->name, $r->getFileName(), $r->getStartLine(), get_debug_type($this))); + } + + return $runtime->getArgument($parameter, $type); + } + + protected static function register(self $runtime): self + { + return $runtime; + } + + private function getRuntime(string $type): ?self + { + if (null === $runtime = ($this->options['runtimes'][$type] ?? null)) { + $runtime = 'Symfony\Runtime\\'.$type.'Runtime'; + $runtime = class_exists($runtime) ? $runtime : $this->options['runtimes'][$type] = false; + } + + if (\is_string($runtime)) { + $runtime = $runtime::register($this); + } + + if ($this === $runtime) { + return null; + } + + return $runtime ?: null; + } + + private function resolveRuntime(string $class): ?self + { + if ($runtime = $this->getRuntime($class)) { + return $runtime; + } + + foreach (class_parents($class) as $type) { + if ($runtime = $this->getRuntime($type)) { + return $runtime; + } + } + + foreach (class_implements($class) as $type) { + if ($runtime = $this->getRuntime($type)) { + return $runtime; + } + } + + return null; + } +} diff --git a/lib/symfony/runtime/Internal/BasicErrorHandler.php b/lib/symfony/runtime/Internal/BasicErrorHandler.php new file mode 100644 index 0000000000..c0c290e686 --- /dev/null +++ b/lib/symfony/runtime/Internal/BasicErrorHandler.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 Symfony\Component\Runtime\Internal; + +/** + * @author Nicolas Grekas + * + * @internal + */ +class BasicErrorHandler +{ + public static function register(bool $debug): void + { + error_reporting(\E_ALL & ~\E_DEPRECATED & ~\E_USER_DEPRECATED); + + if (!\in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) { + ini_set('display_errors', $debug); + } elseif (!filter_var(\ini_get('log_errors'), \FILTER_VALIDATE_BOOL) || \ini_get('error_log')) { + // CLI - display errors only if they're not already logged to STDERR + ini_set('display_errors', 1); + } + + if (0 <= \ini_get('zend.assertions')) { + ini_set('zend.assertions', (int) $debug); + } + ini_set('assert.active', 1); + ini_set('assert.exception', 1); + + set_error_handler(new self()); + } + + public function __invoke(int $type, string $message, string $file, int $line): bool + { + if ((\E_DEPRECATED | \E_USER_DEPRECATED) & $type) { + return true; + } + + if ((error_reporting() | \E_ERROR | \E_RECOVERABLE_ERROR | \E_PARSE | \E_CORE_ERROR | \E_COMPILE_ERROR | \E_USER_ERROR) & $type) { + throw new \ErrorException($message, 0, $type, $file, $line); + } + + return false; + } +} diff --git a/lib/symfony/runtime/Internal/ComposerPlugin.php b/lib/symfony/runtime/Internal/ComposerPlugin.php new file mode 100644 index 0000000000..cad8d85fc3 --- /dev/null +++ b/lib/symfony/runtime/Internal/ComposerPlugin.php @@ -0,0 +1,119 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Runtime\Internal; + +use Composer\Composer; +use Composer\EventDispatcher\EventSubscriberInterface; +use Composer\Factory; +use Composer\IO\IOInterface; +use Composer\Plugin\PluginInterface; +use Composer\Script\ScriptEvents; +use Symfony\Component\Filesystem\Filesystem; +use Symfony\Component\Runtime\SymfonyRuntime; + +/** + * @author Nicolas Grekas + * + * @internal + */ +class ComposerPlugin implements PluginInterface, EventSubscriberInterface +{ + private Composer $composer; + private IOInterface $io; + + private static bool $activated = false; + + public function activate(Composer $composer, IOInterface $io): void + { + self::$activated = true; + $this->composer = $composer; + $this->io = $io; + } + + public function deactivate(Composer $composer, IOInterface $io): void + { + self::$activated = false; + } + + public function uninstall(Composer $composer, IOInterface $io): void + { + @unlink($composer->getConfig()->get('vendor-dir').'/autoload_runtime.php'); + } + + public function updateAutoloadFile(): void + { + $vendorDir = realpath($this->composer->getConfig()->get('vendor-dir')); + + if (!is_file($autoloadFile = $vendorDir.'/autoload.php') + || false === $extra = $this->composer->getPackage()->getExtra()['runtime'] ?? [] + ) { + return; + } + + $fs = new Filesystem(); + $projectDir = \dirname(realpath(Factory::getComposerFile())); + + if (null === $autoloadTemplate = $extra['autoload_template'] ?? null) { + $autoloadTemplate = __DIR__.'/autoload_runtime.template'; + } else { + if (!$fs->isAbsolutePath($autoloadTemplate)) { + $autoloadTemplate = $projectDir.'/'.$autoloadTemplate; + } + + if (!is_file($autoloadTemplate)) { + throw new \InvalidArgumentException(\sprintf('File "%s" defined under "extra.runtime.autoload_template" in your composer.json file not found.', $this->composer->getPackage()->getExtra()['runtime']['autoload_template'])); + } + } + + $projectDir = $fs->makePathRelative($projectDir, $vendorDir); + $nestingLevel = 0; + + while (str_starts_with($projectDir, '../')) { + ++$nestingLevel; + $projectDir = substr($projectDir, 3); + } + + if (!$nestingLevel) { + $projectDir = '__'.'DIR__.'.var_export('/'.$projectDir, true); + } else { + $projectDir = 'dirname(__'."DIR__, $nestingLevel)".('' !== $projectDir ? '.'.var_export('/'.$projectDir, true) : ''); + } + + $runtimeClass = $extra['class'] ?? SymfonyRuntime::class; + + unset($extra['class'], $extra['autoload_template']); + + $code = strtr(file_get_contents($autoloadTemplate), [ + '%project_dir%' => $projectDir, + '%runtime_class%' => var_export($runtimeClass, true), + '%runtime_options%' => '['.substr(var_export($extra, true), 7, -1)." 'project_dir' => {$projectDir},\n]", + ]); + + // could use Composer\Util\Filesystem::filePutContentsIfModified once Composer 1.x support is dropped for this plugin + $path = substr_replace($autoloadFile, '_runtime', -4, 0); + $currentContent = @file_exists($path) ? @file_get_contents($path) : false; + if (false === $currentContent || $currentContent !== $code) { + file_put_contents($path, $code); + } + } + + public static function getSubscribedEvents(): array + { + if (!self::$activated) { + return []; + } + + return [ + ScriptEvents::POST_AUTOLOAD_DUMP => 'updateAutoloadFile', + ]; + } +} diff --git a/lib/symfony/runtime/Internal/Console/ApplicationRuntime.php b/lib/symfony/runtime/Internal/Console/ApplicationRuntime.php new file mode 100644 index 0000000000..de6b1d9748 --- /dev/null +++ b/lib/symfony/runtime/Internal/Console/ApplicationRuntime.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Runtime\Symfony\Component\Console; + +use Symfony\Component\Runtime\SymfonyRuntime; + +/** + * @internal + */ +class ApplicationRuntime extends SymfonyRuntime +{ +} diff --git a/lib/symfony/runtime/Internal/Console/Command/CommandRuntime.php b/lib/symfony/runtime/Internal/Console/Command/CommandRuntime.php new file mode 100644 index 0000000000..9cc198ea1b --- /dev/null +++ b/lib/symfony/runtime/Internal/Console/Command/CommandRuntime.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Runtime\Symfony\Component\Console\Command; + +use Symfony\Component\Runtime\SymfonyRuntime; + +/** + * @internal + */ +class CommandRuntime extends SymfonyRuntime +{ +} diff --git a/lib/symfony/runtime/Internal/Console/Input/InputInterfaceRuntime.php b/lib/symfony/runtime/Internal/Console/Input/InputInterfaceRuntime.php new file mode 100644 index 0000000000..44360bf508 --- /dev/null +++ b/lib/symfony/runtime/Internal/Console/Input/InputInterfaceRuntime.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Runtime\Symfony\Component\Console\Input; + +use Symfony\Component\Runtime\SymfonyRuntime; + +/** + * @internal + */ +class InputInterfaceRuntime extends SymfonyRuntime +{ +} diff --git a/lib/symfony/runtime/Internal/Console/Output/OutputInterfaceRuntime.php b/lib/symfony/runtime/Internal/Console/Output/OutputInterfaceRuntime.php new file mode 100644 index 0000000000..7c59186adc --- /dev/null +++ b/lib/symfony/runtime/Internal/Console/Output/OutputInterfaceRuntime.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Runtime\Symfony\Component\Console\Output; + +use Symfony\Component\Runtime\SymfonyRuntime; + +/** + * @internal + */ +class OutputInterfaceRuntime extends SymfonyRuntime +{ +} diff --git a/lib/symfony/runtime/Internal/HttpFoundation/RequestRuntime.php b/lib/symfony/runtime/Internal/HttpFoundation/RequestRuntime.php new file mode 100644 index 0000000000..2a3a0bb827 --- /dev/null +++ b/lib/symfony/runtime/Internal/HttpFoundation/RequestRuntime.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Runtime\Symfony\Component\HttpFoundation; + +use Symfony\Component\Runtime\SymfonyRuntime; + +/** + * @internal + */ +class RequestRuntime extends SymfonyRuntime +{ +} diff --git a/lib/symfony/runtime/Internal/HttpFoundation/ResponseRuntime.php b/lib/symfony/runtime/Internal/HttpFoundation/ResponseRuntime.php new file mode 100644 index 0000000000..c70fbfff59 --- /dev/null +++ b/lib/symfony/runtime/Internal/HttpFoundation/ResponseRuntime.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Runtime\Symfony\Component\HttpFoundation; + +use Symfony\Component\Runtime\SymfonyRuntime; + +/** + * @internal + */ +class ResponseRuntime extends SymfonyRuntime +{ +} diff --git a/lib/symfony/runtime/Internal/HttpKernel/HttpKernelInterfaceRuntime.php b/lib/symfony/runtime/Internal/HttpKernel/HttpKernelInterfaceRuntime.php new file mode 100644 index 0000000000..08601abffc --- /dev/null +++ b/lib/symfony/runtime/Internal/HttpKernel/HttpKernelInterfaceRuntime.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Runtime\Symfony\Component\HttpKernel; + +use Symfony\Component\Runtime\SymfonyRuntime; + +/** + * @internal + */ +class HttpKernelInterfaceRuntime extends SymfonyRuntime +{ +} diff --git a/lib/symfony/runtime/Internal/MissingDotenv.php b/lib/symfony/runtime/Internal/MissingDotenv.php new file mode 100644 index 0000000000..896865653e --- /dev/null +++ b/lib/symfony/runtime/Internal/MissingDotenv.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Runtime\Internal; + +/** + * @internal class that should be loaded only when symfony/dotenv is not installed + */ +class MissingDotenv +{ +} diff --git a/lib/symfony/runtime/Internal/SymfonyErrorHandler.php b/lib/symfony/runtime/Internal/SymfonyErrorHandler.php new file mode 100644 index 0000000000..47c67605b0 --- /dev/null +++ b/lib/symfony/runtime/Internal/SymfonyErrorHandler.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Runtime\Internal; + +use Symfony\Component\ErrorHandler\BufferingLogger; +use Symfony\Component\ErrorHandler\DebugClassLoader; +use Symfony\Component\ErrorHandler\ErrorHandler; + +/** + * @author Nicolas Grekas + * + * @internal + */ +class SymfonyErrorHandler +{ + public static function register(bool $debug): void + { + if (!class_exists(ErrorHandler::class)) { + BasicErrorHandler::register($debug); + + return; + } + + error_reporting(\E_ALL & ~\E_DEPRECATED & ~\E_USER_DEPRECATED); + + if (!\in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) { + ini_set('display_errors', $debug); + } elseif (!filter_var(\ini_get('log_errors'), \FILTER_VALIDATE_BOOL) || \ini_get('error_log')) { + // CLI - display errors only if they're not already logged to STDERR + ini_set('display_errors', 1); + } + + if (0 <= \ini_get('zend.assertions')) { + ini_set('zend.assertions', (int) $debug); + } + ini_set('assert.active', 1); + ini_set('assert.exception', 1); + + if ($debug) { + DebugClassLoader::enable(); + } + + ErrorHandler::register(new ErrorHandler(new BufferingLogger(), $debug)); + } +} diff --git a/lib/symfony/runtime/Internal/autoload_runtime.template b/lib/symfony/runtime/Internal/autoload_runtime.template new file mode 100644 index 0000000000..68af945932 --- /dev/null +++ b/lib/symfony/runtime/Internal/autoload_runtime.template @@ -0,0 +1,28 @@ +getResolver($app) + ->resolve(); + +$app = $app(...$args); + +exit( + $runtime + ->getRunner($app) + ->run() +); diff --git a/lib/symfony/runtime/LICENSE b/lib/symfony/runtime/LICENSE new file mode 100644 index 0000000000..99c6bdf356 --- /dev/null +++ b/lib/symfony/runtime/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2021-present Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/lib/symfony/runtime/README.md b/lib/symfony/runtime/README.md new file mode 100644 index 0000000000..006e7a22cd --- /dev/null +++ b/lib/symfony/runtime/README.md @@ -0,0 +1,13 @@ +Runtime Component +================= + +Symfony Runtime enables decoupling applications from global state. + +Resources +--------- + + * [Documentation](https://symfony.com/doc/current/components/runtime.html) + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/lib/symfony/runtime/Resolver/ClosureResolver.php b/lib/symfony/runtime/Resolver/ClosureResolver.php new file mode 100644 index 0000000000..c58cf2fbfb --- /dev/null +++ b/lib/symfony/runtime/Resolver/ClosureResolver.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 Symfony\Component\Runtime\Resolver; + +use Symfony\Component\Runtime\ResolverInterface; + +/** + * @author Nicolas Grekas + */ +class ClosureResolver implements ResolverInterface +{ + public function __construct( + private readonly \Closure $closure, + private readonly \Closure $arguments, + ) { + } + + public function resolve(): array + { + return [$this->closure, ($this->arguments)()]; + } +} diff --git a/lib/symfony/runtime/Resolver/DebugClosureResolver.php b/lib/symfony/runtime/Resolver/DebugClosureResolver.php new file mode 100644 index 0000000000..026b2731b1 --- /dev/null +++ b/lib/symfony/runtime/Resolver/DebugClosureResolver.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 Symfony\Component\Runtime\Resolver; + +/** + * @author Nicolas Grekas + */ +class DebugClosureResolver extends ClosureResolver +{ + public function resolve(): array + { + [$closure, $arguments] = parent::resolve(); + + return [ + static function (...$arguments) use ($closure) { + if (\is_object($app = $closure(...$arguments)) || null === $app) { + return $app; + } + + $r = new \ReflectionFunction($closure); + + throw new \TypeError(\sprintf('Unexpected value of type "%s" returned, "object" expected from "%s" on line "%d".', get_debug_type($app), $r->getFileName(), $r->getStartLine())); + }, + $arguments, + ]; + } +} diff --git a/lib/symfony/runtime/ResolverInterface.php b/lib/symfony/runtime/ResolverInterface.php new file mode 100644 index 0000000000..f6fa5980ed --- /dev/null +++ b/lib/symfony/runtime/ResolverInterface.php @@ -0,0 +1,23 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Runtime; + +/** + * @author Nicolas Grekas + */ +interface ResolverInterface +{ + /** + * @return array{0: callable, 1: mixed[]} + */ + public function resolve(): array; +} diff --git a/lib/symfony/runtime/Runner/ClosureRunner.php b/lib/symfony/runtime/Runner/ClosureRunner.php new file mode 100644 index 0000000000..2b54f5a320 --- /dev/null +++ b/lib/symfony/runtime/Runner/ClosureRunner.php @@ -0,0 +1,44 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Runtime\Runner; + +use Symfony\Component\Runtime\RunnerInterface; + +/** + * @author Nicolas Grekas + */ +class ClosureRunner implements RunnerInterface +{ + public function __construct( + private readonly \Closure $closure, + ) { + } + + public function run(): int + { + $exitStatus = ($this->closure)(); + + if (\is_string($exitStatus)) { + echo $exitStatus; + + return 0; + } + + if (null !== $exitStatus && !\is_int($exitStatus)) { + $r = new \ReflectionFunction($this->closure); + + throw new \TypeError(\sprintf('Unexpected value of type "%s" returned, "string|int|null" expected from "%s" on line "%d".', get_debug_type($exitStatus), $r->getFileName(), $r->getStartLine())); + } + + return $exitStatus ?? 0; + } +} diff --git a/lib/symfony/runtime/Runner/Symfony/ConsoleApplicationRunner.php b/lib/symfony/runtime/Runner/Symfony/ConsoleApplicationRunner.php new file mode 100644 index 0000000000..d64bc1c77b --- /dev/null +++ b/lib/symfony/runtime/Runner/Symfony/ConsoleApplicationRunner.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 Symfony\Component\Runtime\Runner\Symfony; + +use Symfony\Component\Console\Application; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Runtime\RunnerInterface; + +/** + * @author Nicolas Grekas + */ +class ConsoleApplicationRunner implements RunnerInterface +{ + public function __construct( + private readonly Application $application, + private readonly ?string $defaultEnv, + private readonly InputInterface $input, + private readonly ?OutputInterface $output = null, + ) { + } + + public function run(): int + { + if (null === $this->defaultEnv) { + return $this->application->run($this->input, $this->output); + } + + $definition = $this->application->getDefinition(); + + if (!$definition->hasOption('env') && !$definition->hasOption('e') && !$definition->hasShortcut('e')) { + $definition->addOption(new InputOption('--env', '-e', InputOption::VALUE_REQUIRED, 'The Environment name.', $this->defaultEnv)); + } + + if (!$definition->hasOption('no-debug')) { + $definition->addOption(new InputOption('--no-debug', null, InputOption::VALUE_NONE, 'Switches off debug mode.')); + } + + return $this->application->run($this->input, $this->output); + } +} diff --git a/lib/symfony/runtime/Runner/Symfony/HttpKernelRunner.php b/lib/symfony/runtime/Runner/Symfony/HttpKernelRunner.php new file mode 100644 index 0000000000..13c9037ca8 --- /dev/null +++ b/lib/symfony/runtime/Runner/Symfony/HttpKernelRunner.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Runtime\Runner\Symfony; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\HttpKernelInterface; +use Symfony\Component\HttpKernel\Kernel; +use Symfony\Component\HttpKernel\TerminableInterface; +use Symfony\Component\Runtime\RunnerInterface; + +/** + * @author Nicolas Grekas + */ +class HttpKernelRunner implements RunnerInterface +{ + public function __construct( + private readonly HttpKernelInterface $kernel, + private readonly Request $request, + private readonly bool $debug = false, + ) { + } + + public function run(): int + { + $response = $this->kernel->handle($this->request); + + if (Kernel::VERSION_ID >= 60400) { + $response->send(false); + + if (\function_exists('fastcgi_finish_request') && !$this->debug) { + fastcgi_finish_request(); + } elseif (\function_exists('litespeed_finish_request') && !$this->debug) { + litespeed_finish_request(); + } else { + Response::closeOutputBuffers(0, true); + flush(); + } + } else { + $response->send(); + } + + if ($this->kernel instanceof TerminableInterface) { + $this->kernel->terminate($this->request, $response); + } + + return 0; + } +} diff --git a/lib/symfony/runtime/Runner/Symfony/ResponseRunner.php b/lib/symfony/runtime/Runner/Symfony/ResponseRunner.php new file mode 100644 index 0000000000..04e5a3fa14 --- /dev/null +++ b/lib/symfony/runtime/Runner/Symfony/ResponseRunner.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Runtime\Runner\Symfony; + +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\Runtime\RunnerInterface; + +/** + * @author Nicolas Grekas + */ +class ResponseRunner implements RunnerInterface +{ + public function __construct( + private readonly Response $response, + ) { + } + + public function run(): int + { + $this->response->send(); + + return 0; + } +} diff --git a/lib/symfony/runtime/RunnerInterface.php b/lib/symfony/runtime/RunnerInterface.php new file mode 100644 index 0000000000..9001ff4357 --- /dev/null +++ b/lib/symfony/runtime/RunnerInterface.php @@ -0,0 +1,20 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Runtime; + +/** + * @author Nicolas Grekas + */ +interface RunnerInterface +{ + public function run(): int; +} diff --git a/lib/symfony/runtime/RuntimeInterface.php b/lib/symfony/runtime/RuntimeInterface.php new file mode 100644 index 0000000000..f151757e98 --- /dev/null +++ b/lib/symfony/runtime/RuntimeInterface.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Runtime; + +/** + * Enables decoupling applications from global state. + * + * @author Nicolas Grekas + */ +interface RuntimeInterface +{ + /** + * Returns a resolver that should compute the arguments of a callable. + * + * The callable itself should return an object that represents the application to pass to the getRunner() method. + */ + public function getResolver(callable $callable, ?\ReflectionFunction $reflector = null): ResolverInterface; + + /** + * Returns a callable that knows how to run the passed object and that returns its exit status as int. + * + * The passed object is typically created by calling ResolverInterface::resolve(). + */ + public function getRunner(?object $application): RunnerInterface; +} diff --git a/lib/symfony/runtime/SymfonyRuntime.php b/lib/symfony/runtime/SymfonyRuntime.php new file mode 100644 index 0000000000..a6e1cba733 --- /dev/null +++ b/lib/symfony/runtime/SymfonyRuntime.php @@ -0,0 +1,235 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Runtime; + +use Symfony\Component\Console\Application; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\ArgvInput; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\ConsoleOutput; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Dotenv\Dotenv; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\HttpKernelInterface; +use Symfony\Component\Runtime\Internal\MissingDotenv; +use Symfony\Component\Runtime\Internal\SymfonyErrorHandler; +use Symfony\Component\Runtime\Runner\Symfony\ConsoleApplicationRunner; +use Symfony\Component\Runtime\Runner\Symfony\HttpKernelRunner; +use Symfony\Component\Runtime\Runner\Symfony\ResponseRunner; + +// Help opcache.preload discover always-needed symbols +class_exists(MissingDotenv::class, false) || class_exists(Dotenv::class) || class_exists(MissingDotenv::class); + +/** + * Knows the basic conventions to run Symfony apps. + * + * In addition to the options managed by GenericRuntime, it accepts the following options: + * - "env" to define the name of the environment the app runs in; + * - "disable_dotenv" to disable looking for .env files; + * - "dotenv_path" to define the path of dot-env files - defaults to ".env"; + * - "prod_envs" to define the names of the production envs - defaults to ["prod"]; + * - "test_envs" to define the names of the test envs - defaults to ["test"]; + * - "use_putenv" to tell Dotenv to set env vars using putenv() (NOT RECOMMENDED.) + * - "dotenv_overload" to tell Dotenv to override existing vars + * + * When the "debug" / "env" options are not defined, they will fallback to the + * "APP_DEBUG" / "APP_ENV" environment variables, and to the "--env|-e" / "--no-debug" + * command line arguments if "symfony/console" is installed. + * + * When the "symfony/dotenv" component is installed, .env files are loaded. + * When "symfony/error-handler" is installed, it is registered in debug mode. + * + * On top of the base arguments provided by GenericRuntime, + * this runtime can feed the app-callable with arguments of type: + * - Request from "symfony/http-foundation" if the component is installed; + * - Application, Command, InputInterface and/or OutputInterface + * from "symfony/console" if the component is installed. + * + * This runtime can handle app-callables that return instances of either: + * - HttpKernelInterface, + * - Response, + * - Application, + * - Command, + * - int|string|null as handled by GenericRuntime. + * + * @author Nicolas Grekas + */ +class SymfonyRuntime extends GenericRuntime +{ + private readonly ArgvInput $input; + private readonly ConsoleOutput $output; + private readonly Application $console; + private readonly Command $command; + private readonly Request $request; + + /** + * @param array { + * debug?: ?bool, + * env?: ?string, + * disable_dotenv?: ?bool, + * project_dir?: ?string, + * prod_envs?: ?string[], + * dotenv_path?: ?string, + * test_envs?: ?string[], + * use_putenv?: ?bool, + * runtimes?: ?array, + * error_handler?: string|false, + * env_var_name?: string, + * debug_var_name?: string, + * dotenv_overload?: ?bool, + * } $options + */ + public function __construct(array $options = []) + { + $envKey = $options['env_var_name'] ??= 'APP_ENV'; + $debugKey = $options['debug_var_name'] ??= 'APP_DEBUG'; + + if (isset($options['env'])) { + $_SERVER[$envKey] = $options['env']; + } elseif (empty($_GET) && isset($_SERVER['argv']) && class_exists(ArgvInput::class)) { + $this->options = $options; + $this->getInput(); + } + + if (!($options['disable_dotenv'] ?? false) && isset($options['project_dir']) && !class_exists(MissingDotenv::class, false)) { + (new Dotenv($envKey, $debugKey)) + ->setProdEnvs((array) ($options['prod_envs'] ?? ['prod'])) + ->usePutenv($options['use_putenv'] ?? false) + ->bootEnv($options['project_dir'].'/'.($options['dotenv_path'] ?? '.env'), 'dev', (array) ($options['test_envs'] ?? ['test']), $options['dotenv_overload'] ?? false); + + if (isset($this->input) && ($options['dotenv_overload'] ?? false)) { + if ($this->input->getParameterOption(['--env', '-e'], $_SERVER[$envKey], true) !== $_SERVER[$envKey]) { + throw new \LogicException(\sprintf('Cannot use "--env" or "-e" when the "%s" file defines "%s" and the "dotenv_overload" runtime option is true.', $options['dotenv_path'] ?? '.env', $envKey)); + } + + if ($_SERVER[$debugKey] && $this->input->hasParameterOption('--no-debug', true)) { + putenv($debugKey.'='.$_SERVER[$debugKey] = $_ENV[$debugKey] = '0'); + } + } + + $options['debug'] ??= '1' === $_SERVER[$debugKey]; + $options['disable_dotenv'] = true; + } else { + $_SERVER[$envKey] ??= $_ENV[$envKey] ?? 'dev'; + $_SERVER[$debugKey] ??= $_ENV[$debugKey] ?? !\in_array($_SERVER[$envKey], (array) ($options['prod_envs'] ?? ['prod']), true); + } + + $options['error_handler'] ??= SymfonyErrorHandler::class; + + parent::__construct($options); + } + + public function getRunner(?object $application): RunnerInterface + { + if ($application instanceof HttpKernelInterface) { + return new HttpKernelRunner($application, $this->request ??= Request::createFromGlobals(), $this->options['debug'] ?? false); + } + + if ($application instanceof Response) { + return new ResponseRunner($application); + } + + if ($application instanceof Command) { + $console = $this->console ??= new Application(); + $console->setName($application->getName() ?: $console->getName()); + + if (!$application->getName() || !$console->has($application->getName())) { + $application->setName($_SERVER['argv'][0]); + if (method_exists($console, 'addCommand')) { + $console->addCommand($application); + } else { + $console->add($application); + } + } + + $console->setDefaultCommand($application->getName(), true); + $console->getDefinition()->addOptions($application->getDefinition()->getOptions()); + + return $this->getRunner($console); + } + + if ($application instanceof Application) { + if (!\in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) { + echo 'Warning: The console should be invoked via the CLI version of PHP, not the '.\PHP_SAPI.' SAPI'.\PHP_EOL; + } + + set_time_limit(0); + $defaultEnv = !isset($this->options['env']) ? ($_SERVER[$this->options['env_var_name']] ?? 'dev') : null; + $output = $this->output ??= new ConsoleOutput(); + + return new ConsoleApplicationRunner($application, $defaultEnv, $this->getInput(), $output); + } + + if (isset($this->command)) { + $this->getInput()->bind($this->command->getDefinition()); + } + + return parent::getRunner($application); + } + + protected function getArgument(\ReflectionParameter $parameter, ?string $type): mixed + { + return match ($type) { + Request::class => $this->request ??= Request::createFromGlobals(), + InputInterface::class => $this->getInput(), + OutputInterface::class => $this->output ??= new ConsoleOutput(), + Application::class => $this->console ??= new Application(), + Command::class => $this->command ??= new Command(), + default => parent::getArgument($parameter, $type), + }; + } + + protected static function register(GenericRuntime $runtime): GenericRuntime + { + $self = new self($runtime->options + ['runtimes' => []]); + $self->options['runtimes'] += [ + HttpKernelInterface::class => $self, + Request::class => $self, + Response::class => $self, + Application::class => $self, + Command::class => $self, + InputInterface::class => $self, + OutputInterface::class => $self, + ]; + $runtime->options = $self->options; + + return $self; + } + + private function getInput(): ArgvInput + { + if (!empty($_GET) && filter_var(\ini_get('register_argc_argv'), \FILTER_VALIDATE_BOOL)) { + throw new \Exception('CLI applications cannot be run safely on non-CLI SAPIs with register_argc_argv=On.'); + } + + if (isset($this->input)) { + return $this->input; + } + + $input = new ArgvInput(); + + if (isset($this->options['env'])) { + return $this->input = $input; + } + + if (null !== $env = $input->getParameterOption(['--env', '-e'], null, true)) { + putenv($this->options['env_var_name'].'='.$_SERVER[$this->options['env_var_name']] = $_ENV[$this->options['env_var_name']] = $env); + } + + if ($input->hasParameterOption('--no-debug', true)) { + putenv($this->options['debug_var_name'].'='.$_SERVER[$this->options['debug_var_name']] = $_ENV[$this->options['debug_var_name']] = '0'); + } + + return $this->input = $input; + } +} diff --git a/lib/symfony/runtime/composer.json b/lib/symfony/runtime/composer.json new file mode 100644 index 0000000000..4241bae48c --- /dev/null +++ b/lib/symfony/runtime/composer.json @@ -0,0 +1,45 @@ +{ + "name": "symfony/runtime", + "type": "composer-plugin", + "description": "Enables decoupling PHP applications from global state", + "keywords": ["runtime"], + "homepage": "https://symfony.com", + "license" : "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=8.1", + "composer-plugin-api": "^1.0|^2.0" + }, + "require-dev": { + "composer/composer": "^1.0.2|^2.0", + "symfony/console": "^5.4.9|^6.0.9|^7.0", + "symfony/dotenv": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony/dotenv": "<5.4" + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Runtime\\": "", + "Symfony\\Runtime\\Symfony\\Component\\": "Internal/" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "minimum-stability": "dev", + "extra": { + "class": "Symfony\\Component\\Runtime\\Internal\\ComposerPlugin" + } +} diff --git a/lib/symfony/security-core/Resources/translations/security.af.xlf b/lib/symfony/security-core/Resources/translations/security.af.xlf index 7bcb92066c..2592b8e980 100644 --- a/lib/symfony/security-core/Resources/translations/security.af.xlf +++ b/lib/symfony/security-core/Resources/translations/security.af.xlf @@ -72,11 +72,11 @@ Too many failed login attempts, please try again in %minutes% minute. - Te veel mislukte aanmeldpogings, probeer asseblief weer oor %minutes% minuut. + Te veel mislukte aanmeldpogings, probeer asseblief weer oor %minutes% minute. Too many failed login attempts, please try again in %minutes% minutes. - Te veel mislukte aanmeldpogings, probeer asseblief weer oor %minutes% minute. + Te veel mislukte aanmeldpogings, probeer asseblief weer oor %minutes% minute. diff --git a/lib/symfony/security-core/Resources/translations/security.az.xlf b/lib/symfony/security-core/Resources/translations/security.az.xlf index 25cb8605d2..2981ce9cd5 100644 --- a/lib/symfony/security-core/Resources/translations/security.az.xlf +++ b/lib/symfony/security-core/Resources/translations/security.az.xlf @@ -76,7 +76,7 @@ Too many failed login attempts, please try again in %minutes% minutes. - Çox sayda uğursuz giriş cəhdi, zəhmət olmasa %minutes% dəqiqə sonra yenidən cəhd edin.|Çox sayda uğursuz giriş cəhdi, zəhmət olmasa %minutes% dəqiqə sonra yenidən cəhd edin. + Çox sayda uğursuz giriş cəhdi, zəhmət olmasa %minutes% dəqiqə sonra yenidən cəhd edin.|Çox sayda uğursuz giriş cəhdi, zəhmət olmasa %minutes% dəqiqə sonra yenidən cəhd edin. diff --git a/lib/symfony/security-core/Resources/translations/security.et.xlf b/lib/symfony/security-core/Resources/translations/security.et.xlf index b87cb71cee..a35b03252e 100644 --- a/lib/symfony/security-core/Resources/translations/security.et.xlf +++ b/lib/symfony/security-core/Resources/translations/security.et.xlf @@ -76,7 +76,7 @@ Too many failed login attempts, please try again in %minutes% minutes. - Liiga palju nurjunud sisselogimiskatseid, proovige uuesti %minutes% minuti pärast. + Liiga palju nurjunud sisselogimiskatseid, proovige uuesti %minutes% minuti pärast. diff --git a/lib/symfony/security-core/Resources/translations/security.hy.xlf b/lib/symfony/security-core/Resources/translations/security.hy.xlf index e506c91988..4a55569f58 100644 --- a/lib/symfony/security-core/Resources/translations/security.hy.xlf +++ b/lib/symfony/security-core/Resources/translations/security.hy.xlf @@ -76,7 +76,7 @@ Too many failed login attempts, please try again in %minutes% minutes. - Չափազանց շատ անհաջող մուտքի փորձեր, խնդրում ենք փորձել կրկին %minutes% րոպեից. + Չափազանց շատ անհաջող մուտքի փորձեր, խնդրում ենք փորձել կրկին %minutes% րոպեից. diff --git a/lib/symfony/security-core/Resources/translations/security.lt.xlf b/lib/symfony/security-core/Resources/translations/security.lt.xlf index 8053d0da23..fc285addf9 100644 --- a/lib/symfony/security-core/Resources/translations/security.lt.xlf +++ b/lib/symfony/security-core/Resources/translations/security.lt.xlf @@ -76,7 +76,7 @@ Too many failed login attempts, please try again in %minutes% minutes. - Per daug nesėkmingų prisijungimo bandymų, bandykite vėl po %minutes% minutės.|Per daug nesėkmingų prisijungimo bandymų, bandykite vėl po %minutes% minučių. + Per daug nesėkmingų prisijungimo bandymų, bandykite vėl po %minutes% minutės.|Per daug nesėkmingų prisijungimo bandymų, bandykite vėl po %minutes% minučių. diff --git a/lib/symfony/security-core/Resources/translations/security.uz.xlf b/lib/symfony/security-core/Resources/translations/security.uz.xlf index ec690c5f43..a8c30d607f 100644 --- a/lib/symfony/security-core/Resources/translations/security.uz.xlf +++ b/lib/symfony/security-core/Resources/translations/security.uz.xlf @@ -76,7 +76,7 @@ Too many failed login attempts, please try again in %minutes% minutes. - Koʻplab muvaffaqiyatsiz kirish urinishlari, iltimos, %minutes% daqiqadan so'ng qayta urinib koʻring.|Koʻplab muvaffaqiyatsiz kirish urinishlari, iltimos, %minutes% daqiqadan so'ng qayta urinib koʻring. + Koʻplab muvaffaqiyatsiz kirish urinishlari, iltimos, %minutes% daqiqadan so'ng qayta urinib koʻring.|Koʻplab muvaffaqiyatsiz kirish urinishlari, iltimos, %minutes% daqiqadan so'ng qayta urinib koʻring. diff --git a/lib/symfony/twig-bridge/Mime/WrappedTemplatedEmail.php b/lib/symfony/twig-bridge/Mime/WrappedTemplatedEmail.php index e72335a5ec..4bbd70a07d 100644 --- a/lib/symfony/twig-bridge/Mime/WrappedTemplatedEmail.php +++ b/lib/symfony/twig-bridge/Mime/WrappedTemplatedEmail.php @@ -47,9 +47,10 @@ final class WrappedTemplatedEmail { $file = $this->twig->getLoader()->getSourceContext($image); $body = $file->getPath() ? new File($file->getPath()) : $file->getCode(); - $this->message->addPart((new DataPart($body, $image, $contentType))->asInline()); + $dataPart = (new DataPart($body, $image, $contentType))->asInline(); + $this->message->addPart($dataPart); - return 'cid:'.$image; + return 'cid:'.$dataPart->getContentId(); } /** diff --git a/lib/symfony/twig-bridge/Resources/views/Form/bootstrap_4_horizontal_layout.html.twig b/lib/symfony/twig-bridge/Resources/views/Form/bootstrap_4_horizontal_layout.html.twig index 990b324cb0..0a43eedcd1 100644 --- a/lib/symfony/twig-bridge/Resources/views/Form/bootstrap_4_horizontal_layout.html.twig +++ b/lib/symfony/twig-bridge/Resources/views/Form/bootstrap_4_horizontal_layout.html.twig @@ -9,8 +9,9 @@ {%- if expanded is not defined or not expanded -%} {%- set label_attr = label_attr|merge({class: (label_attr.class|default('') ~ ' col-form-label')|trim}) -%} {%- endif -%} - {%- set label_attr = label_attr|merge({class: (label_attr.class|default('') ~ ' ' ~ block('form_label_class'))|trim}) -%} - {{- parent() -}} +
+ {{- parent() -}} +
{%- endif -%} {%- endblock form_label %} diff --git a/lib/symfony/validator/Constraints/RegexValidator.php b/lib/symfony/validator/Constraints/RegexValidator.php index 4e9ae9039f..5303e095bc 100644 --- a/lib/symfony/validator/Constraints/RegexValidator.php +++ b/lib/symfony/validator/Constraints/RegexValidator.php @@ -47,7 +47,9 @@ class RegexValidator extends ConstraintValidator $value = ($constraint->normalizer)($value); } - if ($constraint->match xor preg_match($constraint->pattern, $value)) { + $expectedResult = $constraint->match ? 1 : 0; + + if (preg_match($constraint->pattern, $value) !== $expectedResult) { $this->context->buildViolation($constraint->message) ->setParameter('{{ value }}', $this->formatValue($value)) ->setParameter('{{ pattern }}', $constraint->pattern) diff --git a/lib/symfony/validator/Resources/translations/validators.az.xlf b/lib/symfony/validator/Resources/translations/validators.az.xlf index a9d281384c..2d72372882 100644 --- a/lib/symfony/validator/Resources/translations/validators.az.xlf +++ b/lib/symfony/validator/Resources/translations/validators.az.xlf @@ -136,7 +136,7 @@ This value is not a valid IP address. - Bu dəyər etibarlı bir IP ünvanı deyil. + Bu dəyər etibarlı bir IP ünvanı deyil. This value is not a valid language. @@ -192,7 +192,7 @@ No temporary folder was configured in php.ini, or the configured folder does not exist. - php.ini-də müvəqqəti qovluq quraşdırılmayıb, və ya quraşdırılmış qovluq mövcud deyil. + php.ini-də müvəqqəti qovluq quraşdırılmayıb, və ya quraşdırılmış qovluq mövcud deyil. Cannot write temporary file to disk. @@ -224,7 +224,7 @@ This value is not a valid International Bank Account Number (IBAN). - Bu dəyər etibarlı bir Beynəlxalq Bank Hesab Nömrəsi (IBAN) deyil. + Bu dəyər etibarlı bir Beynəlxalq Bank Hesab Nömrəsi (IBAN) deyil. This value is not a valid ISBN-10. @@ -312,7 +312,7 @@ This value is not a valid Business Identifier Code (BIC). - Bu dəyər etibarlı bir Biznes Təyinat Kodu (BIC) deyil. + Bu dəyər etibarlı bir Biznes Təyinat Kodu (BIC) deyil. Error @@ -320,7 +320,7 @@ This value is not a valid UUID. - Bu dəyər etibarlı bir UUID deyil. + Bu dəyər etibarlı bir UUID deyil. This value should be a multiple of {{ compared_value }}. @@ -436,123 +436,123 @@ This value is not a valid MAC address. - Bu dəyər etibarlı bir MAC ünvanı deyil. + Bu dəyər etibarlı bir MAC ünvanı deyil. This URL is missing a top-level domain. - Bu URL yuxarı səviyyəli domeni çatışmır. + Bu URL yuxarı səviyyəli domeni çatışmır. This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - Bu dəyər çox qısadır. Heç olmasa bir söz daxil etməlisiniz.|Bu dəyər çox qısadır. Heç olmasa {{ min }} söz daxil etməlisiniz. + Bu dəyər çox qısadır. Heç olmasa bir söz daxil etməlisiniz.|Bu dəyər çox qısadır. Heç olmasa {{ min }} söz daxil etməlisiniz. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - Bu dəyər çox uzundur. Yalnız bir söz daxil etməlisiniz.|Bu dəyər çox uzundur. {{ max }} və ya daha az söz daxil etməlisiniz. + Bu dəyər çox uzundur. Yalnız bir söz daxil etməlisiniz.|Bu dəyər çox uzundur. {{ max }} və ya daha az söz daxil etməlisiniz. This value does not represent a valid week in the ISO 8601 format. - Bu dəyər ISO 8601 formatında etibarlı bir həftəni təmsil etmir. + Bu dəyər ISO 8601 formatında etibarlı bir həftəni təmsil etmir. This value is not a valid week. - Bu dəyər etibarlı bir həftə deyil. + Bu dəyər etibarlı bir həftə deyil. This value should not be before week "{{ min }}". - Bu dəyər "{{ min }}" həftəsindən əvvəl olmamalıdır. + Bu dəyər "{{ min }}" həftəsindən əvvəl olmamalıdır. This value should not be after week "{{ max }}". - Bu dəyər "{{ max }}" həftəsindən sonra olmamalıdır. + Bu dəyər "{{ max }}" həftəsindən sonra olmamalıdır. This value is not a valid Twig template. - Bu dəyər etibarlı Twig şablonu deyil. + Bu dəyər etibarlı Twig şablonu deyil. This file is not a valid video. - Bu fayl etibarlı video deyil. + Bu fayl etibarlı video deyil. The size of the video could not be detected. - Videonun ölçüsünü təyin etmək mümkün olmadı. + Videonun ölçüsünü təyin etmək mümkün olmadı. The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px. - Video enliyi çox böyükdür ({{ width }}px). İcazə verilən maksimal enlik {{ max_width }}px-dir. + Video enliyi çox böyükdür ({{ width }}px). İcazə verilən maksimal enlik {{ max_width }}px-dir. The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px. - Video eni çox kiçikdir ({{ width }}px). Gözlənilən minimum en {{ min_width }}px-dir. + Video eni çox kiçikdir ({{ width }}px). Gözlənilən minimum en {{ min_width }}px-dir. The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px. - Video hündürlüyü çox böyükdür ({{ height }}px). İcazə verilən maksimum hündürlük {{ max_height }}px-dir. + Video hündürlüyü çox böyükdür ({{ height }}px). İcazə verilən maksimum hündürlük {{ max_height }}px-dir. The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px. - Videonun hündürlüyü çox kiçikdir ({{ height }}px). Gözlənilən minimum hündürlük {{ min_height }}px-dir. + Videonun hündürlüyü çox kiçikdir ({{ height }}px). Gözlənilən minimum hündürlük {{ min_height }}px-dir. The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels. - Videoda piksellərin sayı çox azdır ({{ pixels }}). Gözlənilən minimum miqdar {{ min_pixels }}-dir. + Videoda piksellərin sayı çox azdır ({{ pixels }}). Gözlənilən minimum miqdar {{ min_pixels }}-dir. The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels. - Videoda həddindən artıq piksel var ({{ pixels }}). Gözlənilən maksimum miqdar {{ max_pixels }}-dir. + Videoda həddindən artıq piksel var ({{ pixels }}). Gözlənilən maksimum miqdar {{ max_pixels }}-dir. The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}. - Video nisbəti çox böyükdür ({{ ratio }}). İcazə verilən maksimal nisbət {{ max_ratio }}‑dir. + Video nisbəti çox böyükdür ({{ ratio }}). İcazə verilən maksimal nisbət {{ max_ratio }}‑dir. The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}. - Video nisbəti çox kiçikdir ({{ ratio }}). Gözlənilən minimal nisbət {{ min_ratio }}. + Video nisbəti çox kiçikdir ({{ ratio }}). Gözlənilən minimal nisbət {{ min_ratio }}. The video is square ({{ width }}x{{ height }}px). Square videos are not allowed. - Video kvadratdır ({{ width }}x{{ height }}px). Kvadrat videolara icazə verilmir. + Video kvadratdır ({{ width }}x{{ height }}px). Kvadrat videolara icazə verilmir. The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed. - Video üfiqi istiqamətdədir ({{ width }}x{{ height }} piksel). Üfiqi videolara icazə verilmir. + Video üfiqi istiqamətdədir ({{ width }}x{{ height }} piksel). Üfiqi videolara icazə verilmir. The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed. - Video portret istiqamətindədir ({{ width }}x{{ height }} piksel). Portret istiqamətli videolara icazə verilmir. + Video portret istiqamətindədir ({{ width }}x{{ height }} piksel). Portret istiqamətli videolara icazə verilmir. The video file is corrupted. - Video faylı zədələnib. + Video faylı zədələnib. The video contains multiple streams. Only one stream is allowed. - Video bir neçə axın ehtiva edir. Yalnız bir axına icazə verilir. + Video bir neçə axın ehtiva edir. Yalnız bir axına icazə verilir. Unsupported video codec "{{ codec }}". - Dəstəklənməyən video kodeki "{{ codec }}". + Dəstəklənməyən video kodeki "{{ codec }}". Unsupported video container "{{ container }}". - Dəstəklənməyən video konteyneri "{{ container }}". + Dəstəklənməyən video konteyneri "{{ container }}". The image file is corrupted. - Şəkil faylı korlanıb. + Şəkil faylı korlanıb. The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels. - Şəkildə piksel sayı çox azdır ({{ pixels }}). Gözlənilən minimum miqdar {{ min_pixels }}. + Şəkildə piksel sayı çox azdır ({{ pixels }}). Gözlənilən minimum miqdar {{ min_pixels }}. The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels. - Şəkildə çox piksel var ({{ pixels }}). Gözlənilən maksimum say {{ max_pixels }}. + Şəkildə çox piksel var ({{ pixels }}). Gözlənilən maksimum say {{ max_pixels }}. This filename does not match the expected charset. - Bu fayl adı gözlənilən simvol dəstinə uyğun gəlmir. + Bu fayl adı gözlənilən simvol dəstinə uyğun gəlmir. diff --git a/lib/symfony/validator/Resources/translations/validators.bg.xlf b/lib/symfony/validator/Resources/translations/validators.bg.xlf index 79c06e5bc9..4a58ab3816 100644 --- a/lib/symfony/validator/Resources/translations/validators.bg.xlf +++ b/lib/symfony/validator/Resources/translations/validators.bg.xlf @@ -444,115 +444,115 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - Тази стойност е твърде кратка. Трябва да съдържа поне една дума.|Тази стойност е твърде кратка. Трябва да съдържа поне {{ min }} думи. + Стойността е твърде кратка. Трябва да съдържа поне една дума.|Стойността е твърде кратка. Трябва да съдържа поне {{ min }} думи. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - Тази стойност е твърде дълга. Трябва да съдържа само една дума.|Тази стойност е твърде дълга. Трябва да съдържа {{ max }} думи или по-малко. + Стойността е твърде дълга. Трябва да съдържа само една дума.|Стойността е твърде дълга. Трябва да съдържа {{ max }} думи или по-малко. This value does not represent a valid week in the ISO 8601 format. - Тази стойност не представлява валидна седмица във формат ISO 8601. + Тази стойност не представлява валидна седмица във формат ISO 8601. This value is not a valid week. - Тази стойност не е валидна седмица. + Тази стойност не е валидна седмица. This value should not be before week "{{ min }}". - Тази стойност не трябва да бъде преди седмица "{{ min }}". + Стойността не трябва да бъде преди седмица "{{ min }}". This value should not be after week "{{ max }}". - Тази стойност не трябва да бъде след седмица "{{ max }}". + Тази стойност не трябва да бъде след седмица "{{ max }}". This value is not a valid Twig template. - Тази стойност не е валиден Twig шаблон. + Тази стойност не е валиден Twig шаблон. This file is not a valid video. - Този файл не е валидно видео. + Този файл не е валидно видео. The size of the video could not be detected. - Размерът на видеото не може да бъде установен. + Размерът на видеото не може да бъде установен. The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px. - Ширината на видеото е твърде голяма ({{ width }}px). Допустимата максимална ширина е {{ max_width }}px. + Ширината на видеото е твърде голяма ({{ width }}px). Допустимата максимална ширина е {{ max_width }}px. The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px. - Ширината на видеото е твърде малка ({{ width }}px). Минималната изисквана ширина е {{ min_width }}px. + Ширината на видеото е твърде малка ({{ width }}px). Минималната изисквана ширина е {{ min_width }}px. The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px. - Височината на видеото е твърде голяма ({{ height }}px). Максимално допустимата височина е {{ max_height }}px. + Височината на видеото е твърде голяма ({{ height }}px). Максимално допустимата височина е {{ max_height }}px. The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px. - Височината на видеото е твърде малка ({{ height }}px). Очакваната минимална височина е {{ min_height }}px. + Височината на видеото е твърде малка ({{ height }}px). Очакваната минимална височина е {{ min_height }}px. The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels. - Видеото има твърде малко пиксели ({{ pixels }}). Минимално изискуемото количество е {{ min_pixels }}. + Видеото има твърде малко пиксели ({{ pixels }}). Минимално изискуемото количество е {{ min_pixels }}. The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels. - Видеото има твърде много пиксели ({{ pixels }}). Очакваният максимум е {{ max_pixels }}. + Видеото има твърде много пиксели ({{ pixels }}). Максималният допустим брой е {{ max_pixels }}. The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}. - Съотношението на видеото е твърде голямо ({{ ratio }}). Позволеното максимално съотношение е {{ max_ratio }}. + Съотношението на видеото е твърде голямо ({{ ratio }}). Позволеното максимално съотношение е {{ max_ratio }}. The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}. - Съотношението на видеото е твърде малко ({{ ratio }}). Минималното очаквано съотношение е {{ min_ratio }}. + Съотношението на видеото е твърде малко ({{ ratio }}). Минималното очаквано съотношение е {{ min_ratio }}. The video is square ({{ width }}x{{ height }}px). Square videos are not allowed. - Видеото е квадратно ({{ width }}x{{ height }}px). Квадратни видеа не са позволени. + Видеото е квадратно ({{ width }}x{{ height }}px). Квадратни видеа не са позволени. The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed. - Видеото е в хоризонтална ориентация ({{ width }}x{{ height }} px). Хоризонтални видеа не са позволени. + Видеото е в хоризонтална ориентация ({{ width }}x{{ height }}px). Хоризонтални видеа не са позволени. The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed. - Видеото е с портретна ориентация ({{ width }}x{{ height }}px). Видеа с портретна ориентация не са позволени. + Видеото е с портретна ориентация ({{ width }}x{{ height }}px). Видеа с портретна ориентация не са позволени. The video file is corrupted. - Видеофайлът е повреден. + Видеофайлът е повреден. The video contains multiple streams. Only one stream is allowed. - Видеото съдържа множество потоци. Разрешен е само един поток. + Видеото съдържа множество потоци. Разрешен е само един поток. Unsupported video codec "{{ codec }}". - Неподдържан видео кодек „{{ codec }}“. + Неподдържан видео кодек „{{ codec }}“. Unsupported video container "{{ container }}". - Неподдържан видео контейнер "{{ container }}". + Неподдържан видео контейнер "{{ container }}". The image file is corrupted. - Файлът с изображение е повреден. + Файлът с изображение е повреден. The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels. - Изображението има твърде малко пиксели ({{ pixels }}). Очакваният минимален брой е {{ min_pixels }}. + Изображението има твърде малко пиксели ({{ pixels }}). Минималният изискуем брой е {{ min_pixels }}. The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels. - Изображението има твърде много пиксели ({{ pixels }}). Очакваният максимален брой е {{ max_pixels }}. + Изображението има твърде много пиксели ({{ pixels }}). Максималният допустим брой е {{ max_pixels }}. This filename does not match the expected charset. - Името на файла не съответства на очаквания набор от знаци. + Името на файла не съответства на очаквания набор от знаци. diff --git a/lib/symfony/validator/Resources/translations/validators.et.xlf b/lib/symfony/validator/Resources/translations/validators.et.xlf index 12a2671d94..cd53b1f20f 100644 --- a/lib/symfony/validator/Resources/translations/validators.et.xlf +++ b/lib/symfony/validator/Resources/translations/validators.et.xlf @@ -440,119 +440,119 @@ This URL is missing a top-level domain. - Sellel URL-il puudub ülataseme domeen. + Sellel URL-il puudub ülataseme domeen. This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - See väärtus on liiga lühike. See peaks sisaldama vähemalt ühte sõna.|See väärtus on liiga lühike. See peaks sisaldama vähemalt {{ min }} sõna. + See väärtus on liiga lühike. See peaks sisaldama vähemalt ühte sõna.|See väärtus on liiga lühike. See peaks sisaldama vähemalt {{ min }} sõna. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - See väärtus on liiga pikk. See peaks sisaldama ainult ühte sõna.|See väärtus on liiga pikk. See peaks sisaldama {{ max }} sõna või vähem. + See väärtus on liiga pikk. See peaks sisaldama ainult ühte sõna.|See väärtus on liiga pikk. See peaks sisaldama {{ max }} sõna või vähem. This value does not represent a valid week in the ISO 8601 format. - See väärtus ei esinda kehtivat nädalat ISO 8601 formaadis. + See väärtus ei esinda kehtivat nädalat ISO 8601 formaadis. This value is not a valid week. - See väärtus ei ole kehtiv nädal. + See väärtus ei ole kehtiv nädal. This value should not be before week "{{ min }}". - See väärtus ei tohiks olla enne nädalat "{{ min }}". + See väärtus ei tohiks olla enne nädalat "{{ min }}". This value should not be after week "{{ max }}". - See väärtus ei tohiks olla pärast nädalat "{{ max }}". + See väärtus ei tohiks olla pärast nädalat "{{ max }}". This value is not a valid Twig template. - See väärtus ei ole kehtiv Twig'i mall. + See väärtus ei ole kehtiv Twig'i mall. This file is not a valid video. - See fail ei ole kehtiv video. + See fail ei ole kehtiv video. The size of the video could not be detected. - Video suurust ei õnnestunud tuvastada. + Video suurust ei õnnestunud tuvastada. The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px. - Video laius on liiga suur ({{ width }}px). Lubatud maksimaalne laius on {{ max_width }}px. + Video laius on liiga suur ({{ width }}px). Lubatud maksimaalne laius on {{ max_width }}px. The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px. - Video laius on liiga väike ({{ width }}px). Oodatav minimaalne laius on {{ min_width }} px. + Video laius on liiga väike ({{ width }}px). Oodatav minimaalne laius on {{ min_width }} px. The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px. - Video kõrgus on liiga suur ({{ height }}px). Lubatud maksimaalne kõrgus on {{ max_height }}px. + Video kõrgus on liiga suur ({{ height }}px). Lubatud maksimaalne kõrgus on {{ max_height }}px. The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px. - Video kõrgus on liiga väike ({{ height }}px). Oodatav minimaalne kõrgus on {{ min_height }}px. + Video kõrgus on liiga väike ({{ height }}px). Oodatav minimaalne kõrgus on {{ min_height }}px. The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels. - Videol on liiga vähe piksleid ({{ pixels }}). Oodatav miinimum on {{ min_pixels }}. + Videol on liiga vähe piksleid ({{ pixels }}). Oodatav miinimum on {{ min_pixels }}. The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels. - Videol on liiga palju piksleid ({{ pixels }}). Eeldatav maksimaalne kogus on {{ max_pixels }}. + Videol on liiga palju piksleid ({{ pixels }}). Eeldatav maksimaalne kogus on {{ max_pixels }}. The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}. - Video suhe on liiga suur ({{ ratio }}). Lubatud maksimaalne suhe on {{ max_ratio }}. + Video suhe on liiga suur ({{ ratio }}). Lubatud maksimaalne suhe on {{ max_ratio }}. The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}. - Video kuvasuhe on liiga väike ({{ ratio }}). Eeldatav miinimumsuhe on {{ min_ratio }}. + Video kuvasuhe on liiga väike ({{ ratio }}). Eeldatav miinimumsuhe on {{ min_ratio }}. The video is square ({{ width }}x{{ height }}px). Square videos are not allowed. - Video on ruudukujuline ({{ width }}x{{ height }}px). Ruutvideod pole lubatud. + Video on ruudukujuline ({{ width }}x{{ height }}px). Ruutvideod pole lubatud. The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed. - Video on horisontaalses asendis ({{ width }}x{{ height }} px). Horisontaalseid videoid ei ole lubatud. + Video on horisontaalses asendis ({{ width }}x{{ height }} px). Horisontaalseid videoid ei ole lubatud. The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed. - Video on püstsuunas ({{ width }}x{{ height }} px). Püstsuunalised videod pole lubatud. + Video on püstsuunas ({{ width }}x{{ height }} px). Püstsuunalised videod pole lubatud. The video file is corrupted. - Videofail on rikutud. + Videofail on rikutud. The video contains multiple streams. Only one stream is allowed. - Video sisaldab mitu voogu. Lubatud on ainult üks voog. + Video sisaldab mitu voogu. Lubatud on ainult üks voog. Unsupported video codec "{{ codec }}". - Toetamata videokoodek „{{ codec }}“. + Toetamata videokoodek „{{ codec }}“. Unsupported video container "{{ container }}". - Toetamata videokonteiner "{{ container }}". + Toetamata videokonteiner "{{ container }}". The image file is corrupted. - Pildifail on rikutud. + Pildifail on rikutud. The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels. - Pildil on liiga vähe piksleid ({{ pixels }}). Oodatav miinimum on {{ min_pixels }}. + Pildil on liiga vähe piksleid ({{ pixels }}). Oodatav miinimum on {{ min_pixels }}. The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels. - Pildil on liiga palju piksleid ({{ pixels }}). Oodatav maksimaalne hulk on {{ max_pixels }}. + Pildil on liiga palju piksleid ({{ pixels }}). Oodatav maksimaalne hulk on {{ max_pixels }}. This filename does not match the expected charset. - See failinimi ei vasta eeldatavale märgistikule. + See failinimi ei vasta eeldatavale märgistikule. diff --git a/lib/symfony/validator/Resources/translations/validators.he.xlf b/lib/symfony/validator/Resources/translations/validators.he.xlf index e19c438e41..d184a11a5d 100644 --- a/lib/symfony/validator/Resources/translations/validators.he.xlf +++ b/lib/symfony/validator/Resources/translations/validators.he.xlf @@ -440,119 +440,119 @@ This URL is missing a top-level domain. - לכתובת URL זו חסר דומיין רמה עליונה. + לכתובת URL זו חסר דומיין רמה עליונה. This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - ערך זה קצר מדי. הוא צריך להכיל לפחות מילה אחת.|ערך זה קצר מדי. הוא צריך להכיל לפחות {{ min }} מילים. + ערך זה קצר מדי. הוא צריך להכיל לפחות מילה אחת.|ערך זה קצר מדי. הוא צריך להכיל לפחות {{ min }} מילים. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - ערך זה ארוך מדי. הוא צריך להכיל רק מילה אחת.|ערך זה ארוך מדי. הוא צריך להכיל {{ max }} מילים או פחות. + ערך זה ארוך מדי. הוא צריך להכיל רק מילה אחת.|ערך זה ארוך מדי. הוא צריך להכיל {{ max }} מילים או פחות. This value does not represent a valid week in the ISO 8601 format. - ערך זה אינו מייצג שבוע תקף בפורמט ISO 8601. + ערך זה אינו מייצג שבוע תקף בפורמט ISO 8601. This value is not a valid week. - ערך זה אינו שבוע חוקי. + ערך זה אינו שבוע חוקי. This value should not be before week "{{ min }}". - ערך זה לא אמור להיות לפני שבוע "{{ min }}". + ערך זה לא אמור להיות לפני שבוע "{{ min }}". This value should not be after week "{{ max }}". - ערך זה לא אמור להיות לאחר שבוע "{{ max }}". + ערך זה לא אמור להיות לאחר שבוע "{{ max }}". This value is not a valid Twig template. - ערך זה אינו תבנית Twig חוקית. + ערך זה אינו תבנית Twig חוקית. This file is not a valid video. - קובץ זה אינו וידאו תקין. + קובץ זה אינו וידאו תקין. The size of the video could not be detected. - לא ניתן היה לזהות את גודל הווידאו. + לא ניתן היה לזהות את גודל הווידאו. The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px. - רוחב הווידאו גדול מדי ({{ width }}px). רוחב מרבי מותר הוא {{ max_width }}px. + רוחב הווידאו גדול מדי ({{ width }}px). רוחב מרבי מותר הוא {{ max_width }}px. The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px. - רוחב הווידאו קטן מדי ({{ width }}px). רוחב מינימלי צפוי הוא {{ min_width }} פיקסלים. + רוחב הווידאו קטן מדי ({{ width }}px). רוחב מינימלי צפוי הוא {{ min_width }} פיקסלים. The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px. - גובה הווידאו גדול מדי ({{ height }}px). הגובה המקסימלי המותר הוא {{ max_height }}px. + גובה הווידאו גדול מדי ({{ height }}px). הגובה המקסימלי המותר הוא {{ max_height }}px. The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px. - גובה הווידאו קטן מדי ({{ height }}px). הגובה המינימלי הצפוי הוא {{ min_height }}px. + גובה הווידאו קטן מדי ({{ height }}px). הגובה המינימלי הצפוי הוא {{ min_height }}px. The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels. - לסרטון יש מעט מדי פיקסלים ({{ pixels }}). הכמות המינימלית הצפויה היא {{ min_pixels }}. + לסרטון יש מעט מדי פיקסלים ({{ pixels }}). הכמות המינימלית הצפויה היא {{ min_pixels }}. The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels. - לסרטון יש יותר מדי פיקסלים ({{ pixels }}). הכמות המרבית הצפויה היא {{ max_pixels }}. + לסרטון יש יותר מדי פיקסלים ({{ pixels }}). הכמות המרבית הצפויה היא {{ max_pixels }}. The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}. - יחס הווידאו גדול מדי ({{ ratio }}). יחס מקסימלי מותר הוא {{ max_ratio }}. + יחס הווידאו גדול מדי ({{ ratio }}). יחס מקסימלי מותר הוא {{ max_ratio }}. The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}. - יחס הווידאו קטן מדי ({{ ratio }}). יחס מינימלי צפוי הוא {{ min_ratio }}. + יחס הווידאו קטן מדי ({{ ratio }}). יחס מינימלי צפוי הוא {{ min_ratio }}. The video is square ({{ width }}x{{ height }}px). Square videos are not allowed. - הווידאו הוא מרובע ({{ width }}x{{ height }}px). סרטוני וידאו מרובעים אינם מותרים. + הווידאו הוא מרובע ({{ width }}x{{ height }}px). סרטוני וידאו מרובעים אינם מותרים. The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed. - הווידאו במצב לרוחב ({{ width }}x{{ height }} פיקסלים). סרטוני לרוחב אינם מותרים. + הווידאו במצב לרוחב ({{ width }}x{{ height }} פיקסלים). סרטוני לרוחב אינם מותרים. The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed. - הווידאו הוא בתצורת דיוקן ({{ width }}x{{ height }}px). סרטוני וידאו בתצורת דיוקן אינם מותרים. + הווידאו הוא בתצורת דיוקן ({{ width }}x{{ height }}px). סרטוני וידאו בתצורת דיוקן אינם מותרים. The video file is corrupted. - קובץ הווידאו פגום. + קובץ הווידאו פגום. The video contains multiple streams. Only one stream is allowed. - הווידאו מכיל מספר זרמים. מותר זרם אחד בלבד. + הווידאו מכיל מספר זרמים. מותר זרם אחד בלבד. Unsupported video codec "{{ codec }}". - מקודד וידאו שאינו נתמך "{{ codec }}". + מקודד וידאו שאינו נתמך "{{ codec }}". Unsupported video container "{{ container }}". - מיכל וידאו שאינו נתמך "{{ container }}". + מיכל וידאו שאינו נתמך "{{ container }}". The image file is corrupted. - קובץ התמונה פגום. + קובץ התמונה פגום. The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels. - לתמונה יש מעט מדי פיקסלים ({{ pixels }}). הכמות המינימלית הצפויה היא {{ min_pixels }}. + לתמונה יש מעט מדי פיקסלים ({{ pixels }}). הכמות המינימלית הצפויה היא {{ min_pixels }}. The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels. - לתמונה יש יותר מדי פיקסלים ({{ pixels }}). הכמות המרבית הצפויה היא {{ max_pixels }}. + לתמונה יש יותר מדי פיקסלים ({{ pixels }}). הכמות המרבית הצפויה היא {{ max_pixels }}. This filename does not match the expected charset. - שם הקובץ הזה אינו תואם את מערך התווים הצפוי. + שם הקובץ הזה אינו תואם את מערך התווים הצפוי. diff --git a/lib/symfony/validator/Resources/translations/validators.hy.xlf b/lib/symfony/validator/Resources/translations/validators.hy.xlf index e537733c76..bd59319d1c 100644 --- a/lib/symfony/validator/Resources/translations/validators.hy.xlf +++ b/lib/symfony/validator/Resources/translations/validators.hy.xlf @@ -136,7 +136,7 @@ This value is not a valid IP address. - Այս արժեքը վավեր IP հասցե չէ։ + Այս արժեքը վավեր IP հասցե չէ։ This value is not a valid language. @@ -192,7 +192,7 @@ No temporary folder was configured in php.ini, or the configured folder does not exist. - php.ini-ում չի կարգավորվել ժամանակավոր թղթապանակ, կամ կարգավորված թղթապանակը չկա։ + php.ini-ում չի կարգավորվել ժամանակավոր թղթապանակ, կամ կարգավորված թղթապանակը չկա։ Cannot write temporary file to disk. @@ -224,7 +224,7 @@ This value is not a valid International Bank Account Number (IBAN). - Այս արժեքը վավեր միջազգային բանկային հաշվի համար (IBAN) չէ։ + Այս արժեքը վավեր միջազգային բանկային հաշվի համար (IBAN) չէ։ This value is not a valid ISBN-10. @@ -312,7 +312,7 @@ This value is not a valid Business Identifier Code (BIC). - Այս արժեքը վավեր բիզնեսի նորմատիվ կոդ (BIC) չէ։ + Այս արժեքը վավեր բիզնեսի նորմատիվ կոդ (BIC) չէ։ Error @@ -320,7 +320,7 @@ This value is not a valid UUID. - Այս արժեքը վավեր UUID չէ։ + Այս արժեքը վավեր UUID չէ։ This value should be a multiple of {{ compared_value }}. @@ -392,167 +392,167 @@ This value is not a valid CSS color. - Այս արժեքը վավեր CSS գույն չէ։ + Այս արժեքը վավեր CSS գույն չէ։ This value is not a valid CIDR notation. - Այս արժեքը վավեր CIDR նշում չէ։ + Այս արժեքը վավեր CIDR նշում չէ։ The value of the netmask should be between {{ min }} and {{ max }}. - Ցանցային դիմակի արժեքը պետք է լինի {{ min }}-ի և {{ max }}-ի միջև։ + Ցանցային դիմակի արժեքը պետք է լինի {{ min }}-ի և {{ max }}-ի միջև։ The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less. - Ֆայլի անունը շատ երկար է։ Այն պետք է ունենա {{ filename_max_length }} նիշ կամ պակաս։ + Ֆայլի անունը շատ երկար է։ Այն պետք է ունենա {{ filename_max_length }} նիշ կամ պակաս։ The password strength is too low. Please use a stronger password. - Գաղտնաբառի անվտանգությունը շատ ցածր է։ Խնդրում ենք գործածել ավելի ամրագույն գաղտնաբառ։ + Գաղտնաբառի անվտանգությունը շատ ցածր է։ Խնդրում ենք գործածել ավելի ամրագույն գաղտնաբառ։ This value contains characters that are not allowed by the current restriction-level. - Այս արժեքը պարունակում է այն նիշերը, որոնք չեն թույլատրվում ըստ ընթացիկ սահմանումների։ + Այս արժեքը պարունակում է այն նիշերը, որոնք չեն թույլատրվում ըստ ընթացիկ սահմանումների։ Using invisible characters is not allowed. - Անտեսանելի նիշերի օգտագործումը չի թույլատրվում։ + Անտեսանելի նիշերի օգտագործումը չի թույլատրվում։ Mixing numbers from different scripts is not allowed. - Թվերի խառնուրդը տարբեր սցենարներից չի թույլատրվում։ + Թվերի խառնուրդը տարբեր սցենարներից չի թույլատրվում։ Using hidden overlay characters is not allowed. - Թաքնված ծածկանիշերի օգտագործումը չի թույլատրվում։ + Թաքնված ծածկանիշերի օգտագործումը չի թույլատրվում։ The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}. - Ֆայլի ընդլայնումը անվավեր է ({{ extension }})։ Թույլատրվող ընդլայնումներն են՝ {{ extensions }}։ + Ֆայլի ընդլայնումը անվավեր է ({{ extension }})։ Թույլատրվող ընդլայնումներն են՝ {{ extensions }}։ The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}. - Հայտնաբերված նիշագրության կոդը անվավեր է ({{ detected }})։ Թույլատրվող կոդերն են՝ {{ encodings }}։ + Հայտնաբերված նիշագրության կոդը անվավեր է ({{ detected }})։ Թույլատրվող կոդերն են՝ {{ encodings }}։ This value is not a valid MAC address. - Այս արժեքը վավեր MAC հասցե չէ։ + Այս արժեքը վավեր MAC հասցե չէ։ This URL is missing a top-level domain. - Այս URL-ը չունի վերին մակարդակի դոմեյն: + Այս URL-ը չունի վերին մակարդակի դոմեյն: This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - Այս արժեքը շատ կարճ է: պետք է պարունակի գոնե մեկ բառ.|Այս արժեքը շատ կարճ է: պետք է պարունակի գոնե {{ min }} բառեր: + Այս արժեքը շատ կարճ է: պետք է պարունակի գոնե մեկ բառ.|Այս արժեքը շատ կարճ է: պետք է պարունակի գոնե {{ min }} բառեր: This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - Այս արժեքը շատ երկար է: պետք է պարունակի միայն մեկ բառ.|Այս արժեքը շատ երկար է: պետք է պարունակի {{ max }} բառ կամ ավելի քիչ: + Այս արժեքը շատ երկար է: պետք է պարունակի միայն մեկ բառ.|Այս արժեքը շատ երկար է: պետք է պարունակի {{ max }} բառ կամ ավելի քիչ: This value does not represent a valid week in the ISO 8601 format. - Այս արժեքը չի ներկայացնում ISO 8601 ձևաչափով գործող շաբաթ։ + Այս արժեքը չի ներկայացնում ISO 8601 ձևաչափով գործող շաբաթ։ This value is not a valid week. - Այս արժեքը վավեր շաբաթ չէ: + Այս արժեքը վավեր շաբաթ չէ: This value should not be before week "{{ min }}". - Այս արժեքը չպետք է լինի «{{ min }}» շաբաթից առաջ։ + Այս արժեքը չպետք է լինի «{{ min }}» շաբաթից առաջ։ This value should not be after week "{{ max }}". - Այս արժեքը չպետք է լինի «{{ max }}» շաբաթից հետո։ + Այս արժեքը չպետք է լինի «{{ max }}» շաբաթից հետո։ This value is not a valid Twig template. - Այս արժեքը վավեր Twig ձևանմուշ չէ: + Այս արժեքը վավեր Twig ձևանմուշ չէ: This file is not a valid video. - Այս ֆայլը վավեր տեսանյութ չէ։ + Այս ֆայլը վավեր տեսանյութ չէ։ The size of the video could not be detected. - Չհաջողվեց հայտնաբերել տեսանյութի չափը. + Չհաջողվեց հայտնաբերել տեսանյութի չափը. The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px. - Տեսահոլովակի լայնությունը չափազանց մեծ է ({{ width }}px)։ Թույլատրելի առավելագույն լայնությունը {{ max_width }}px է։ + Տեսահոլովակի լայնությունը չափազանց մեծ է ({{ width }}px)։ Թույլատրելի առավելագույն լայնությունը {{ max_width }}px է։ The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px. - Տեսանյութի լայնությունը չափազանց փոքր է ({{ width }}px). Սպասվող նվազագույն լայնքը {{ min_width }}px է. + Տեսանյութի լայնությունը չափազանց փոքր է ({{ width }}px). Սպասվող նվազագույն լայնքը {{ min_width }}px է. The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px. - Վիդեոյի բարձրությունը չափազանց մեծ է ({{ height }}px)։ Թույլատրելի առավելագույն բարձրությունը {{ max_height }}px է։ + Վիդեոյի բարձրությունը չափազանց մեծ է ({{ height }}px)։ Թույլատրելի առավելագույն բարձրությունը {{ max_height }}px է։ The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px. - Վիդեոյի բարձրությունը շատ փոքր է ({{ height }}px)։ Սպասվող նվազագույն բարձրությունը {{ min_height }}px է։ + Վիդեոյի բարձրությունը շատ փոքր է ({{ height }}px)։ Սպասվող նվազագույն բարձրությունը {{ min_height }}px է։ The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels. - Տեսանյութը ունի չափազանց քիչ պիքսելներ ({{ pixels }}). Սպասվող նվազագույն քանակը {{ min_pixels }} է։ + Տեսանյութը ունի չափազանց քիչ պիքսելներ ({{ pixels }}). Սպասվող նվազագույն քանակը {{ min_pixels }} է։ The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels. - Տեսանյութը ունի չափազանց շատ պիքսելներ ({{ pixels }}). Սպասվող առավելագույն քանակը {{ max_pixels }} է։ + Տեսանյութը ունի չափազանց շատ պիքսելներ ({{ pixels }}). Սպասվող առավելագույն քանակը {{ max_pixels }} է։ The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}. - Տեսանյութի հարաբերակցությունը չափազանց մեծ է ({{ ratio }}): Թույլատրելի առավելագույն հարաբերակցությունը {{ max_ratio }} է։ + Տեսանյութի հարաբերակցությունը չափազանց մեծ է ({{ ratio }}): Թույլատրելի առավելագույն հարաբերակցությունը {{ max_ratio }} է։ The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}. - Վիդեոյի հարաբերակցությունը շատ փոքր է ({{ ratio }}). Ավելի փոքրագույն սպասվող հարաբերակցությունը {{ min_ratio }} է. + Վիդեոյի հարաբերակցությունը շատ փոքր է ({{ ratio }}). Ավելի փոքրագույն սպասվող հարաբերակցությունը {{ min_ratio }} է. The video is square ({{ width }}x{{ height }}px). Square videos are not allowed. - Տեսանյութը քառակուսի է ({{ width }}x{{ height }}px). Քառակուսի տեսանյութերը թույլատրելի չեն. + Տեսանյութը քառակուսի է ({{ width }}x{{ height }}px). Քառակուսի տեսանյութերը թույլատրելի չեն. The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed. - Տեսանյութը հորիզոնական կողմնորոշմամբ է ({{ width }}x{{ height }} px). Հորիզոնական տեսանյութերը թույլատրելի չեն. + Տեսանյութը հորիզոնական կողմնորոշմամբ է ({{ width }}x{{ height }} px). Հորիզոնական տեսանյութերը թույլատրելի չեն. The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed. - Վիդեոն ուղղահայաց կողմնորոշված է ({{ width }}x{{ height }}px)։ Ուղղահայաց կողմնորոշմամբ տեսանյութերը թույլատրելի չեն։ + Վիդեոն ուղղահայաց կողմնորոշված է ({{ width }}x{{ height }}px)։ Ուղղահայաց կողմնորոշմամբ տեսանյութերը թույլատրելի չեն։ The video file is corrupted. - Տեսանյութի ֆայլը վնասված է. + Տեսանյութի ֆայլը վնասված է. The video contains multiple streams. Only one stream is allowed. - Տեսանյութը պարունակում է բազմաթիվ հոսքեր։ Թույլատրվում է միայն մեկ հոսք։ + Տեսանյութը պարունակում է բազմաթիվ հոսքեր։ Թույլատրվում է միայն մեկ հոսք։ Unsupported video codec "{{ codec }}". - Չաջակցվող տեսանյութի կոդեկ «{{ codec }}»։ + Չաջակցվող տեսանյութի կոդեկ «{{ codec }}»։ Unsupported video container "{{ container }}". - Չաջակցվող վիդեո կոնտեյներ "{{ container }}". + Չաջակցվող վիդեո կոնտեյներ "{{ container }}". The image file is corrupted. - Պատկերի ֆայլը վնասված է։ + Պատկերի ֆայլը վնասված է։ The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels. - Պատկերը ունի չափազանց քիչ պիքսելներ ({{ pixels }}). Սպասվող նվազագույնը {{ min_pixels }} է։ + Պատկերը ունի չափազանց քիչ պիքսելներ ({{ pixels }}). Սպասվող նվազագույնը {{ min_pixels }} է։ The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels. - Պատկերը ունի չափազանց շատ պիքսել ({{ pixels }}). Սպասվող առավելագույն քանակը {{ max_pixels }} է. + Պատկերը ունի չափազանց շատ պիքսել ({{ pixels }}). Սպասվող առավելագույն քանակը {{ max_pixels }} է. This filename does not match the expected charset. - Այս ֆայլի անունը չի համապատասխանում սպասվող նիշքերի հավաքածուին. + Այս ֆայլի անունը չի համապատասխանում սպասվող նիշքերի հավաքածուին. diff --git a/lib/symfony/validator/Resources/translations/validators.lt.xlf b/lib/symfony/validator/Resources/translations/validators.lt.xlf index ab4bdc57e7..0d03648c21 100644 --- a/lib/symfony/validator/Resources/translations/validators.lt.xlf +++ b/lib/symfony/validator/Resources/translations/validators.lt.xlf @@ -452,107 +452,107 @@ This value does not represent a valid week in the ISO 8601 format. - Ši reikšmė neatitinka galiojančios savaitės ISO 8601 formatu. + Ši reikšmė neatitinka galiojančios savaitės ISO 8601 formatu. This value is not a valid week. - Ši reikšmė nėra galiojanti savaitė. + Ši reikšmė nėra galiojanti savaitė. This value should not be before week "{{ min }}". - Ši reikšmė neturėtų būti prieš savaitę "{{ min }}". + Ši reikšmė neturėtų būti prieš savaitę "{{ min }}". This value should not be after week "{{ max }}". - Ši reikšmė neturėtų būti po savaitės "{{ max }}". + Ši reikšmė neturėtų būti po savaitės "{{ max }}". This value is not a valid Twig template. - Ši reikšmė nėra tinkamas „Twig“ šablonas. + Ši reikšmė nėra tinkamas „Twig“ šablonas. This file is not a valid video. - Šis failas nėra galiojantis vaizdo įrašas. + Šis failas nėra galiojantis vaizdo įrašas. The size of the video could not be detected. - Nepavyko nustatyti vaizdo įrašo dydžio. + Nepavyko nustatyti vaizdo įrašo dydžio. The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px. - Vaizdo įrašo plotis per didelis ({{ width }}px). Leidžiamas didžiausias plotis yra {{ max_width }}px. + Vaizdo įrašo plotis per didelis ({{ width }}px). Leidžiamas didžiausias plotis yra {{ max_width }}px. The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px. - Vaizdo įrašo plotis per mažas ({{ width }}px). Tikėtinas mažiausias plotis yra {{ min_width }}px. + Vaizdo įrašo plotis per mažas ({{ width }}px). Tikėtinas mažiausias plotis yra {{ min_width }}px. The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px. - Vaizdo aukštis per didelis ({{ height }}px). Leidžiamas maksimalus aukštis yra {{ max_height }}px. + Vaizdo aukštis per didelis ({{ height }}px). Leidžiamas maksimalus aukštis yra {{ max_height }}px. The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px. - Vaizdo aukštis per mažas ({{ height }}px). Tikėtinas minimalus aukštis yra {{ min_height }}px. + Vaizdo aukštis per mažas ({{ height }}px). Tikėtinas minimalus aukštis yra {{ min_height }}px. The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels. - Vaizdo įraše per mažai pikselių ({{ pixels }}). Tikimasi mažiausiai {{ min_pixels }}. + Vaizdo įraše per mažai pikselių ({{ pixels }}). Tikimasi mažiausiai {{ min_pixels }}. The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels. - Vaizdo įraše per daug pikselių ({{ pixels }}). Tikimasi, kad didžiausias kiekis yra {{ max_pixels }}. + Vaizdo įraše per daug pikselių ({{ pixels }}). Tikimasi, kad didžiausias kiekis yra {{ max_pixels }}. The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}. - Vaizdo santykis per didelis ({{ ratio }}). Leidžiamas didžiausias santykis yra {{ max_ratio }}. + Vaizdo santykis per didelis ({{ ratio }}). Leidžiamas didžiausias santykis yra {{ max_ratio }}. The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}. - Vaizdo santykis per mažas ({{ ratio }}). Tikimasi mažiausias santykis yra {{ min_ratio }}. + Vaizdo santykis per mažas ({{ ratio }}). Tikimasi mažiausias santykis yra {{ min_ratio }}. The video is square ({{ width }}x{{ height }}px). Square videos are not allowed. - Vaizdo įrašas yra kvadratinis ({{ width }}x{{ height }}px). Kvadratiniai vaizdo įrašai neleidžiami. + Vaizdo įrašas yra kvadratinis ({{ width }}x{{ height }}px). Kvadratiniai vaizdo įrašai neleidžiami. The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed. - Vaizdo įrašas yra gulsčio formato ({{ width }}x{{ height }} px). Gulsčio formato vaizdo įrašai neleidžiami. + Vaizdo įrašas yra gulsčio formato ({{ width }}x{{ height }} px). Gulsčio formato vaizdo įrašai neleidžiami. The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed. - Vaizdo įrašas yra portreto orientacijos ({{ width }}x{{ height }}px). Portreto orientacijos vaizdo įrašai neleidžiami. + Vaizdo įrašas yra portreto orientacijos ({{ width }}x{{ height }}px). Portreto orientacijos vaizdo įrašai neleidžiami. The video file is corrupted. - Vaizdo failas sugadintas. + Vaizdo failas sugadintas. The video contains multiple streams. Only one stream is allowed. - Vaizdo įraše yra keli srautai. Leidžiamas tik vienas srautas. + Vaizdo įraše yra keli srautai. Leidžiamas tik vienas srautas. Unsupported video codec "{{ codec }}". - Nepalaikomas vaizdo kodekas „{{ codec }}“. + Nepalaikomas vaizdo kodekas „{{ codec }}“. Unsupported video container "{{ container }}". - Nepalaikomas vaizdo konteineris "{{ container }}". + Nepalaikomas vaizdo konteineris "{{ container }}". The image file is corrupted. - Paveikslėlio failas sugadintas. + Paveikslėlio failas sugadintas. The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels. - Paveikslėlyje per mažai pikselių ({{ pixels }}). Tikimasi mažiausiai {{ min_pixels }}. + Paveikslėlyje per mažai pikselių ({{ pixels }}). Tikimasi mažiausiai {{ min_pixels }}. The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels. - Paveikslėlis turi per daug pikselių ({{ pixels }}). Tikėtinas didžiausias kiekis yra {{ max_pixels }}. + Paveikslėlis turi per daug pikselių ({{ pixels }}). Tikėtinas didžiausias kiekis yra {{ max_pixels }}. This filename does not match the expected charset. - Šis failo pavadinimas neatitinka laukiamo ženklų rinkinio. + Šis failo pavadinimas neatitinka laukiamo ženklų rinkinio. diff --git a/lib/symfony/validator/Resources/translations/validators.sl.xlf b/lib/symfony/validator/Resources/translations/validators.sl.xlf index 515e5d0aaf..14d1485c5d 100644 --- a/lib/symfony/validator/Resources/translations/validators.sl.xlf +++ b/lib/symfony/validator/Resources/translations/validators.sl.xlf @@ -468,91 +468,91 @@ This value is not a valid Twig template. - Ta vrednost ni veljavna predloga Twig. + Ta vrednost ni veljavna predloga Twig. This file is not a valid video. - Ta datoteka ni veljaven video. + Ta datoteka ni veljavna videodatoteka. The size of the video could not be detected. - Velikosti videoposnetka ni bilo mogoče zaznati. + Velikosti videoposnetka ni bilo mogoče določiti. The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px. - Širina videoposnetka je prevelika ({{ width }}px). Dovoljena največja širina je {{ max_width }}px. + Širina videoposnetka je prevelika ({{ width }}px). Največja dovoljena širina je {{ max_width }}px. The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px. - Širina videa je premajhna ({{ width }}px). Pričakovana minimalna širina je {{ min_width }} px. + Širina videoposnetka je premajhna ({{ width }}px). Najmanjša pričakovana širina je {{ min_width }}px. The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px. - Višina videa je prevelika ({{ height }}px). Dovoljena največja višina je {{ max_height }}px. + Višina videoposnetka je prevelika ({{ height }}px). Največja dovoljena višina je {{ max_height }}px. The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px. - Višina videa je premajhna ({{ height }}px). Pričakovana najmanjša višina je {{ min_height }}px. + Višina videoposnetka je premajhna ({{ height }}px). Najmanjša pričakovana višina je {{ min_height }}px. The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels. - Video ima premalo slikovnih pik ({{ pixels }}). Pričakovana minimalna količina je {{ min_pixels }}. + Videoposnetek ima premalo slikovnih pik ({{ pixels }}). Najmanjše pričakovano število je {{ min_pixels }}. The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels. - Video ima preveč slikovnih pik ({{ pixels }}). Pričakovano največje število je {{ max_pixels }}. + Videoposnetek ima preveč slikovnih pik ({{ pixels }}). Največje pričakovano število je {{ max_pixels }}. The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}. - Razmerje videa je preveliko ({{ ratio }}). Dovoljeno največje razmerje je {{ max_ratio }}. + Razmerje videoposnetka je preveliko ({{ ratio }}). Največje dovoljeno razmerje je {{ max_ratio }}. The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}. - Razmerje videa je premajhno ({{ ratio }}). Pričakovano minimalno razmerje je {{ min_ratio }}. + Razmerje videoposnetka je premajhno ({{ ratio }}). Najmanjše pričakovano razmerje je {{ min_ratio }}. The video is square ({{ width }}x{{ height }}px). Square videos are not allowed. - Video je kvadratno ({{ width }}x{{ height }}px). Kvadratni videoposnetki niso dovoljeni. + Videoposnetek je kvadraten ({{ width }}x{{ height }}px). Kvadratni videoposnetki niso dovoljeni. The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed. - Video je vodoravno orientiran ({{ width }}x{{ height }} px). Vodoravni videi niso dovoljeni. + Videoposnetek je ležeče usmerjen ({{ width }}x{{ height }}px). Ležeče usmerjeni videoposnetki niso dovoljeni. The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed. - Video je usmerjeno pokonci ({{ width }}x{{ height }}px). Videi v pokončni usmeritvi niso dovoljeni. + Videoposnetek je pokončno usmerjen ({{ width }}x{{ height }}px). Pokončno usmerjeni videoposnetki niso dovoljeni. The video file is corrupted. - Videodatoteka je poškodovana. + Videodatoteka je poškodovana. The video contains multiple streams. Only one stream is allowed. - Video vsebuje več tokov. Dovoljen je le en tok. + Videoposnetek vsebuje več tokov. Dovoljen je le en tok. Unsupported video codec "{{ codec }}". - Nepodprti video kodek »{{ codec }}«. + Nepodprt videokodek "{{ codec }}". Unsupported video container "{{ container }}". - Nepodprt videokontejner "{{ container }}". + Nepodprt videovsebnik "{{ container }}". The image file is corrupted. - Slikovna datoteka je poškodovana. + Slikovna datoteka je poškodovana. The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels. - Slika ima premalo slikovnih točk ({{ pixels }}). Pričakovana minimalna količina je {{ min_pixels }}. + Slika ima premalo slikovnih pik ({{ pixels }}). Najmanjše pričakovano število je {{ min_pixels }}. The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels. - Slika ima preveč slikovnih pik ({{ pixels }}). Pričakovano največje število je {{ max_pixels }}. + Slika ima preveč slikovnih pik ({{ pixels }}). Največje pričakovano število je {{ max_pixels }}. This filename does not match the expected charset. - To ime datoteke ne ustreza pričakovanemu naboru znakov. + Ime datoteke ne ustreza pričakovanemu naboru znakov. diff --git a/lib/symfony/validator/Resources/translations/validators.sr_Cyrl.xlf b/lib/symfony/validator/Resources/translations/validators.sr_Cyrl.xlf index 9874740636..4aeba68fda 100644 --- a/lib/symfony/validator/Resources/translations/validators.sr_Cyrl.xlf +++ b/lib/symfony/validator/Resources/translations/validators.sr_Cyrl.xlf @@ -468,91 +468,91 @@ This value is not a valid Twig template. - Ова вредност није важећи Twig шаблон. + Ова вредност није валидан Twig шаблон. This file is not a valid video. - Ова датотека није важећи видео. + Ова датотека није валидан видео. The size of the video could not be detected. - Није било могуће утврдити величину видео снимка. + Величина видеа не може бити одређена. The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px. - Ширина видеа је превелика ({{ width }}px). Дозвољена максимална ширина је {{ max_width }}px. + Ширина видеа је превелика ({{ width }}px). Дозвољена максимална ширина је {{ max_width }}px. The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px. - Ширина видеа је превише мала ({{ width }}px). Очекивана минимална ширина је {{ min_width }}px. + Ширина видеа је премала ({{ width }}px). Очекивана минимална ширина је {{ min_width }}px. The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px. - Висина видеа је превелика ({{ height }}px). Дозвољена максимална висина је {{ max_height }}px. + Висина видеа је превелика ({{ height }}px). Дозвољена максимална висина је {{ max_height }}px. The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px. - Висина видеа је превише мала ({{ height }}px). Очекивана минимална висина је {{ min_height }}px. + Висина видеа је премала ({{ height }}px). Очекивана минимална висина је {{ min_height }}px. The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels. - Видео има премало пиксела ({{ pixels }}). Очекивана минимална количина је {{ min_pixels }}. + Видео има премало пиксела ({{ pixels }}). Очекивани минимум је {{ min_pixels }}. The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels. - Видео има превише пиксела ({{ pixels }}). Очекивана максимална количина је {{ max_pixels }}. + Видео има превише пиксела ({{ pixels }}). Очекивани максимум је {{ max_pixels }}. The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}. - Однос слике видеа је превелик ({{ ratio }}). Дозвољени максимални однос је {{ max_ratio }}. + Однос страница видеа је превелик ({{ ratio }}). Дозвољени максимални однос је {{ max_ratio }}. The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}. - Однос стране видеа је превише мали ({{ ratio }}). Очекивани минимални однос је {{ min_ratio }}. + Однос страница видеа је премали ({{ ratio }}). Очекивани минимални однос је {{ min_ratio }}. The video is square ({{ width }}x{{ height }}px). Square videos are not allowed. - Видео је квадратног облика ({{ width }}x{{ height }}px). Квадратни видео записи нису дозвољени. + Видео је квадратног облика ({{ width }}x{{ height }}px). Квадратни видео записи нису дозвољени. The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed. - Видео је у водоравној оријентацији ({{ width }}x{{ height }} px). Водоравни видео записи нису дозвољени. + Видео је у водоравној оријентацији ({{ width }}x{{ height }}px). Водоравно оријентисани видео записи нису дозвољени. The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed. - Видео је у портрет оријентацији ({{ width }}x{{ height }}px). Видео снимци у портрет оријентацији нису дозвољени. + Видео је у портрет оријентацији ({{ width }}x{{ height }}px). Портретно оријентисани видео записи нису дозвољени. The video file is corrupted. - Видео датотека је оштећена. + Видео датотека је оштећена. The video contains multiple streams. Only one stream is allowed. - Видео садржи више токова. Дозвољен је само један ток. + Видео садржи више токова. Дозвољен је само један ток. Unsupported video codec "{{ codec }}". - Неподржан видео кодек „{{ codec }}“. + Неподржан видео кодек „{{ codec }}“. Unsupported video container "{{ container }}". - Неподржан видео контејнер "{{ container }}". + Неподржан видео контејнер „{{ container }}“. The image file is corrupted. - Датотека слике је оштећена. + Датотека слике је оштећена. The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels. - Слика има премало пиксела ({{ pixels }}). Очекивани минимални број је {{ min_pixels }}. + Слика има премало пиксела ({{ pixels }}). Очекивани минимум је {{ min_pixels }}. The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels. - Слика има превише пиксела ({{ pixels }}). Очекивани максимални број је {{ max_pixels }}. + Слика има превише пиксела ({{ pixels }}). Очекивани максимум је {{ max_pixels }}. This filename does not match the expected charset. - Ово име датотеке не одговара очекиваном скупу знакова. + Ово име датотеке не одговара очекиваном скупу знакова. diff --git a/lib/symfony/validator/Resources/translations/validators.tl.xlf b/lib/symfony/validator/Resources/translations/validators.tl.xlf index 7a25e79eac..fa806ab026 100644 --- a/lib/symfony/validator/Resources/translations/validators.tl.xlf +++ b/lib/symfony/validator/Resources/translations/validators.tl.xlf @@ -192,7 +192,7 @@ No temporary folder was configured in php.ini, or the configured folder does not exist. - Walang pansamantalang folder na na-configure sa php.ini, o ang naka-configure na folder ay hindi naroroon. + Walang pansamantalang folder na na-configure sa php.ini, o hindi umiiral ang na-configure na folder. Cannot write temporary file to disk. @@ -468,91 +468,91 @@ This value is not a valid Twig template. - Ang halagang ito ay hindi isang balidong Twig template. + Ang halagang ito ay hindi wastong Twig template. This file is not a valid video. - Ang file na ito ay hindi isang wastong video. + Ang file na ito ay hindi wastong video. The size of the video could not be detected. - Hindi matukoy ang laki ng video. + Hindi matukoy ang laki ng video. The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px. - Masyadong malaki ang lapad ng video ({{ width }}px). Ang pinahihintulutang pinakamaksimum na lapad ay {{ max_width }}px. + Masyadong malaki ang lapad ng video ({{ width }}px). Ang pinakamalaking pinapayagang lapad ay {{ max_width }}px. The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px. - Masyadong maliit ang lapad ng video ({{ width }}px). Inaasahang minimum na lapad ay {{ min_width }}px. + Masyadong maliit ang lapad ng video ({{ width }}px). Ang inaasahang pinakamababang lapad ay {{ min_width }}px. The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px. - Sobrang taas ng video ({{ height }}px). Ang pinapahintulutang pinakamataas na taas ay {{ max_height }}px. + Masyadong malaki ang taas ng video ({{ height }}px). Ang pinakamalaking pinapayagang taas ay {{ max_height }}px. The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px. - Masyadong maliit ang taas ng video ({{ height }}px). Inaasahang pinakamababang taas ay {{ min_height }}px. + Masyadong maliit ang taas ng video ({{ height }}px). Ang inaasahang pinakamababang taas ay {{ min_height }}px. The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels. - Ang video ay may masyadong kaunting pixel ({{ pixels }}). Ang inaasahang pinakamababang dami ay {{ min_pixels }}. + Masyadong kakaunti ang mga pixel ng video ({{ pixels }}). Ang inaasahang pinakamababang bilang ay {{ min_pixels }}. The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels. - Ang video ay may masyadong maraming pixel ({{ pixels }}). Ang inaasahang pinakamataas na bilang ay {{ max_pixels }}. + Masyadong marami ang mga pixel ng video ({{ pixels }}). Ang inaasahang pinakamataas na bilang ay {{ max_pixels }}. The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}. - Masyadong malaki ang ratio ng video ({{ ratio }}). Ang pinahihintulutang pinakamataas na ratio ay {{ max_ratio }}. + Masyadong malaki ang ratio ng video ({{ ratio }}). Ang pinakamalaking pinapayagang ratio ay {{ max_ratio }}. The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}. - Masyadong maliit ang ratio ng video ({{ ratio }}). Ang inaasahang minimum na ratio ay {{ min_ratio }}. + Masyadong maliit ang ratio ng video ({{ ratio }}). Ang inaasahang pinakamababang ratio ay {{ min_ratio }}. The video is square ({{ width }}x{{ height }}px). Square videos are not allowed. - Ang video ay parisukat ({{ width }}x{{ height }}px). Hindi pinapayagan ang mga parisukat na video. + Parisukat ang video ({{ width }}x{{ height }}px). Hindi pinapayagan ang mga parisukat na video. The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed. - Ang video ay nasa landscape na oryentasyon ({{ width }}x{{ height }} px). Hindi pinapayagan ang mga landscape na video. + Naka-landscape ang video ({{ width }}x{{ height }}px). Hindi pinapayagan ang mga video na naka-landscape. The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed. - Ang video ay naka-portrait ({{ width }}x{{ height }}px). Hindi pinapayagan ang mga video na naka-portrait. + Naka-portrait ang video ({{ width }}x{{ height }}px). Hindi pinapayagan ang mga video na naka-portrait. The video file is corrupted. - Sira ang file ng video. + Sira ang video file. The video contains multiple streams. Only one stream is allowed. - May ilang stream ang video. Isa lamang na stream ang pinapayagan. + Maraming stream ang video. Iisang stream lamang ang pinapayagan. Unsupported video codec "{{ codec }}". - Hindi suportadong video codec "{{ codec }}". + Hindi suportadong video codec "{{ codec }}". Unsupported video container "{{ container }}". - Hindi suportadong lalagyan ng video "{{ container }}". + Hindi suportadong video container "{{ container }}". The image file is corrupted. - Ang file ng larawan ay sira. + Sira ang file ng larawan. The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels. - Masyadong kaunti ang pixel ng larawan ({{ pixels }}). Ang inaasahang pinakamababang dami ay {{ min_pixels }}. + Masyadong kakaunti ang mga pixel ng larawan ({{ pixels }}). Ang inaasahang pinakamababang bilang ay {{ min_pixels }}. The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels. - Ang larawan ay may sobrang daming pixel ({{ pixels }}). Ang inaasahang pinakamataas na dami ay {{ max_pixels }}. + Masyadong marami ang mga pixel ng larawan ({{ pixels }}). Ang inaasahang pinakamataas na bilang ay {{ max_pixels }}. This filename does not match the expected charset. - Ang pangalan ng file na ito ay hindi tumutugma sa inaasahang hanay ng mga character. + Ang pangalan ng file na ito ay hindi tumutugma sa inaasahang charset. diff --git a/lib/symfony/validator/Resources/translations/validators.uz.xlf b/lib/symfony/validator/Resources/translations/validators.uz.xlf index f86216abb6..ff30d039ba 100644 --- a/lib/symfony/validator/Resources/translations/validators.uz.xlf +++ b/lib/symfony/validator/Resources/translations/validators.uz.xlf @@ -136,7 +136,7 @@ This value is not a valid IP address. - Bu qiymat haqiqiy IP manzil emas. + Bu qiymat haqiqiy IP manzil emas. This value is not a valid language. @@ -192,7 +192,7 @@ No temporary folder was configured in php.ini, or the configured folder does not exist. - php.ini da vaqtinchalik katalog sozlanmagan, yoki sozlangan katalog mavjud emas. + php.ini da vaqtinchalik katalog sozlanmagan, yoki sozlangan katalog mavjud emas. Cannot write temporary file to disk. @@ -224,7 +224,7 @@ This value is not a valid International Bank Account Number (IBAN). - Bu qiymat haqiqiy Xalqaro Bank Hisob Raqami (IBAN) emas. + Bu qiymat haqiqiy Xalqaro Bank Hisob Raqami (IBAN) emas. This value is not a valid ISBN-10. @@ -312,7 +312,7 @@ This value is not a valid Business Identifier Code (BIC). - Bu qiymat haqiqiy Biznes Identifikatsiya Kodi (BIC) emas. + Bu qiymat haqiqiy Biznes Identifikatsiya Kodi (BIC) emas. Error @@ -320,7 +320,7 @@ This value is not a valid UUID. - Bu qiymat haqiqiy UUID emas. + Bu qiymat haqiqiy UUID emas. This value should be a multiple of {{ compared_value }}. @@ -432,127 +432,127 @@ The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}. - Aniqlangan belgi kodlamasi yaroqsiz ({{ detected }}). Ruxsat etilgan kodlamalar {{ encodings }}. + Aniqlangan belgi kodlamasi yaroqsiz ({{ detected }}). Ruxsat etilgan kodlamalar {{ encodings }}. This value is not a valid MAC address. - Bu qiymat haqiqiy MAC manzil emas. + Bu qiymat haqiqiy MAC manzil emas. This URL is missing a top-level domain. - Bu URL yuqori darajali domenni o'z ichiga olmaydi. + Bu URL yuqori darajali domenni o'z ichiga olmaydi. This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - Bu qiymat juda qisqa. U kamida bitta so'z bo'lishi kerak.|Bu qiymat juda qisqa. U kamida {{ min }} so'z bo'lishi kerak. + Bu qiymat juda qisqa. U kamida bitta so'z bo'lishi kerak.|Bu qiymat juda qisqa. U kamida {{ min }} so'z bo'lishi kerak. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - Bu qiymat juda uzun. U faqat bitta so'z bo'lishi kerak.|Bu qiymat juda uzun. U {{ max }} so'z yoki undan kam bo'lishi kerak. + Bu qiymat juda uzun. U faqat bitta so'z bo'lishi kerak.|Bu qiymat juda uzun. U {{ max }} so'z yoki undan kam bo'lishi kerak. This value does not represent a valid week in the ISO 8601 format. - Bu qiymat ISO 8601 formatida haqiqiy haftaga mos kelmaydi. + Bu qiymat ISO 8601 formatida haqiqiy haftaga mos kelmaydi. This value is not a valid week. - Bu qiymat haqiqiy hafta emas. + Bu qiymat haqiqiy hafta emas. This value should not be before week "{{ min }}". - Bu qiymat "{{ min }}" haftadan oldin bo'lmasligi kerak. + Bu qiymat "{{ min }}" haftadan oldin bo'lmasligi kerak. This value should not be after week "{{ max }}". - Bu qiymat "{{ max }}" haftadan keyin bo'lmasligi kerak. + Bu qiymat "{{ max }}" haftadan keyin bo'lmasligi kerak. This value is not a valid Twig template. - Bu qiymat yaroqli Twig shabloni emas. + Bu qiymat yaroqli Twig shabloni emas. This file is not a valid video. - Ushbu fayl yaroqli video emas. + Ushbu fayl yaroqli video emas. The size of the video could not be detected. - Videoning hajmini aniqlab bo‘lmadi. + Videoning hajmini aniqlab bo‘lmadi. The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px. - Video kengligi juda katta ({{ width }}px). Ruxsat etilgan maksimal kenglik {{ max_width }}px. + Video kengligi juda katta ({{ width }}px). Ruxsat etilgan maksimal kenglik {{ max_width }}px. The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px. - Video kengligi juda kichik ({{ width }}px). Kutilayotgan minimal kenglik {{ min_width }}px. + Video kengligi juda kichik ({{ width }}px). Kutilayotgan minimal kenglik {{ min_width }}px. The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px. - Video balandligi juda katta ({{ height }}px). Ruxsat etilgan maksimal balandlik {{ max_height }}px. + Video balandligi juda katta ({{ height }}px). Ruxsat etilgan maksimal balandlik {{ max_height }}px. The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px. - Video balandligi juda kichik ({{ height }}px). Kutilayotgan minimal balandlik {{ min_height }}px. + Video balandligi juda kichik ({{ height }}px). Kutilayotgan minimal balandlik {{ min_height }}px. The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels. - Videoda piksellar soni juda kam ({{ pixels }}). Kutilgan minimal miqdor {{ min_pixels }}. + Videoda piksellar soni juda kam ({{ pixels }}). Kutilgan minimal miqdor {{ min_pixels }}. The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels. - Videoda juda ko‘p piksellar bor ({{ pixels }}). Kutilayotgan maksimal miqdor {{ max_pixels }}. + Videoda juda ko‘p piksellar bor ({{ pixels }}). Kutilayotgan maksimal miqdor {{ max_pixels }}. The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}. - Video nisbati juda katta ({{ ratio }}). Ruxsat etilgan maksimal nisbat {{ max_ratio }}. + Video nisbati juda katta ({{ ratio }}). Ruxsat etilgan maksimal nisbat {{ max_ratio }}. The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}. - Video nisbati juda kichik ({{ ratio }}). Kutilayotgan minimal nisbat {{ min_ratio }}. + Video nisbati juda kichik ({{ ratio }}). Kutilayotgan minimal nisbat {{ min_ratio }}. The video is square ({{ width }}x{{ height }}px). Square videos are not allowed. - Video kvadrat ({{ width }}x{{ height }}px). Kvadrat videolarga ruxsat berilmaydi. + Video kvadrat ({{ width }}x{{ height }}px). Kvadrat videolarga ruxsat berilmaydi. The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed. - Video gorizontal yo‘nalishda ({{ width }}x{{ height }} px). Gorizontal videolarga ruxsat berilmaydi. + Video gorizontal yo‘nalishda ({{ width }}x{{ height }} px). Gorizontal videolarga ruxsat berilmaydi. The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed. - Video portret yoʻnalishda ({{ width }}x{{ height }}px). Portret yoʻnalishidagi videolarga ruxsat berilmaydi. + Video portret yoʻnalishda ({{ width }}x{{ height }}px). Portret yoʻnalishidagi videolarga ruxsat berilmaydi. The video file is corrupted. - Video fayli buzilgan. + Video fayli buzilgan. The video contains multiple streams. Only one stream is allowed. - Videoda bir nechta oqim mavjud. Faqat bitta oqimga ruxsat beriladi. + Videoda bir nechta oqim mavjud. Faqat bitta oqimga ruxsat beriladi. Unsupported video codec "{{ codec }}". - Qo‘llab-quvvatlanmaydigan video kodek "{{ codec }}". + Qo‘llab-quvvatlanmaydigan video kodek "{{ codec }}". Unsupported video container "{{ container }}". - Qo'llab-quvvatlanmaydigan video konteyner "{{ container }}". + Qo'llab-quvvatlanmaydigan video konteyner "{{ container }}". The image file is corrupted. - Rasm fayli buzilgan. + Rasm fayli buzilgan. The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels. - Tasvirda piksellar juda kam ({{ pixels }}). Kutilayotgan minimal miqdor {{ min_pixels }}. + Tasvirda piksellar juda kam ({{ pixels }}). Kutilayotgan minimal miqdor {{ min_pixels }}. The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels. - Tasvirda juda ko‘p piksel bor ({{ pixels }}). Kutilayotgan maksimal miqdor {{ max_pixels }}. + Tasvirda juda ko‘p piksel bor ({{ pixels }}). Kutilayotgan maksimal miqdor {{ max_pixels }}. This filename does not match the expected charset. - Bu fayl nomi kutilgan belgi to‘plamiga mos kelmaydi. + Bu fayl nomi kutilgan belgi to‘plamiga mos kelmaydi. diff --git a/lib/symfony/var-exporter/Internal/Hydrator.php b/lib/symfony/var-exporter/Internal/Hydrator.php index ebbceed052..b813f50e13 100644 --- a/lib/symfony/var-exporter/Internal/Hydrator.php +++ b/lib/symfony/var-exporter/Internal/Hydrator.php @@ -231,7 +231,11 @@ class Hydrator if (\PHP_VERSION_ID >= 80400 && !$propertyReflector->isAbstract() && $propertyReflector->getHooks()) { $notByRef->{$propertyReflector->name} = $propertyReflector->setRawValue(...); } elseif ($propertyReflector->isReadOnly()) { - $notByRef->{$propertyReflector->name} = true; + $notByRef->{$propertyReflector->name} = static function ($object, $value) use ($propertyReflector) { + if (!$propertyReflector->isInitialized($object)) { + $propertyReflector->setValue($object, $value); + } + }; } } diff --git a/lib/symfony/web-profiler-bundle/Resources/views/Profiler/toolbar_js.html.twig b/lib/symfony/web-profiler-bundle/Resources/views/Profiler/toolbar_js.html.twig index a77ccb7be6..c891abbc25 100644 --- a/lib/symfony/web-profiler-bundle/Resources/views/Profiler/toolbar_js.html.twig +++ b/lib/symfony/web-profiler-bundle/Resources/views/Profiler/toolbar_js.html.twig @@ -9,11 +9,11 @@ profiler_markup_version: 3, }) }} - + {{ include('@WebProfiler/Profiler/toolbar.css.twig') }} - + {# CAUTION: the contents of this file are processed by Twig before loading them as JavaScript source code. Always use '/*' comments instead of '//' comments to avoid impossible-to-debug side-effects #} @@ -21,7 +21,7 @@ if (typeof Sfjs === 'undefined' || typeof Sfjs.loadToolbar === 'undefined') { Sfjs = (function() { "use strict"; - + if ('classList' in document.documentElement) { var hasClass = function (el, cssClass) { return el.classList.contains(cssClass); }; var removeClass = function(el, cssClass) { el.classList.remove(cssClass); }; @@ -33,13 +33,13 @@ var addClass = function(el, cssClass) { if (!hasClass(el, cssClass)) { el.className += " " + cssClass; } }; var toggleClass = function(el, cssClass) { hasClass(el, cssClass) ? removeClass(el, cssClass) : addClass(el, cssClass); }; } - + var noop = function() {}; - + var profilerStorageKey = 'symfony/profiler/'; - + var addEventListener; - + var el = document.createElement('div'); if (!('addEventListener' in el)) { addEventListener = function (element, eventName, callback) { @@ -50,7 +50,7 @@ element.addEventListener(eventName, callback, false); }; } - + var request = function(url, onSuccess, onError, payload, options, tries) { var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP'); options = options || {}; @@ -58,14 +58,14 @@ tries = tries || 1; /* this delays for 125, 375, 625, 875, and 1000, ... */ var delay = tries < 5 ? (tries - 0.5) * 250 : 1000; - + xhr.open(options.method || 'GET', url, true); xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); xhr.onreadystatechange = function(state) { if (4 !== xhr.readyState) { return null; } - + if (xhr.status == 404 && options.retry && !options.stop) { setTimeout(function() { if (options.stop) { @@ -73,48 +73,48 @@ } request(url, onSuccess, onError, payload, options, tries + 1); }, delay); - + return null; } - + if (200 === xhr.status) { (onSuccess || noop)(xhr); } else { (onError || noop)(xhr); } }; - + if (options.onSend) { options.onSend(tries); } - + xhr.send(payload || ''); }; - + var getPreference = function(name) { if (!window.localStorage) { return null; } - + return localStorage.getItem(profilerStorageKey + name); }; - + var setPreference = function(name, value) { if (!window.localStorage) { return null; } - + localStorage.setItem(profilerStorageKey + name, value); }; - + var requestStack = []; - + var extractHeaders = function(xhr, stackElement) { /* Here we avoid to call xhr.getResponseHeader in order to */ /* prevent polluting the console with CORS security errors */ var allHeaders = xhr.getAllResponseHeaders(); var ret; - + if (ret = allHeaders.match(/^x-debug-token:\s+(.*)$/im)) { stackElement.profile = ret[1]; } @@ -126,7 +126,7 @@ stackElement.toolbarReplace = '1' === ret[1]; } }; - + var successStreak = 4; var pendingRequests = 0; var renderAjaxRequests = function() { @@ -135,12 +135,12 @@ return; } requestCounter.textContent = requestStack.length; - + var infoSpan = document.querySelector(".sf-toolbar-ajax-info"); if (infoSpan) { infoSpan.textContent = requestStack.length + ' AJAX request' + (requestStack.length !== 1 ? 's' : ''); } - + var ajaxToolbarPanel = document.querySelector('.sf-toolbar-block-ajax'); if (requestStack.length) { ajaxToolbarPanel.style.display = 'block'; @@ -157,45 +157,45 @@ removeClass(ajaxToolbarPanel, 'sf-toolbar-status-red'); } }; - + var startAjaxRequest = function(index) { var tbody = document.querySelector('.sf-toolbar-ajax-request-list'); if (!tbody) { return; } - + var nbOfAjaxRequest = tbody.rows.length; if (nbOfAjaxRequest >= 100) { tbody.deleteRow(0); } - + var request = requestStack[index]; pendingRequests++; var row = document.createElement('tr'); request.DOMNode = row; - + var requestNumberCell = document.createElement('td'); requestNumberCell.textContent = index + 1; row.appendChild(requestNumberCell); - + var profilerCell = document.createElement('td'); profilerCell.textContent = 'n/a'; row.appendChild(profilerCell); - + var methodCell = document.createElement('td'); methodCell.textContent = request.method; row.appendChild(methodCell); - + var typeCell = document.createElement('td'); typeCell.textContent = request.type; row.appendChild(typeCell); - + var statusCodeCell = document.createElement('td'); var statusCode = document.createElement('span'); statusCode.textContent = 'n/a'; statusCodeCell.appendChild(statusCode); row.appendChild(statusCodeCell); - + var pathCell = document.createElement('td'); pathCell.className = 'sf-ajax-request-url'; if ('GET' === request.method) { @@ -208,33 +208,33 @@ } pathCell.setAttribute('title', request.url); row.appendChild(pathCell); - + var durationCell = document.createElement('td'); durationCell.className = 'sf-ajax-request-duration'; durationCell.textContent = 'n/a'; row.appendChild(durationCell); - + request.liveDurationHandle = setInterval(function() { durationCell.textContent = (new Date() - request.start) + ' ms'; }, 100); - + row.className = 'sf-ajax-request sf-ajax-request-loading'; tbody.insertBefore(row, null); - + var toolbarInfo = document.querySelector('.sf-toolbar-block-ajax .sf-toolbar-info'); toolbarInfo.scrollTop = toolbarInfo.scrollHeight; - + renderAjaxRequests(); }; - + var finishAjaxRequest = function(index) { var request = requestStack[index]; clearInterval(request.liveDurationHandle); - + if (!request.DOMNode) { return; } - + if (request.toolbarReplace && !request.toolbarReplaceFinished && request.profile) { /* Flag as complete because finishAjaxRequest can be called multiple times. */ request.toolbarReplaceFinished = true; @@ -246,8 +246,11 @@ } } } - - pendingRequests--; + + if (pendingRequests > 0) { + pendingRequests--; + } + var row = request.DOMNode; /* Unpack the children from the row */ var profilerCell = row.children[1]; @@ -255,7 +258,7 @@ var statusCodeCell = row.children[4]; var statusCodeElem = statusCodeCell.children[0]; var durationCell = row.children[6]; - + if (request.error) { row.className = 'sf-ajax-request sf-ajax-request-error'; methodCell.className = 'sf-ajax-request-error'; @@ -264,7 +267,7 @@ row.className = 'sf-ajax-request sf-ajax-request-ok'; successStreak++; } - + if (request.statusCode) { if (request.statusCode < 300) { statusCodeElem.setAttribute('class', 'sf-toolbar-status'); @@ -277,11 +280,11 @@ } else { statusCodeElem.setAttribute('class', 'sf-toolbar-status sf-toolbar-status-red'); } - + if (request.duration) { durationCell.textContent = request.duration + ' ms'; } - + if (request.profilerUrl) { profilerCell.textContent = ''; var profilerLink = document.createElement('a'); @@ -289,10 +292,10 @@ profilerLink.textContent = request.profile; profilerCell.appendChild(profilerLink); } - + renderAjaxRequests(); }; - + {% if excluded_ajax_paths is defined %} if (window.fetch && window.fetch.polyfill === undefined) { var oldFetch = window.fetch; @@ -318,7 +321,7 @@ if (params && params.method !== undefined) { method = params.method; } - + var stackElement = { error: false, url: url, @@ -326,7 +329,7 @@ type: 'fetch', start: new Date() }; - + var idx = requestStack.push(stackElement) - 1; promise.then(function (r) { stackElement.duration = new Date() - stackElement.start; @@ -343,16 +346,16 @@ }); startAjaxRequest(idx); } - + return promise; }; } if (window.XMLHttpRequest && XMLHttpRequest.prototype.addEventListener) { var proxied = XMLHttpRequest.prototype.open; - + XMLHttpRequest.prototype.open = function(method, url, async, user, pass) { var self = this; - + /* prevent logging AJAX calls to static and inline files, like templates */ var path = url; if (url.slice(0, 1) === '/') { @@ -363,7 +366,7 @@ else if (0 === url.indexOf('{{ (request.schemeAndHttpHost ~ request.basePath)|e('js') }}')) { path = url.slice({{ (request.schemeAndHttpHost ~ request.basePath)|length }}); } - + if (!path.match(new RegExp({{ excluded_ajax_paths|json_encode|raw }}))) { var stackElement = { error: false, @@ -372,54 +375,54 @@ type: 'xhr', start: new Date() }; - + var idx = requestStack.push(stackElement) - 1; - + this.addEventListener('readystatechange', function() { if (self.readyState == 4) { stackElement.duration = new Date() - stackElement.start; stackElement.error = self.status < 200 || self.status >= 400; stackElement.statusCode = self.status; extractHeaders(self, stackElement); - + finishAjaxRequest(idx); } }, false); - + startAjaxRequest(idx); } - + proxied.apply(this, Array.prototype.slice.call(arguments)); }; } {% endif %} - + return { hasClass: hasClass, - + removeClass: removeClass, - + addClass: addClass, - + toggleClass: toggleClass, - + getPreference: getPreference, - + setPreference: setPreference, - + addEventListener: addEventListener, - + request: request, - + renderAjaxRequests: renderAjaxRequests, - + getSfwdt: function(token) { return document.getElementById('sfwdt' + token); }, - + load: function(selector, url, onSuccess, onError, options) { var el = document.getElementById(selector); - + if (el && el.getAttribute('data-sfurl') !== url) { request( url, @@ -443,14 +446,14 @@ options ); } - + return this; }, - + showToolbar: function(token) { var sfwdt = this.getSfwdt(token); - removeClass(sfwdt, 'sf-display-none'); - + removeClass(sfwdt.parentNode, 'sf-display-none'); + if (getPreference('toolbar/displayState') == 'none') { document.getElementById('sfToolbarMainContent-' + token).style.display = 'none'; document.getElementById('sfToolbarClearer-' + token).style.display = 'none'; @@ -461,36 +464,36 @@ document.getElementById('sfMiniToolbar-' + token).style.display = 'none'; } }, - + hideToolbar: function(token) { var sfwdt = this.getSfwdt(token); - addClass(sfwdt, 'sf-display-none'); + addClass(sfwdt.parentNode, 'sf-display-none'); }, - + initToolbar: function(token) { this.showToolbar(token); - + var hideButton = document.getElementById('sfToolbarHideButton-' + token); var hideButtonSvg = hideButton.querySelector('svg'); hideButtonSvg.setAttribute('aria-hidden', 'true'); hideButtonSvg.setAttribute('focusable', 'false'); addEventListener(hideButton, 'click', function (event) { event.preventDefault(); - + var p = this.parentNode; p.style.display = 'none'; (p.previousElementSibling || p.previousSibling).style.display = 'none'; document.getElementById('sfMiniToolbar-' + token).style.display = 'block'; setPreference('toolbar/displayState', 'none'); }); - + var showButton = document.getElementById('sfToolbarMiniToggler-' + token); var showButtonSvg = showButton.querySelector('svg'); showButtonSvg.setAttribute('aria-hidden', 'true'); showButtonSvg.setAttribute('focusable', 'false'); addEventListener(showButton, 'click', function (event) { event.preventDefault(); - + var elem = this.parentNode; if (elem.style.display == 'none') { document.getElementById('sfToolbarMainContent-' + token).style.display = 'none'; @@ -501,54 +504,54 @@ document.getElementById('sfToolbarClearer-' + token).style.display = 'block'; elem.style.display = 'none' } - + setPreference('toolbar/displayState', 'block'); }); }, - + loadToolbar: function(token, newToken) { var that = this; var triesCounter = document.getElementById('sfLoadCounter-' + token); - + var options = { retry: true, onSend: function (count) { if (count === 3) { that.initToolbar(token); } - + if (triesCounter) { triesCounter.textContent = count; } }, }; - + var cancelButton = document.getElementById('sfLoadCancel-' + token); if (cancelButton) { addEventListener(cancelButton, 'click', function (event) { event.preventDefault(); - + options.stop = true; that.hideToolbar(token); }); } - + newToken = (newToken || token); - + this.load( 'sfwdt' + token, '{{ url("_wdt", { "token": "xxxxxx" })|escape('js') }}'.replace(/xxxxxx/, newToken), function(xhr, el) { var toolbarContent = document.getElementById('sfToolbarMainContent-' + newToken); - + /* Do nothing in the edge case where the toolbar has already been replaced with a new one */ if (!toolbarContent) { return; } - + /* Replace the ID, it has to match the new token */ toolbarContent.parentElement.id = 'sfwdt' + newToken; - + /* Evaluate in global scope scripts embedded inside the toolbar */ var i, scripts = [].slice.call(el.querySelectorAll('script')); for (i = 0; i < scripts.length; ++i) { @@ -556,15 +559,15 @@ eval.call({}, scripts[i].firstChild.nodeValue); } } - + el.style.display = -1 !== xhr.responseText.indexOf('sf-toolbarreset') ? 'block' : 'none'; - + if (el.style.display == 'none') { return; } - + that.initToolbar(newToken); - + /* Handle toolbar-info position */ var toolbarBlocks = [].slice.call(el.querySelectorAll('.sf-toolbar-block')); for (i = 0; i < toolbarBlocks.length; ++i) { @@ -574,11 +577,11 @@ var elementWidth = toolbarInfo.offsetWidth; var leftValue = (elementWidth + this.offsetLeft) - pageWidth; var rightValue = (elementWidth + (pageWidth - this.offsetLeft)) - pageWidth; - + /* Reset right and left value, useful on window resize */ toolbarInfo.style.right = ''; toolbarInfo.style.left = ''; - + if (elementWidth > pageWidth) { toolbarInfo.style.left = 0; } @@ -591,7 +594,7 @@ } }; } - + renderAjaxRequests(); addEventListener(document.querySelector('.sf-toolbar-ajax-clear'), 'click', function() { requestStack = []; @@ -605,10 +608,10 @@ }); addEventListener(document.querySelector('.sf-toolbar-block-ajax > .sf-toolbar-icon'), 'click', function (event) { event.preventDefault(); - + toggleClass(this.parentNode, 'hover'); }); - + var dumpInfo = document.querySelector('.sf-toolbar-block-dump .sf-toolbar-info'); if (null !== dumpInfo) { addEventListener(dumpInfo, 'sfbeforedumpcollapse', function () { @@ -628,32 +631,32 @@ An error occurred while loading the web debug toolbar. Open the web profiler.\ \ '; - sfwdt.setAttribute('class', 'sf-toolbar sf-error-toolbar'); + sfwdt.parentElement.setAttribute('class', 'sf-toolbar sf-error-toolbar'); } }, options ); - + return this; }, - + toggle: function(selector, elOn, elOff) { var tmp = elOn.style.display, el = document.getElementById(selector); - + elOn.style.display = elOff.style.display; elOff.style.display = tmp; - + if (el) { el.style.display = 'none' === tmp ? 'none' : 'block'; } - + return this; }, }; })(); } - + Sfjs.loadToolbar('{{ token }}'); /*]]>*/ diff --git a/lib/tecnickcom/tcpdf/CHANGELOG.TXT b/lib/tecnickcom/tcpdf/CHANGELOG.TXT index 0ed8f57135..9c0d487bb3 100644 --- a/lib/tecnickcom/tcpdf/CHANGELOG.TXT +++ b/lib/tecnickcom/tcpdf/CHANGELOG.TXT @@ -1,3 +1,9 @@ +6.11.2 (2026-03-03) + - Refactor setCompression(). + +6.11.1 (2026-03-03) + - Remove debug line preventing compression. + 6.11.0 (2026-03-01) - Updated copyright year. - Updated linked http urls to https. diff --git a/lib/tecnickcom/tcpdf/VERSION b/lib/tecnickcom/tcpdf/VERSION index 1de66e5ff8..e18a34b9d6 100644 --- a/lib/tecnickcom/tcpdf/VERSION +++ b/lib/tecnickcom/tcpdf/VERSION @@ -1 +1 @@ -6.11.0 +6.11.2 diff --git a/lib/tecnickcom/tcpdf/composer.json b/lib/tecnickcom/tcpdf/composer.json index 089bb56939..ac175a7f4a 100644 --- a/lib/tecnickcom/tcpdf/composer.json +++ b/lib/tecnickcom/tcpdf/composer.json @@ -12,7 +12,7 @@ "barcodes" ], "homepage": "http://www.tcpdf.org/", - "version": "6.11.0", + "version": "6.11.2", "license": "LGPL-3.0-or-later", "authors": [ { diff --git a/lib/tecnickcom/tcpdf/include/tcpdf_static.php b/lib/tecnickcom/tcpdf/include/tcpdf_static.php index 6afddc57f3..dc15726377 100644 --- a/lib/tecnickcom/tcpdf/include/tcpdf_static.php +++ b/lib/tecnickcom/tcpdf/include/tcpdf_static.php @@ -55,7 +55,7 @@ class TCPDF_STATIC { * Current TCPDF version. * @private static */ - private static $tcpdf_version = '6.11.0'; + private static $tcpdf_version = '6.11.2'; /** * String alias for total number of pages. diff --git a/lib/tecnickcom/tcpdf/tcpdf.php b/lib/tecnickcom/tcpdf/tcpdf.php index 36f992c53f..cffe210d29 100644 --- a/lib/tecnickcom/tcpdf/tcpdf.php +++ b/lib/tecnickcom/tcpdf/tcpdf.php @@ -1,9 +1,9 @@ * @package com.tecnick.tcpdf * @author Nicola Asuni - * @version 6.11.0 + * @version 6.11.2 */ // TCPDF configuration @@ -128,7 +128,7 @@ require_once(dirname(__FILE__).'/include/tcpdf_static.php'); * TCPDF project (http://www.tcpdf.org) has been originally derived in 2002 from the Public Domain FPDF class by Olivier Plathey (http://www.fpdf.org), but now is almost entirely rewritten.
* @package com.tecnick.tcpdf * @brief PHP class for generating PDF documents without requiring external extensions. - * @version 6.11.0 + * @version 6.11.2 * @author Nicola Asuni - info@tecnick.com * @IgnoreAnnotation("protected") * @IgnoreAnnotation("public") @@ -2907,12 +2907,7 @@ class TCPDF { * @since 1.4 */ public function setCompression($compress=true) { - $this->compress = false; return; - if (function_exists('gzcompress')) { - if ($compress) { - $this->compress = true; - } - } + $this->compress = ($compress && function_exists('gzcompress')); } /** diff --git a/lib/tecnickcom/tcpdf/tools/tcpdf_addfont.php b/lib/tecnickcom/tcpdf/tools/tcpdf_addfont.php old mode 100644 new mode 100755 diff --git a/lib/twig/twig/CHANGELOG b/lib/twig/twig/CHANGELOG index cf47a76043..69b8ca7fde 100644 --- a/lib/twig/twig/CHANGELOG +++ b/lib/twig/twig/CHANGELOG @@ -1,3 +1,13 @@ +# 3.24.0 (2026-03-17) + + * Deprecate not implementing the `getOperatorTokens()` method in `ExpressionParserInterface` implementations + * Deprecate passing a non-`AbstractExpression` node to `Twig\Node\Expression\Binary\MatchesBinary` constructor + * Deprecate passing a non-`AbstractExpression` node to `Parser::setParent()` + * Add support for renaming variables in object destructuring (`{name: userName} = user`) + * Add `html_attr_relaxed` escaping strategy that preserves :, @, [, and ] for front-end framework attribute names + * Add support for short-circuiting in null-safe operator chains + * Add the `html_attr` function and `html_attr_merge` as well as `html_attr_type` filters + # 3.23.0 (2026-01-23) * Add `=` assignment operator (allows to set variables in expression or to replace the short-form of the set tag) diff --git a/lib/twig/twig/composer.json b/lib/twig/twig/composer.json index 366236637c..788ebe708a 100644 --- a/lib/twig/twig/composer.json +++ b/lib/twig/twig/composer.json @@ -32,7 +32,8 @@ "require-dev": { "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0", "psr/container": "^1.0|^2.0", - "phpstan/phpstan": "^2.0" + "phpstan/phpstan": "^2.0@stable", + "php-cs-fixer/shim": "^3.0@stable" }, "autoload": { "files": [ diff --git a/lib/twig/twig/splitsh.json b/lib/twig/twig/splitsh.json deleted file mode 100644 index f415dd8d4e..0000000000 --- a/lib/twig/twig/splitsh.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "subtrees": { - "twig-extra-bundle": "extra/twig-extra-bundle", - "cache-extra": "extra/cache-extra", - "cssinliner-extra": "extra/cssinliner-extra", - "html-extra": "extra/html-extra", - "inky-extra": "extra/inky-extra", - "intl-extra": "extra/intl-extra", - "markdown-extra": "extra/markdown-extra", - "string-extra": "extra/string-extra" - }, - "defaults": { - "git_constraint": "<1.8.2" - } -} diff --git a/lib/twig/twig/src/Environment.php b/lib/twig/twig/src/Environment.php index 2af6476111..176b6aa5a9 100644 --- a/lib/twig/twig/src/Environment.php +++ b/lib/twig/twig/src/Environment.php @@ -43,10 +43,10 @@ use Twig\TokenParser\TokenParserInterface; */ class Environment { - public const VERSION = '3.23.0'; - public const VERSION_ID = 32300; + public const VERSION = '3.24.0'; + public const VERSION_ID = 32400; public const MAJOR_VERSION = 3; - public const MINOR_VERSION = 23; + public const MINOR_VERSION = 24; public const RELEASE_VERSION = 0; public const EXTRA_VERSION = ''; diff --git a/lib/twig/twig/src/ExpressionParser/AbstractExpressionParser.php b/lib/twig/twig/src/ExpressionParser/AbstractExpressionParser.php index bc05bfa051..b8b963a1fc 100644 --- a/lib/twig/twig/src/ExpressionParser/AbstractExpressionParser.php +++ b/lib/twig/twig/src/ExpressionParser/AbstractExpressionParser.php @@ -27,4 +27,9 @@ abstract class AbstractExpressionParser implements ExpressionParserInterface { return []; } + + public function getOperatorTokens(): array + { + return [$this->getName(), ...$this->getAliases()]; + } } diff --git a/lib/twig/twig/src/ExpressionParser/ExpressionParserInterface.php b/lib/twig/twig/src/ExpressionParser/ExpressionParserInterface.php index 86576aec49..2013a114e2 100644 --- a/lib/twig/twig/src/ExpressionParser/ExpressionParserInterface.php +++ b/lib/twig/twig/src/ExpressionParser/ExpressionParserInterface.php @@ -11,6 +11,14 @@ namespace Twig\ExpressionParser; +/** + * @method list getOperatorTokens() Returns the operator token strings that this expression parser handles. + * These are the strings that should be recognized as operator tokens by the Lexer, + * and used to look up the parser in the registry. + * For most parsers, this returns the name and aliases. Parsers that don't handle + * operator tokens (like LiteralExpressionParser) should return an empty array. + * This method will be added to the interface in Twig 4.0. + */ interface ExpressionParserInterface { public function __toString(): string; diff --git a/lib/twig/twig/src/ExpressionParser/ExpressionParsers.php b/lib/twig/twig/src/ExpressionParser/ExpressionParsers.php index fb35a690e2..7efaffc143 100644 --- a/lib/twig/twig/src/ExpressionParser/ExpressionParsers.php +++ b/lib/twig/twig/src/ExpressionParser/ExpressionParsers.php @@ -54,10 +54,9 @@ final class ExpressionParsers implements \IteratorAggregate // throw new \InvalidArgumentException(\sprintf('Precedence for "%s" must be between 0 and 512, got %d.', $parser->getName(), $parser->getPrecedence())); } $interface = $parser instanceof PrefixExpressionParserInterface ? PrefixExpressionParserInterface::class : InfixExpressionParserInterface::class; - $this->parsersByName[$interface][$parser->getName()] = $parser; $this->parsersByClass[$parser::class] = $parser; - foreach ($parser->getAliases() as $alias) { - $this->parsersByName[$interface][$alias] = $parser; + foreach (self::getOperatorTokensFor($parser) as $token) { + $this->parsersByName[$interface][$token] = $parser; } } @@ -90,9 +89,22 @@ final class ExpressionParsers implements \IteratorAggregate public function getIterator(): \Traversable { + $seen = []; foreach ($this->parsersByName as $parsers) { - // we don't yield the keys - yield from $parsers; + foreach ($parsers as $parser) { + $id = spl_object_id($parser); + if (!isset($seen[$id])) { + $seen[$id] = true; + yield $parser; + } + } + } + foreach ($this->parsersByClass as $parser) { + $id = spl_object_id($parser); + if (!isset($seen[$id])) { + $seen[$id] = true; + yield $parser; + } } } @@ -124,4 +136,20 @@ final class ExpressionParsers implements \IteratorAggregate return $this->precedenceChanges; } + + /** + * @internal + * + * @return array + */ + public static function getOperatorTokensFor(ExpressionParserInterface $parser): array + { + if (method_exists($parser, 'getOperatorTokens')) { + return $parser->getOperatorTokens(); + } + + trigger_deprecation('twig/twig', '3.24', 'Not implementing the "getOperatorTokens()" method in "%s" is deprecated. This method will be part of the "%s" interface in 4.0.', $parser::class, ExpressionParserInterface::class); + + return [$parser->getName(), ...$parser->getAliases()]; + } } diff --git a/lib/twig/twig/src/ExpressionParser/Infix/AssignmentExpressionParser.php b/lib/twig/twig/src/ExpressionParser/Infix/AssignmentExpressionParser.php index fa8c4f2b02..1f042845c0 100644 --- a/lib/twig/twig/src/ExpressionParser/Infix/AssignmentExpressionParser.php +++ b/lib/twig/twig/src/ExpressionParser/Infix/AssignmentExpressionParser.php @@ -51,12 +51,12 @@ class AssignmentExpressionParser extends BinaryOperatorExpressionParser if ($left instanceof ArrayExpression) { if ($left->isSequence()) { return new SequenceDestructuringSetBinary($left, $right, $token->getLine()); - } else { - return new ObjectDestructuringSetBinary($left, $right, $token->getLine()); } - } else { - return new SetBinary($left, $right, $token->getLine()); + + return new ObjectDestructuringSetBinary($left, $right, $token->getLine()); } + + return new SetBinary($left, $right, $token->getLine()); } public function getDescription(): string diff --git a/lib/twig/twig/src/ExpressionParser/Prefix/GroupingExpressionParser.php b/lib/twig/twig/src/ExpressionParser/Prefix/GroupingExpressionParser.php index 5c6608da40..95a11762f4 100644 --- a/lib/twig/twig/src/ExpressionParser/Prefix/GroupingExpressionParser.php +++ b/lib/twig/twig/src/ExpressionParser/Prefix/GroupingExpressionParser.php @@ -17,6 +17,7 @@ use Twig\ExpressionParser\ExpressionParserDescriptionInterface; use Twig\ExpressionParser\PrefixExpressionParserInterface; use Twig\Node\Expression\AbstractExpression; use Twig\Node\Expression\ListExpression; +use Twig\Node\Expression\Variable\AssignContextVariable; use Twig\Node\Expression\Variable\ContextVariable; use Twig\Parser; use Twig\Token; @@ -36,7 +37,7 @@ final class GroupingExpressionParser extends AbstractExpressionParser implements return $expr->setExplicitParentheses(); } - return new ListExpression([$expr], $token->getLine()); + return new ListExpression([self::toAssignContextVariable($expr)], $token->getLine()); } // determine if we are parsing an arrow function arguments @@ -58,7 +59,16 @@ final class GroupingExpressionParser extends AbstractExpressionParser implements throw new SyntaxError('A list of variables must be followed by an arrow.', $stream->getCurrent()->getLine(), $stream->getSourceContext()); } - return new ListExpression($names, $token->getLine()); + return new ListExpression(array_map(self::toAssignContextVariable(...), $names), $token->getLine()); + } + + private static function toAssignContextVariable(AbstractExpression $expr): AssignContextVariable + { + if (!$expr instanceof ContextVariable) { + throw new SyntaxError('A list must only contain variables.', $expr->getTemplateLine(), $expr->getSourceContext()); + } + + return $expr instanceof AssignContextVariable ? $expr : new AssignContextVariable($expr->getAttribute('name'), $expr->getTemplateLine()); } public function getName(): string diff --git a/lib/twig/twig/src/ExpressionParser/Prefix/LiteralExpressionParser.php b/lib/twig/twig/src/ExpressionParser/Prefix/LiteralExpressionParser.php index da3805106d..b467d1aa58 100644 --- a/lib/twig/twig/src/ExpressionParser/Prefix/LiteralExpressionParser.php +++ b/lib/twig/twig/src/ExpressionParser/Prefix/LiteralExpressionParser.php @@ -30,8 +30,6 @@ use Twig\Token; */ final class LiteralExpressionParser extends AbstractExpressionParser implements PrefixExpressionParserInterface, ExpressionParserDescriptionInterface { - private string $type = 'literal'; - public function parse(Parser $parser, Token $token): AbstractExpression { $stream = $parser->getStream(); @@ -41,41 +39,30 @@ final class LiteralExpressionParser extends AbstractExpressionParser implements switch ($token->getValue()) { case 'true': case 'TRUE': - $this->type = 'constant'; - return new ConstantExpression(true, $token->getLine()); case 'false': case 'FALSE': - $this->type = 'constant'; - return new ConstantExpression(false, $token->getLine()); case 'none': case 'NONE': case 'null': case 'NULL': - $this->type = 'constant'; - return new ConstantExpression(null, $token->getLine()); default: - $this->type = 'variable'; - return new ContextVariable($token->getValue(), $token->getLine()); } // no break case $token->test(Token::NUMBER_TYPE): $stream->next(); - $this->type = 'constant'; return new ConstantExpression($token->getValue(), $token->getLine()); case $token->test(Token::STRING_TYPE): case $token->test(Token::INTERPOLATION_START_TYPE): - $this->type = 'string'; - return $this->parseStringExpression($parser); case $token->test(Token::PUNCTUATION_TYPE): @@ -96,7 +83,6 @@ final class LiteralExpressionParser extends AbstractExpressionParser implements if (preg_match(Lexer::REGEX_NAME, $token->getValue(), $matches) && $matches[0] == $token->getValue()) { // in this context, string operators are variable names $stream->next(); - $this->type = 'variable'; return new ContextVariable($token->getValue(), $token->getLine()); } @@ -109,7 +95,12 @@ final class LiteralExpressionParser extends AbstractExpressionParser implements public function getName(): string { - return $this->type; + return 'literal'; + } + + public function getOperatorTokens(): array + { + return []; } public function getDescription(): string @@ -153,8 +144,6 @@ final class LiteralExpressionParser extends AbstractExpressionParser implements private function parseSequenceExpression(Parser $parser) { - $this->type = 'sequence'; - $stream = $parser->getStream(); $stream->expect(Token::OPERATOR_TYPE, '[', 'A sequence element was expected'); @@ -185,8 +174,6 @@ final class LiteralExpressionParser extends AbstractExpressionParser implements private function parseMappingExpression(Parser $parser) { - $this->type = 'mapping'; - $stream = $parser->getStream(); $stream->expect(Token::PUNCTUATION_TYPE, '{', 'A mapping element was expected'); diff --git a/lib/twig/twig/src/Extension/CoreExtension.php b/lib/twig/twig/src/Extension/CoreExtension.php index 345f406661..b89321ebe4 100644 --- a/lib/twig/twig/src/Extension/CoreExtension.php +++ b/lib/twig/twig/src/Extension/CoreExtension.php @@ -134,7 +134,7 @@ final class CoreExtension extends AbstractExtension private $dateFormats = ['F j, Y H:i', '%d days']; private $numberFormat = [0, '.', ',']; - private $timezone = null; + private $timezone; /** * Sets the default format to be used by the date filter. @@ -1128,9 +1128,9 @@ final class CoreExtension extends AbstractExtension } if ((int) $bTrim == $bTrim) { return $a <=> (int) $bTrim; - } else { - return (float) $a <=> (float) $bTrim; } + + return (float) $a <=> (float) $bTrim; } if (\is_string($a) && \is_int($b)) { $aTrim = trim($a, " \t\n\r\v\f"); @@ -1139,9 +1139,9 @@ final class CoreExtension extends AbstractExtension } if ((int) $aTrim == $aTrim) { return (int) $aTrim <=> $b; - } else { - return (float) $aTrim <=> (float) $b; } + + return (float) $aTrim <=> (float) $b; } // float <=> string @@ -1179,7 +1179,7 @@ final class CoreExtension extends AbstractExtension */ public static function matches(string $regexp, ?string $str): int { - set_error_handler(function ($t, $m) use ($regexp) { + set_error_handler(static function ($t, $m) use ($regexp) { throw new RuntimeError(\sprintf('Regexp "%s" passed to "matches" is not valid', $regexp).substr($m, 12)); }); try { @@ -2148,7 +2148,7 @@ final class CoreExtension extends AbstractExtension */ public static function parseBlockFunction(Parser $parser, Node $fakeNode, $args, int $line): AbstractExpression { - $fakeFunction = new TwigFunction('block', fn ($name, $template = null) => null); + $fakeFunction = new TwigFunction('block', static fn ($name, $template = null) => null); $args = (new CallableArgumentsExtractor($fakeNode, $fakeFunction))->extractArguments($args); return new BlockReferenceExpression($args[0], $args[1] ?? null, $line); @@ -2159,7 +2159,7 @@ final class CoreExtension extends AbstractExtension */ public static function parseAttributeFunction(Parser $parser, Node $fakeNode, $args, int $line): AbstractExpression { - $fakeFunction = new TwigFunction('attribute', fn ($variable, $attribute, $arguments = null) => null); + $fakeFunction = new TwigFunction('attribute', static fn ($variable, $attribute, $arguments = null) => null); $args = (new CallableArgumentsExtractor($fakeNode, $fakeFunction))->extractArguments($args); /* diff --git a/lib/twig/twig/src/Lexer.php b/lib/twig/twig/src/Lexer.php index 508a79c025..e65f5bedc7 100644 --- a/lib/twig/twig/src/Lexer.php +++ b/lib/twig/twig/src/Lexer.php @@ -13,6 +13,7 @@ namespace Twig; use Twig\Error\SyntaxError; +use Twig\ExpressionParser\ExpressionParsers; /** * @author Fabien Potencier @@ -527,7 +528,7 @@ class Lexer { $expressionParsers = []; foreach ($this->env->getExpressionParsers() as $expressionParser) { - $expressionParsers = array_merge($expressionParsers, [$expressionParser->getName()], $expressionParser->getAliases()); + $expressionParsers = array_merge($expressionParsers, ExpressionParsers::getOperatorTokensFor($expressionParser)); } $expressionParsers = array_combine($expressionParsers, array_map('strlen', $expressionParsers)); @@ -544,7 +545,7 @@ class Lexer // an operator that begins with a character must not have a dot or pipe before if (ctype_alpha($expressionParser[0])) { - $r = '(?getTemplateLine(), $names->getSourceContext()); - } - if ($names instanceof ContextVariable) { $names = new ListExpression([new AssignContextVariable($names->getAttribute('name'), $names->getTemplateLine())], $lineno); } + if (!$names instanceof ListExpression) { + throw new SyntaxError('The arrow function argument must be a list of variables or a single variable.', $names->getTemplateLine(), $names->getSourceContext()); + } + parent::__construct(['expr' => $expr, 'names' => $names], [], $lineno); } diff --git a/lib/twig/twig/src/Node/Expression/Binary/MatchesBinary.php b/lib/twig/twig/src/Node/Expression/Binary/MatchesBinary.php index 569dfde05f..bd1f24f0ce 100644 --- a/lib/twig/twig/src/Node/Expression/Binary/MatchesBinary.php +++ b/lib/twig/twig/src/Node/Expression/Binary/MatchesBinary.php @@ -13,6 +13,7 @@ namespace Twig\Node\Expression\Binary; use Twig\Compiler; use Twig\Error\SyntaxError; +use Twig\Node\Expression\AbstractExpression; use Twig\Node\Expression\ConstantExpression; use Twig\Node\Expression\ReturnBoolInterface; use Twig\Node\Node; @@ -21,6 +22,13 @@ class MatchesBinary extends AbstractBinary implements ReturnBoolInterface { public function __construct(Node $left, Node $right, int $lineno) { + if (!$left instanceof AbstractExpression) { + trigger_deprecation('twig/twig', '3.24', 'Passing a "%s" instance to "%s()" first argument is deprecated, pass an "AbstractExpression" instance instead.', $left::class, __METHOD__); + } + if (!$right instanceof AbstractExpression) { + trigger_deprecation('twig/twig', '3.24', 'Passing a "%s" instance to "%s()" second argument is deprecated, pass an "AbstractExpression" instance instead.', $right::class, __METHOD__); + } + if ($right instanceof ConstantExpression) { $regexp = $right->getAttribute('value'); set_error_handler(static fn ($t, $m) => throw new SyntaxError(\sprintf('Regexp "%s" passed to "matches" is not valid: %s.', $regexp, substr($m, 14)), $lineno)); diff --git a/lib/twig/twig/src/Node/Expression/Binary/ObjectDestructuringSetBinary.php b/lib/twig/twig/src/Node/Expression/Binary/ObjectDestructuringSetBinary.php index 2c0853f655..b47c50fe89 100644 --- a/lib/twig/twig/src/Node/Expression/Binary/ObjectDestructuringSetBinary.php +++ b/lib/twig/twig/src/Node/Expression/Binary/ObjectDestructuringSetBinary.php @@ -23,7 +23,8 @@ use Twig\Node\Node; */ class ObjectDestructuringSetBinary extends AbstractBinary { - private array $properties = []; + /** @var list */ + private array $mappings = []; /** * @param ArrayExpression $left The array expression containing object/mapping destructuring properties @@ -38,7 +39,11 @@ class ObjectDestructuringSetBinary extends AbstractBinary if (!$pair['value'] instanceof ContextVariable) { throw new SyntaxError(\sprintf('Cannot assign to "%s", only variables can be assigned in object/mapping destructuring.', $pair['value']::class), $lineno); } - $this->properties[] = $pair['value']->getAttribute('name'); + + $this->mappings[] = [ + 'property' => $pair['key']->getAttribute('value'), + 'variable' => $pair['value']->getAttribute('name'), + ]; } parent::__construct($left, $right, $lineno); @@ -48,18 +53,18 @@ class ObjectDestructuringSetBinary extends AbstractBinary { $compiler->addDebugInfo($this); $compiler->raw('['); - foreach ($this->properties as $i => $property) { + foreach ($this->mappings as $i => $mapping) { if ($i) { $compiler->raw(', '); } - $compiler->raw('$context[')->repr($property)->raw(']'); + $compiler->raw('$context[')->repr($mapping['variable'])->raw(']'); } $compiler->raw('] = ['); - foreach ($this->properties as $i => $property) { + foreach ($this->mappings as $i => $mapping) { if ($i) { $compiler->raw(', '); } - $compiler->raw('CoreExtension::getAttribute($this->env, $this->source, ')->subcompile($this->getNode('right'))->raw(', ')->repr($property)->raw(', [], \\Twig\\Template::ANY_CALL, false, false, false, ')->repr($this->getNode('right')->getTemplateLine())->raw(')'); + $compiler->raw('CoreExtension::getAttribute($this->env, $this->source, ')->subcompile($this->getNode('right'))->raw(', ')->repr($mapping['property'])->raw(', [], \\Twig\\Template::ANY_CALL, false, false, false, ')->repr($this->getNode('right')->getTemplateLine())->raw(')'); } $compiler->raw(']'); } diff --git a/lib/twig/twig/src/Node/Expression/CallExpression.php b/lib/twig/twig/src/Node/Expression/CallExpression.php index 330d82535c..c97408f6d6 100644 --- a/lib/twig/twig/src/Node/Expression/CallExpression.php +++ b/lib/twig/twig/src/Node/Expression/CallExpression.php @@ -24,7 +24,7 @@ use Twig\Util\ReflectionCallable; abstract class CallExpression extends AbstractExpression { - private $reflector = null; + private $reflector; /** * @return void @@ -213,9 +213,8 @@ abstract class CallExpression extends AbstractExpression } elseif ($callableParameter->isOptional()) { if (!$parameters) { break; - } else { - $missingArguments[] = $name; } + $missingArguments[] = $name; } else { throw new SyntaxError(\sprintf('Value for argument "%s" is required for %s "%s".', $name, $callType, $callName), $this->getTemplateLine(), $this->getSourceContext()); } diff --git a/lib/twig/twig/src/Node/Expression/GetAttrExpression.php b/lib/twig/twig/src/Node/Expression/GetAttrExpression.php index f207b092cb..cf62395178 100644 --- a/lib/twig/twig/src/Node/Expression/GetAttrExpression.php +++ b/lib/twig/twig/src/Node/Expression/GetAttrExpression.php @@ -36,7 +36,7 @@ class GetAttrExpression extends AbstractExpression implements SupportDefinedTest trigger_deprecation('twig/twig', '3.15', \sprintf('Not passing a "%s" instance as the "arguments" argument of the "%s" constructor is deprecated ("%s" given).', ArrayExpression::class, static::class, $arguments::class)); } - parent::__construct($nodes, ['type' => $type, 'ignore_strict_check' => false, 'optimizable' => !$nullSafe, 'null_safe' => $nullSafe], $lineno); + parent::__construct($nodes, ['type' => $type, 'ignore_strict_check' => false, 'optimizable' => !$nullSafe, 'null_safe' => $nullSafe, 'is_short_circuited' => false, 'var_name' => null], $lineno); } public function enableDefinedTest(): void @@ -50,7 +50,6 @@ class GetAttrExpression extends AbstractExpression implements SupportDefinedTest $env = $compiler->getEnvironment(); $arrayAccessSandbox = false; $nullSafe = $this->getAttribute('null_safe'); - $objectVar = null; // optimize array calls if ( @@ -99,18 +98,32 @@ class GetAttrExpression extends AbstractExpression implements SupportDefinedTest $this->getNode('node')->setAttribute('ignore_strict_check', true); } - if ($nullSafe) { - $objectVar = '$'.$compiler->getVarName(); + if (null === $nullSafeNode = $nullSafe ? $this : null) { + $node = $this->getNode('node'); + while ($node instanceof self) { + if ($node->getAttribute('null_safe')) { + $nullSafeNode = $node; + break; + } + $node = $node->getNode('node'); + } + } + + $isShortCircuited = false; + if (null !== $nullSafeNode && !$nullSafeNode->isShortCircuited()) { $compiler - ->raw('((null === ('.$objectVar.' = ') - ->subcompile($this->getNode('node')) + ->raw('((null === ('.$nullSafeNode->getVarName($compiler).' = ') + ->subcompile($nullSafeNode->getNode('node')) ->raw(')) ? null : '); + + $nullSafeNode->markAsShortCircuited(); + $isShortCircuited = true; } $compiler->raw('CoreExtension::getAttribute($this->env, $this->source, '); if ($nullSafe) { - $compiler->raw($objectVar); + $compiler->raw($this->getVarName($compiler)); } else { $compiler->subcompile($this->getNode('node')); } @@ -139,7 +152,7 @@ class GetAttrExpression extends AbstractExpression implements SupportDefinedTest $compiler->raw(')'); } - if ($nullSafe) { + if ($isShortCircuited) { $compiler->raw(')'); } } @@ -153,4 +166,23 @@ class GetAttrExpression extends AbstractExpression implements SupportDefinedTest $this->changeIgnoreStrictCheck($node->getNode('node')); } } + + private function markAsShortCircuited(): void + { + $this->setAttribute('is_short_circuited', true); + } + + private function isShortCircuited(): bool + { + return $this->getAttribute('is_short_circuited'); + } + + private function getVarName(Compiler $compiler): string + { + if (null === $this->getAttribute('var_name')) { + $this->setAttribute('var_name', $compiler->getVarName()); + } + + return '$'.$this->getAttribute('var_name'); + } } diff --git a/lib/twig/twig/src/Node/Expression/ListExpression.php b/lib/twig/twig/src/Node/Expression/ListExpression.php index dd7fc1f9cd..9b23857fcc 100644 --- a/lib/twig/twig/src/Node/Expression/ListExpression.php +++ b/lib/twig/twig/src/Node/Expression/ListExpression.php @@ -12,12 +12,12 @@ namespace Twig\Node\Expression; use Twig\Compiler; -use Twig\Node\Expression\Variable\ContextVariable; +use Twig\Node\Expression\Variable\AssignContextVariable; class ListExpression extends AbstractExpression { /** - * @param array $items + * @param array $items */ public function __construct(array $items, int $lineno) { diff --git a/lib/twig/twig/src/Node/Expression/MacroReferenceExpression.php b/lib/twig/twig/src/Node/Expression/MacroReferenceExpression.php index fd7f1e733a..ba1d556b48 100644 --- a/lib/twig/twig/src/Node/Expression/MacroReferenceExpression.php +++ b/lib/twig/twig/src/Node/Expression/MacroReferenceExpression.php @@ -29,6 +29,16 @@ class MacroReferenceExpression extends AbstractExpression implements SupportDefi parent::__construct(['template' => $template, 'arguments' => $arguments], ['name' => $name], $lineno); } + public function __clone() + { + // The template node must not be deep-cloned because its name is + // lazily generated during compilation and must stay in sync with + // the AssignTemplateVariable that populates the $macros array. + $template = $this->nodes['template']; + parent::__clone(); + $this->nodes['template'] = $template; + } + public function compile(Compiler $compiler): void { if ($this->definedTest) { diff --git a/lib/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php b/lib/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php index 8cb5f7a39a..b1aea0f361 100644 --- a/lib/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php +++ b/lib/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php @@ -54,6 +54,11 @@ final class SafeAnalysisNodeVisitor implements NodeVisitorInterface if (\in_array('html_attr', $bucket['value'], true)) { $bucket['value'][] = 'html'; + $bucket['value'][] = 'html_attr_relaxed'; + } + + if (\in_array('html_attr_relaxed', $bucket['value'], true)) { + $bucket['value'][] = 'html'; } return $bucket['value']; diff --git a/lib/twig/twig/src/Parser.php b/lib/twig/twig/src/Parser.php index af54f13b22..3553007a95 100644 --- a/lib/twig/twig/src/Parser.php +++ b/lib/twig/twig/src/Parser.php @@ -416,6 +416,10 @@ class Parser trigger_deprecation('twig/twig', '3.12', 'Passing "null" to "%s()" is deprecated.', __METHOD__); } + if (null !== $parent && !$parent instanceof AbstractExpression) { + trigger_deprecation('twig/twig', '3.24', 'Passing a "%s" instance to "%s()" is deprecated, pass an "AbstractExpression" instance instead.', $parent::class, __METHOD__); + } + if (null !== $this->parent) { throw new SyntaxError('Multiple extends tags are forbidden.', $parent->getTemplateLine(), $parent->getSourceContext()); } @@ -447,7 +451,7 @@ class Parser if (!$function) { if ($this->shouldIgnoreUnknownTwigCallables()) { - return new TwigFunction($name, fn () => ''); + return new TwigFunction($name, static fn () => ''); } $e = new SyntaxError(\sprintf('Unknown "%s" function.', $name), $line, $this->stream->getSourceContext()); $e->addSuggestions($name, array_keys($this->env->getFunctions())); @@ -476,7 +480,7 @@ class Parser } if (!$filter) { if ($this->shouldIgnoreUnknownTwigCallables()) { - return new TwigFilter($name, fn () => ''); + return new TwigFilter($name, static fn () => ''); } $e = new SyntaxError(\sprintf('Unknown "%s" filter.', $name), $line, $this->stream->getSourceContext()); $e->addSuggestions($name, array_keys($this->env->getFilters())); @@ -524,7 +528,7 @@ class Parser if (!$test) { if ($this->shouldIgnoreUnknownTwigCallables()) { - return new TwigTest($name, fn () => ''); + return new TwigTest($name, static fn () => ''); } $e = new SyntaxError(\sprintf('Unknown "%s" test.', $name), $line, $this->stream->getSourceContext()); $e->addSuggestions($name, array_keys($this->env->getTests())); diff --git a/lib/twig/twig/src/Runtime/EscaperRuntime.php b/lib/twig/twig/src/Runtime/EscaperRuntime.php index f686e19f0c..f4a7023c7a 100644 --- a/lib/twig/twig/src/Runtime/EscaperRuntime.php +++ b/lib/twig/twig/src/Runtime/EscaperRuntime.php @@ -124,7 +124,7 @@ final class EscaperRuntime implements RuntimeExtensionInterface } $string = (string) $string; - } elseif (\in_array($strategy, ['html', 'js', 'css', 'html_attr', 'url'], true)) { + } elseif (\in_array($strategy, ['html', 'js', 'css', 'html_attr', 'html_attr_relaxed', 'url'], true)) { // we return the input as is (which can be of any type) return $string; } @@ -191,7 +191,7 @@ final class EscaperRuntime implements RuntimeExtensionInterface throw new RuntimeError('The string to escape is not a valid UTF-8 string.'); } - $string = preg_replace_callback('#[^a-zA-Z0-9,\._]#Su', function ($matches) { + $string = preg_replace_callback('#[^a-zA-Z0-9,\._]#Su', static function ($matches) { $char = $matches[0]; /* @@ -243,7 +243,7 @@ final class EscaperRuntime implements RuntimeExtensionInterface throw new RuntimeError('The string to escape is not a valid UTF-8 string.'); } - $string = preg_replace_callback('#[^a-zA-Z0-9]#Su', function ($matches) { + $string = preg_replace_callback('#[^a-zA-Z0-9]#Su', static function ($matches) { $char = $matches[0]; return \sprintf('\\%X ', 1 === \strlen($char) ? \ord($char) : mb_ord($char, 'UTF-8')); @@ -256,6 +256,7 @@ final class EscaperRuntime implements RuntimeExtensionInterface return $string; case 'html_attr': + case 'html_attr_relaxed': if ('UTF-8' !== $charset) { $string = $this->convertEncoding($string, 'UTF-8', $charset); } @@ -264,7 +265,12 @@ final class EscaperRuntime implements RuntimeExtensionInterface throw new RuntimeError('The string to escape is not a valid UTF-8 string.'); } - $string = preg_replace_callback('#[^a-zA-Z0-9,\.\-_]#Su', function ($matches) { + $regex = match ($strategy) { + 'html_attr' => '#[^a-zA-Z0-9,\.\-_]#Su', + 'html_attr_relaxed' => '#[^a-zA-Z0-9,\.\-_:@\[\]]#Su', + }; + + $string = preg_replace_callback($regex, static function ($matches) { /** * This function is adapted from code coming from Zend Framework. * @@ -323,7 +329,7 @@ final class EscaperRuntime implements RuntimeExtensionInterface return $this->escapers[$strategy]($string, $charset); } - $validStrategies = implode('", "', array_merge(['html', 'js', 'url', 'css', 'html_attr'], array_keys($this->escapers))); + $validStrategies = implode('", "', array_merge(['html', 'js', 'url', 'css', 'html_attr', 'html_attr_relaxed'], array_keys($this->escapers))); throw new RuntimeError(\sprintf('Invalid escaping strategy "%s" (valid ones: "%s").', $strategy, $validStrategies)); } diff --git a/lib/twig/twig/src/Template.php b/lib/twig/twig/src/Template.php index c372092874..37f8a1f031 100644 --- a/lib/twig/twig/src/Template.php +++ b/lib/twig/twig/src/Template.php @@ -158,7 +158,7 @@ abstract class Template if ($this->env->isDebug()) { ob_start(); } else { - ob_start(function () { return ''; }); + ob_start(static function () { return ''; }); } $this->displayParentBlock($name, $context, $blocks); @@ -193,7 +193,7 @@ abstract class Template if ($this->env->isDebug()) { ob_start(); } else { - ob_start(function () { return ''; }); + ob_start(static function () { return ''; }); } try { $this->displayBlock($name, $context, $blocks, $useBlocks); @@ -367,7 +367,7 @@ abstract class Template if ($this->env->isDebug()) { ob_start(); } else { - ob_start(function () { return ''; }); + ob_start(static function () { return ''; }); } try { $this->display($context); diff --git a/lib/twig/twig/src/Util/DeprecationCollector.php b/lib/twig/twig/src/Util/DeprecationCollector.php index 0ea26ed4ba..64cbba5a3f 100644 --- a/lib/twig/twig/src/Util/DeprecationCollector.php +++ b/lib/twig/twig/src/Util/DeprecationCollector.php @@ -54,7 +54,7 @@ final class DeprecationCollector public function collect(\Traversable $iterator): array { $deprecations = []; - set_error_handler(function ($type, $msg) use (&$deprecations) { + set_error_handler(static function ($type, $msg) use (&$deprecations) { if (\E_USER_DEPRECATED === $type) { $deprecations[] = $msg; } diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json index 9a6f709c38..719ffa9c65 100644 --- a/node_modules/.package-lock.json +++ b/node_modules/.package-lock.json @@ -14,11 +14,12 @@ "integrity": "sha512-Rzj90wbZQnNzazqzoiu5HzMEMdqMJLUVFOo699sinTXrZRm1aB5iX2HTiK2VlPnH4M6u8yYnJ7CebOyamfWlqw==" }, "node_modules/@hotwired/turbo": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@hotwired/turbo/-/turbo-8.0.5.tgz", - "integrity": "sha512-TdZDA7fxVQ2ZycygvpnzjGPmFq4sO/E2QVg+2em/sJ3YTSsIWVEis8HmWlumz+c9DjWcUkcCuB+muF08TInpAQ==", + "version": "8.0.23", + "resolved": "https://registry.npmjs.org/@hotwired/turbo/-/turbo-8.0.23.tgz", + "integrity": "sha512-GZ7cijxEZ6Ig71u7rD6LHaRv/wcE/hNsc+nEfiWOkLNqUgLOwo5MNGWOy5ZV9ZUDSiQx1no7YxjTNnT4O6//cQ==", + "license": "MIT", "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@orchidjs/sifter": { diff --git a/node_modules/@hotwired/turbo/CHANGELOG.md b/node_modules/@hotwired/turbo/CHANGELOG.md new file mode 100644 index 0000000000..85e46a882b --- /dev/null +++ b/node_modules/@hotwired/turbo/CHANGELOG.md @@ -0,0 +1,3 @@ +# Changelog + +Please see [our GitHub "Releases" page](https://github.com/hotwired/turbo/releases). diff --git a/node_modules/@hotwired/turbo/README.md b/node_modules/@hotwired/turbo/README.md index ed74ef6da7..1bd7ee7eff 100644 --- a/node_modules/@hotwired/turbo/README.md +++ b/node_modules/@hotwired/turbo/README.md @@ -15,4 +15,4 @@ Read more on [turbo.hotwired.dev](https://turbo.hotwired.dev). Please read [CONTRIBUTING.md](./CONTRIBUTING.md). -© 2024 37signals LLC. +© 2026 37signals LLC. diff --git a/node_modules/@hotwired/turbo/dist/turbo.es2017-esm.js b/node_modules/@hotwired/turbo/dist/turbo.es2017-esm.js index 2a43bcb3a5..086945c48b 100644 --- a/node_modules/@hotwired/turbo/dist/turbo.es2017-esm.js +++ b/node_modules/@hotwired/turbo/dist/turbo.es2017-esm.js @@ -1,104 +1,7 @@ /*! -Turbo 8.0.5 -Copyright © 2024 37signals LLC +Turbo 8.0.23 +Copyright © 2026 37signals LLC */ -/** - * The MIT License (MIT) - * - * Copyright (c) 2019 Javan Makhmali - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -(function (prototype) { - if (typeof prototype.requestSubmit == "function") return - - prototype.requestSubmit = function (submitter) { - if (submitter) { - validateSubmitter(submitter, this); - submitter.click(); - } else { - submitter = document.createElement("input"); - submitter.type = "submit"; - submitter.hidden = true; - this.appendChild(submitter); - submitter.click(); - this.removeChild(submitter); - } - }; - - function validateSubmitter(submitter, form) { - submitter instanceof HTMLElement || raise(TypeError, "parameter 1 is not of type 'HTMLElement'"); - submitter.type == "submit" || raise(TypeError, "The specified element is not a submit button"); - submitter.form == form || - raise(DOMException, "The specified element is not owned by this form element", "NotFoundError"); - } - - function raise(errorConstructor, message, name) { - throw new errorConstructor("Failed to execute 'requestSubmit' on 'HTMLFormElement': " + message + ".", name) - } -})(HTMLFormElement.prototype); - -const submittersByForm = new WeakMap(); - -function findSubmitterFromClickTarget(target) { - const element = target instanceof Element ? target : target instanceof Node ? target.parentElement : null; - const candidate = element ? element.closest("input, button") : null; - return candidate?.type == "submit" ? candidate : null -} - -function clickCaptured(event) { - const submitter = findSubmitterFromClickTarget(event.target); - - if (submitter && submitter.form) { - submittersByForm.set(submitter.form, submitter); - } -} - -(function () { - if ("submitter" in Event.prototype) return - - let prototype = window.Event.prototype; - // Certain versions of Safari 15 have a bug where they won't - // populate the submitter. This hurts TurboDrive's enable/disable detection. - // See https://bugs.webkit.org/show_bug.cgi?id=229660 - if ("SubmitEvent" in window) { - const prototypeOfSubmitEvent = window.SubmitEvent.prototype; - - if (/Apple Computer/.test(navigator.vendor) && !("submitter" in prototypeOfSubmitEvent)) { - prototype = prototypeOfSubmitEvent; - } else { - return // polyfill not needed - } - } - - addEventListener("click", clickCaptured, true); - - Object.defineProperty(prototype, "submitter", { - get() { - if (this.type == "submit" && this.target instanceof HTMLFormElement) { - return submittersByForm.get(this.target) - } - } - }); -})(); - const FrameLoadingStyle = { eager: "eager", lazy: "lazy" @@ -192,6 +95,10 @@ class FrameElement extends HTMLElement { } } + get shouldReloadWithMorph() { + return this.src && this.refresh === "morph" + } + /** * Determines if the element is loading */ @@ -289,136 +196,27 @@ function frameLoadingStyleFromString(style) { } } -function expandURL(locatable) { - return new URL(locatable.toString(), document.baseURI) -} - -function getAnchor(url) { - let anchorMatch; - if (url.hash) { - return url.hash.slice(1) - // eslint-disable-next-line no-cond-assign - } else if ((anchorMatch = url.href.match(/#(.*)$/))) { - return anchorMatch[1] - } -} - -function getAction$1(form, submitter) { - const action = submitter?.getAttribute("formaction") || form.getAttribute("action") || form.action; - - return expandURL(action) -} - -function getExtension(url) { - return (getLastPathComponent(url).match(/\.[^.]*$/) || [])[0] || "" -} - -function isHTML(url) { - return !!getExtension(url).match(/^(?:|\.(?:htm|html|xhtml|php))$/) -} - -function isPrefixedBy(baseURL, url) { - const prefix = getPrefix(url); - return baseURL.href === expandURL(prefix).href || baseURL.href.startsWith(prefix) -} - -function locationIsVisitable(location, rootLocation) { - return isPrefixedBy(location, rootLocation) && isHTML(location) -} - -function getRequestURL(url) { - const anchor = getAnchor(url); - return anchor != null ? url.href.slice(0, -(anchor.length + 1)) : url.href -} - -function toCacheKey(url) { - return getRequestURL(url) -} - -function urlsAreEqual(left, right) { - return expandURL(left).href == expandURL(right).href -} - -function getPathComponents(url) { - return url.pathname.split("/").slice(1) -} - -function getLastPathComponent(url) { - return getPathComponents(url).slice(-1)[0] -} - -function getPrefix(url) { - return addTrailingSlash(url.origin + url.pathname) -} - -function addTrailingSlash(value) { - return value.endsWith("/") ? value : value + "/" -} - -class FetchResponse { - constructor(response) { - this.response = response; - } - - get succeeded() { - return this.response.ok - } - - get failed() { - return !this.succeeded - } - - get clientError() { - return this.statusCode >= 400 && this.statusCode <= 499 - } - - get serverError() { - return this.statusCode >= 500 && this.statusCode <= 599 - } - - get redirected() { - return this.response.redirected - } - - get location() { - return expandURL(this.response.url) - } - - get isHTML() { - return this.contentType && this.contentType.match(/^(?:text\/([^\s;,]+\b)?html|application\/xhtml\+xml)\b/) - } - - get statusCode() { - return this.response.status - } - - get contentType() { - return this.header("Content-Type") - } - - get responseText() { - return this.response.clone().text() - } - - get responseHTML() { - if (this.isHTML) { - return this.response.clone().text() - } else { - return Promise.resolve(undefined) - } - } - - header(name) { - return this.response.headers.get(name) - } -} +const drive = { + enabled: true, + progressBarDelay: 500, + unvisitableExtensions: new Set( + [ + ".7z", ".aac", ".apk", ".avi", ".bmp", ".bz2", ".css", ".csv", ".deb", ".dmg", ".doc", + ".docx", ".exe", ".gif", ".gz", ".heic", ".heif", ".ico", ".iso", ".jpeg", ".jpg", + ".js", ".json", ".m4a", ".mkv", ".mov", ".mp3", ".mp4", ".mpeg", ".mpg", ".msi", + ".ogg", ".ogv", ".pdf", ".pkg", ".png", ".ppt", ".pptx", ".rar", ".rtf", + ".svg", ".tar", ".tif", ".tiff", ".txt", ".wav", ".webm", ".webp", ".wma", ".wmv", + ".xls", ".xlsx", ".xml", ".zip" + ] + ) +}; function activateScriptElement(element) { if (element.getAttribute("data-turbo-eval") == "false") { return element } else { const createdScriptElement = document.createElement("script"); - const cspNonce = getMetaContent("csp-nonce"); + const cspNonce = getCspNonce(); if (cspNonce) { createdScriptElement.nonce = cspNonce; } @@ -458,6 +256,11 @@ function dispatch(eventName, { target, cancelable, detail } = {}) { return event } +function cancelEvent(event) { + event.preventDefault(); + event.stopImmediatePropagation(); +} + function nextRepaint() { if (document.visibilityState === "hidden") { return nextEventLoopTick() @@ -474,10 +277,6 @@ function nextEventLoopTick() { return new Promise((resolve) => setTimeout(() => resolve(), 0)) } -function nextMicrotask() { - return Promise.resolve() -} - function parseHTMLDocument(html = "") { return new DOMParser().parseFromString(html, "text/html") } @@ -506,7 +305,7 @@ function uuid() { } else if (i == 19) { return (Math.floor(Math.random() * 4) + 8).toString(16) } else { - return Math.floor(Math.random() * 15).toString(16) + return Math.floor(Math.random() * 16).toString(16) } }) .join("") @@ -586,6 +385,15 @@ function getMetaContent(name) { return element && element.content } +function getCspNonce() { + const element = getMetaElement("csp-nonce"); + + if (element) { + const { nonce, content } = element; + return nonce == "" ? content : nonce + } +} + function setMetaContent(name, content) { let element = getMetaElement(name); @@ -646,11 +454,16 @@ function doesNotTargetIFrame(name) { } function findLinkFromClickTarget(target) { - return findClosestRecursively(target, "a[href]:not([target^=_]):not([download])") -} + const link = findClosestRecursively(target, "a[href], a[xlink\\:href]"); -function getLocationForLink(link) { - return expandURL(link.getAttribute("href") || "") + if (!link) return null + if (link.href.startsWith("#")) return null + if (link.hasAttribute("download")) return null + + const linkTarget = link.getAttribute("target"); + if (linkTarget && linkTarget !== "_self") return null + + return link } function debounce(fn, delay) { @@ -663,6 +476,171 @@ function debounce(fn, delay) { } } +const submitter = { + "aria-disabled": { + beforeSubmit: submitter => { + submitter.setAttribute("aria-disabled", "true"); + submitter.addEventListener("click", cancelEvent); + }, + + afterSubmit: submitter => { + submitter.removeAttribute("aria-disabled"); + submitter.removeEventListener("click", cancelEvent); + } + }, + + "disabled": { + beforeSubmit: submitter => submitter.disabled = true, + afterSubmit: submitter => submitter.disabled = false + } +}; + +class Config { + #submitter = null + + constructor(config) { + Object.assign(this, config); + } + + get submitter() { + return this.#submitter + } + + set submitter(value) { + this.#submitter = submitter[value] || value; + } +} + +const forms = new Config({ + mode: "on", + submitter: "disabled" +}); + +const config = { + drive, + forms +}; + +function expandURL(locatable) { + return new URL(locatable.toString(), document.baseURI) +} + +function getAnchor(url) { + let anchorMatch; + if (url.hash) { + return url.hash.slice(1) + // eslint-disable-next-line no-cond-assign + } else if ((anchorMatch = url.href.match(/#(.*)$/))) { + return anchorMatch[1] + } +} + +function getAction$1(form, submitter) { + const action = submitter?.getAttribute("formaction") || form.getAttribute("action") || form.action; + + return expandURL(action) +} + +function getExtension(url) { + return (getLastPathComponent(url).match(/\.[^.]*$/) || [])[0] || "" +} + +function isPrefixedBy(baseURL, url) { + const prefix = addTrailingSlash(url.origin + url.pathname); + return addTrailingSlash(baseURL.href) === prefix || baseURL.href.startsWith(prefix) +} + +function locationIsVisitable(location, rootLocation) { + return isPrefixedBy(location, rootLocation) && !config.drive.unvisitableExtensions.has(getExtension(location)) +} + +function getLocationForLink(link) { + return expandURL(link.getAttribute("href") || "") +} + +function getRequestURL(url) { + const anchor = getAnchor(url); + return anchor != null ? url.href.slice(0, -(anchor.length + 1)) : url.href +} + +function toCacheKey(url) { + return getRequestURL(url) +} + +function urlsAreEqual(left, right) { + return expandURL(left).href == expandURL(right).href +} + +function getPathComponents(url) { + return url.pathname.split("/").slice(1) +} + +function getLastPathComponent(url) { + return getPathComponents(url).slice(-1)[0] +} + +function addTrailingSlash(value) { + return value.endsWith("/") ? value : value + "/" +} + +class FetchResponse { + constructor(response) { + this.response = response; + } + + get succeeded() { + return this.response.ok + } + + get failed() { + return !this.succeeded + } + + get clientError() { + return this.statusCode >= 400 && this.statusCode <= 499 + } + + get serverError() { + return this.statusCode >= 500 && this.statusCode <= 599 + } + + get redirected() { + return this.response.redirected + } + + get location() { + return expandURL(this.response.url) + } + + get isHTML() { + return this.contentType && this.contentType.match(/^(?:text\/([^\s;,]+\b)?html|application\/xhtml\+xml)\b/) + } + + get statusCode() { + return this.response.status + } + + get contentType() { + return this.header("Content-Type") + } + + get responseText() { + return this.response.clone().text() + } + + get responseHTML() { + if (this.isHTML) { + return this.response.clone().text() + } else { + return Promise.resolve(undefined) + } + } + + header(name) { + return this.response.headers.get(name) + } +} + class LimitedSet extends Set { constructor(maxSize) { super(); @@ -681,15 +659,13 @@ class LimitedSet extends Set { const recentRequests = new LimitedSet(20); -const nativeFetch = window.fetch; - function fetchWithTurboHeaders(url, options = {}) { const modifiedHeaders = new Headers(options.headers || {}); const requestUID = uuid(); recentRequests.add(requestUID); modifiedHeaders.append("X-Turbo-Request-Id", requestUID); - return nativeFetch(url, { + return window.fetch(url, { ...options, headers: modifiedHeaders }) @@ -997,35 +973,113 @@ function importStreamElements(fragment) { return fragment } -const PREFETCH_DELAY = 100; +const identity = key => key; -class PrefetchCache { - #prefetchTimeout = null - #prefetched = null +class LRUCache { + keys = [] + entries = {} + #toCacheKey - get(url) { - if (this.#prefetched && this.#prefetched.url === url && this.#prefetched.expire > Date.now()) { - return this.#prefetched.request + constructor(size, toCacheKey = identity) { + this.size = size; + this.#toCacheKey = toCacheKey; + } + + has(key) { + return this.#toCacheKey(key) in this.entries + } + + get(key) { + if (this.has(key)) { + const entry = this.read(key); + this.touch(key); + return entry } } - setLater(url, request, ttl) { - this.clear(); - - this.#prefetchTimeout = setTimeout(() => { - request.perform(); - this.set(url, request, ttl); - this.#prefetchTimeout = null; - }, PREFETCH_DELAY); - } - - set(url, request, ttl) { - this.#prefetched = { url, request, expire: new Date(new Date().getTime() + ttl) }; + put(key, entry) { + this.write(key, entry); + this.touch(key); + return entry } clear() { + for (const key of Object.keys(this.entries)) { + this.evict(key); + } + } + + // Private + + read(key) { + return this.entries[this.#toCacheKey(key)] + } + + write(key, entry) { + this.entries[this.#toCacheKey(key)] = entry; + } + + touch(key) { + key = this.#toCacheKey(key); + const index = this.keys.indexOf(key); + if (index > -1) this.keys.splice(index, 1); + this.keys.unshift(key); + this.trim(); + } + + trim() { + for (const key of this.keys.splice(this.size)) { + this.evict(key); + } + } + + evict(key) { + delete this.entries[key]; + } +} + +const PREFETCH_DELAY = 100; + +class PrefetchCache extends LRUCache { + #prefetchTimeout = null + #maxAges = {} + + constructor(size = 1, prefetchDelay = PREFETCH_DELAY) { + super(size, toCacheKey); + this.prefetchDelay = prefetchDelay; + } + + putLater(url, request, ttl) { + this.#prefetchTimeout = setTimeout(() => { + request.perform(); + this.put(url, request, ttl); + this.#prefetchTimeout = null; + }, this.prefetchDelay); + } + + put(url, request, ttl = cacheTtl) { + super.put(url, request); + this.#maxAges[toCacheKey(url)] = new Date(new Date().getTime() + ttl); + } + + clear() { + super.clear(); if (this.#prefetchTimeout) clearTimeout(this.#prefetchTimeout); - this.#prefetched = null; + } + + evict(key) { + super.evict(key); + delete this.#maxAges[key]; + } + + has(key) { + if (super.has(key)) { + const maxAge = this.#maxAges[toCacheKey(key)]; + + return maxAge && maxAge > Date.now() + } else { + return false + } } } @@ -1044,7 +1098,7 @@ const FormSubmissionState = { class FormSubmission { state = FormSubmissionState.initialized - static confirmMethod(message, _element, _submitter) { + static confirmMethod(message) { return Promise.resolve(confirm(message)) } @@ -1100,7 +1154,11 @@ class FormSubmission { const confirmationMessage = getAttribute("data-turbo-confirm", this.submitter, this.formElement); if (typeof confirmationMessage === "string") { - const answer = await FormSubmission.confirmMethod(confirmationMessage, this.formElement, this.submitter); + const confirmMethod = typeof config.forms.confirm === "function" ? + config.forms.confirm : + FormSubmission.confirmMethod; + + const answer = await confirmMethod(confirmationMessage, this.formElement, this.submitter); if (!answer) { return } @@ -1138,7 +1196,7 @@ class FormSubmission { requestStarted(_request) { this.state = FormSubmissionState.waiting; - this.submitter?.setAttribute("disabled", ""); + if (this.submitter) config.forms.submitter.beforeSubmit(this.submitter); this.setSubmitsWith(); markAsBusy(this.formElement); dispatch("turbo:submit-start", { @@ -1184,7 +1242,7 @@ class FormSubmission { requestFinished(_request) { this.state = FormSubmissionState.stopped; - this.submitter?.removeAttribute("disabled"); + if (this.submitter) config.forms.submitter.afterSubmit(this.submitter); this.resetSubmitterText(); clearBusyState(this.formElement); dispatch("turbo:submit-end", { @@ -1421,8 +1479,8 @@ class View { scrollToAnchor(anchor) { const element = this.snapshot.getElementForAnchor(anchor); if (element) { - this.scrollToElement(element); this.focusElement(element); + this.scrollToElement(element); } else { this.scrollToPosition({ x: 0, y: 0 }); } @@ -1774,12 +1832,16 @@ function createPlaceholderForPermanentElement(permanentElement) { class Renderer { #activeElement = null - constructor(currentSnapshot, newSnapshot, renderElement, isPreview, willRender = true) { + static renderElement(currentElement, newElement) { + // Abstract method + } + + constructor(currentSnapshot, newSnapshot, isPreview, willRender = true) { this.currentSnapshot = currentSnapshot; this.newSnapshot = newSnapshot; this.isPreview = isPreview; this.willRender = willRender; - this.renderElement = renderElement; + this.renderElement = this.constructor.renderElement; this.promise = new Promise((resolve, reject) => (this.resolvingFunctions = { resolve, reject })); } @@ -1944,6 +2006,1514 @@ function readScrollBehavior(value, defaultValue) { } } +/** + * @typedef {object} ConfigHead + * + * @property {'merge' | 'append' | 'morph' | 'none'} [style] + * @property {boolean} [block] + * @property {boolean} [ignore] + * @property {function(Element): boolean} [shouldPreserve] + * @property {function(Element): boolean} [shouldReAppend] + * @property {function(Element): boolean} [shouldRemove] + * @property {function(Element, {added: Node[], kept: Element[], removed: Element[]}): void} [afterHeadMorphed] + */ + +/** + * @typedef {object} ConfigCallbacks + * + * @property {function(Node): boolean} [beforeNodeAdded] + * @property {function(Node): void} [afterNodeAdded] + * @property {function(Element, Node): boolean} [beforeNodeMorphed] + * @property {function(Element, Node): void} [afterNodeMorphed] + * @property {function(Element): boolean} [beforeNodeRemoved] + * @property {function(Element): void} [afterNodeRemoved] + * @property {function(string, Element, "update" | "remove"): boolean} [beforeAttributeUpdated] + */ + +/** + * @typedef {object} Config + * + * @property {'outerHTML' | 'innerHTML'} [morphStyle] + * @property {boolean} [ignoreActive] + * @property {boolean} [ignoreActiveValue] + * @property {boolean} [restoreFocus] + * @property {ConfigCallbacks} [callbacks] + * @property {ConfigHead} [head] + */ + +/** + * @typedef {function} NoOp + * + * @returns {void} + */ + +/** + * @typedef {object} ConfigHeadInternal + * + * @property {'merge' | 'append' | 'morph' | 'none'} style + * @property {boolean} [block] + * @property {boolean} [ignore] + * @property {(function(Element): boolean) | NoOp} shouldPreserve + * @property {(function(Element): boolean) | NoOp} shouldReAppend + * @property {(function(Element): boolean) | NoOp} shouldRemove + * @property {(function(Element, {added: Node[], kept: Element[], removed: Element[]}): void) | NoOp} afterHeadMorphed + */ + +/** + * @typedef {object} ConfigCallbacksInternal + * + * @property {(function(Node): boolean) | NoOp} beforeNodeAdded + * @property {(function(Node): void) | NoOp} afterNodeAdded + * @property {(function(Node, Node): boolean) | NoOp} beforeNodeMorphed + * @property {(function(Node, Node): void) | NoOp} afterNodeMorphed + * @property {(function(Node): boolean) | NoOp} beforeNodeRemoved + * @property {(function(Node): void) | NoOp} afterNodeRemoved + * @property {(function(string, Element, "update" | "remove"): boolean) | NoOp} beforeAttributeUpdated + */ + +/** + * @typedef {object} ConfigInternal + * + * @property {'outerHTML' | 'innerHTML'} morphStyle + * @property {boolean} [ignoreActive] + * @property {boolean} [ignoreActiveValue] + * @property {boolean} [restoreFocus] + * @property {ConfigCallbacksInternal} callbacks + * @property {ConfigHeadInternal} head + */ + +/** + * @typedef {Object} IdSets + * @property {Set} persistentIds + * @property {Map>} idMap + */ + +/** + * @typedef {Function} Morph + * + * @param {Element | Document} oldNode + * @param {Element | Node | HTMLCollection | Node[] | string | null} newContent + * @param {Config} [config] + * @returns {undefined | Node[]} + */ + +// base IIFE to define idiomorph +/** + * + * @type {{defaults: ConfigInternal, morph: Morph}} + */ +var Idiomorph = (function () { + + /** + * @typedef {object} MorphContext + * + * @property {Element} target + * @property {Element} newContent + * @property {ConfigInternal} config + * @property {ConfigInternal['morphStyle']} morphStyle + * @property {ConfigInternal['ignoreActive']} ignoreActive + * @property {ConfigInternal['ignoreActiveValue']} ignoreActiveValue + * @property {ConfigInternal['restoreFocus']} restoreFocus + * @property {Map>} idMap + * @property {Set} persistentIds + * @property {ConfigInternal['callbacks']} callbacks + * @property {ConfigInternal['head']} head + * @property {HTMLDivElement} pantry + * @property {Element[]} activeElementAndParents + */ + + //============================================================================= + // AND NOW IT BEGINS... + //============================================================================= + + const noOp = () => {}; + /** + * Default configuration values, updatable by users now + * @type {ConfigInternal} + */ + const defaults = { + morphStyle: "outerHTML", + callbacks: { + beforeNodeAdded: noOp, + afterNodeAdded: noOp, + beforeNodeMorphed: noOp, + afterNodeMorphed: noOp, + beforeNodeRemoved: noOp, + afterNodeRemoved: noOp, + beforeAttributeUpdated: noOp, + }, + head: { + style: "merge", + shouldPreserve: (elt) => elt.getAttribute("im-preserve") === "true", + shouldReAppend: (elt) => elt.getAttribute("im-re-append") === "true", + shouldRemove: noOp, + afterHeadMorphed: noOp, + }, + restoreFocus: true, + }; + + /** + * Core idiomorph function for morphing one DOM tree to another + * + * @param {Element | Document} oldNode + * @param {Element | Node | HTMLCollection | Node[] | string | null} newContent + * @param {Config} [config] + * @returns {Promise | Node[]} + */ + function morph(oldNode, newContent, config = {}) { + oldNode = normalizeElement(oldNode); + const newNode = normalizeParent(newContent); + const ctx = createMorphContext(oldNode, newNode, config); + + const morphedNodes = saveAndRestoreFocus(ctx, () => { + return withHeadBlocking( + ctx, + oldNode, + newNode, + /** @param {MorphContext} ctx */ (ctx) => { + if (ctx.morphStyle === "innerHTML") { + morphChildren(ctx, oldNode, newNode); + return Array.from(oldNode.childNodes); + } else { + return morphOuterHTML(ctx, oldNode, newNode); + } + }, + ); + }); + + ctx.pantry.remove(); + return morphedNodes; + } + + /** + * Morph just the outerHTML of the oldNode to the newContent + * We have to be careful because the oldNode could have siblings which need to be untouched + * @param {MorphContext} ctx + * @param {Element} oldNode + * @param {Element} newNode + * @returns {Node[]} + */ + function morphOuterHTML(ctx, oldNode, newNode) { + const oldParent = normalizeParent(oldNode); + morphChildren( + ctx, + oldParent, + newNode, + // these two optional params are the secret sauce + oldNode, // start point for iteration + oldNode.nextSibling, // end point for iteration + ); + // this is safe even with siblings, because normalizeParent returns a SlicedParentNode if needed. + return Array.from(oldParent.childNodes); + } + + /** + * @param {MorphContext} ctx + * @param {Function} fn + * @returns {Promise | Node[]} + */ + function saveAndRestoreFocus(ctx, fn) { + if (!ctx.config.restoreFocus) return fn(); + let activeElement = + /** @type {HTMLInputElement|HTMLTextAreaElement|null} */ ( + document.activeElement + ); + + // don't bother if the active element is not an input or textarea + if ( + !( + activeElement instanceof HTMLInputElement || + activeElement instanceof HTMLTextAreaElement + ) + ) { + return fn(); + } + + const { id: activeElementId, selectionStart, selectionEnd } = activeElement; + + const results = fn(); + + if ( + activeElementId && + activeElementId !== document.activeElement?.getAttribute("id") + ) { + activeElement = ctx.target.querySelector(`[id="${activeElementId}"]`); + activeElement?.focus(); + } + if (activeElement && !activeElement.selectionEnd && selectionEnd) { + activeElement.setSelectionRange(selectionStart, selectionEnd); + } + + return results; + } + + const morphChildren = (function () { + /** + * This is the core algorithm for matching up children. The idea is to use id sets to try to match up + * nodes as faithfully as possible. We greedily match, which allows us to keep the algorithm fast, but + * by using id sets, we are able to better match up with content deeper in the DOM. + * + * Basic algorithm: + * - for each node in the new content: + * - search self and siblings for an id set match, falling back to a soft match + * - if match found + * - remove any nodes up to the match: + * - pantry persistent nodes + * - delete the rest + * - morph the match + * - elsif no match found, and node is persistent + * - find its match by querying the old root (future) and pantry (past) + * - move it and its children here + * - morph it + * - else + * - create a new node from scratch as a last result + * + * @param {MorphContext} ctx the merge context + * @param {Element} oldParent the old content that we are merging the new content into + * @param {Element} newParent the parent element of the new content + * @param {Node|null} [insertionPoint] the point in the DOM we start morphing at (defaults to first child) + * @param {Node|null} [endPoint] the point in the DOM we stop morphing at (defaults to after last child) + */ + function morphChildren( + ctx, + oldParent, + newParent, + insertionPoint = null, + endPoint = null, + ) { + // normalize + if ( + oldParent instanceof HTMLTemplateElement && + newParent instanceof HTMLTemplateElement + ) { + // @ts-ignore we can pretend the DocumentFragment is an Element + oldParent = oldParent.content; + // @ts-ignore ditto + newParent = newParent.content; + } + insertionPoint ||= oldParent.firstChild; + + // run through all the new content + for (const newChild of newParent.childNodes) { + // once we reach the end of the old parent content skip to the end and insert the rest + if (insertionPoint && insertionPoint != endPoint) { + const bestMatch = findBestMatch( + ctx, + newChild, + insertionPoint, + endPoint, + ); + if (bestMatch) { + // if the node to morph is not at the insertion point then remove/move up to it + if (bestMatch !== insertionPoint) { + removeNodesBetween(ctx, insertionPoint, bestMatch); + } + morphNode(bestMatch, newChild, ctx); + insertionPoint = bestMatch.nextSibling; + continue; + } + } + + // if the matching node is elsewhere in the original content + if (newChild instanceof Element) { + // we can pretend the id is non-null because the next `.has` line will reject it if not + const newChildId = /** @type {String} */ ( + newChild.getAttribute("id") + ); + if (ctx.persistentIds.has(newChildId)) { + // move it and all its children here and morph + const movedChild = moveBeforeById( + oldParent, + newChildId, + insertionPoint, + ctx, + ); + morphNode(movedChild, newChild, ctx); + insertionPoint = movedChild.nextSibling; + continue; + } + } + + // last resort: insert the new node from scratch + const insertedNode = createNode( + oldParent, + newChild, + insertionPoint, + ctx, + ); + // could be null if beforeNodeAdded prevented insertion + if (insertedNode) { + insertionPoint = insertedNode.nextSibling; + } + } + + // remove any remaining old nodes that didn't match up with new content + while (insertionPoint && insertionPoint != endPoint) { + const tempNode = insertionPoint; + insertionPoint = insertionPoint.nextSibling; + removeNode(ctx, tempNode); + } + } + + /** + * This performs the action of inserting a new node while handling situations where the node contains + * elements with persistent ids and possible state info we can still preserve by moving in and then morphing + * + * @param {Element} oldParent + * @param {Node} newChild + * @param {Node|null} insertionPoint + * @param {MorphContext} ctx + * @returns {Node|null} + */ + function createNode(oldParent, newChild, insertionPoint, ctx) { + if (ctx.callbacks.beforeNodeAdded(newChild) === false) return null; + if (ctx.idMap.has(newChild)) { + // node has children with ids with possible state so create a dummy elt of same type and apply full morph algorithm + const newEmptyChild = document.createElement( + /** @type {Element} */ (newChild).tagName, + ); + oldParent.insertBefore(newEmptyChild, insertionPoint); + morphNode(newEmptyChild, newChild, ctx); + ctx.callbacks.afterNodeAdded(newEmptyChild); + return newEmptyChild; + } else { + // optimisation: no id state to preserve so we can just insert a clone of the newChild and its descendants + const newClonedChild = document.importNode(newChild, true); // importNode to not mutate newParent + oldParent.insertBefore(newClonedChild, insertionPoint); + ctx.callbacks.afterNodeAdded(newClonedChild); + return newClonedChild; + } + } + + //============================================================================= + // Matching Functions + //============================================================================= + const findBestMatch = (function () { + /** + * Scans forward from the startPoint to the endPoint looking for a match + * for the node. It looks for an id set match first, then a soft match. + * We abort softmatching if we find two future soft matches, to reduce churn. + * @param {Node} node + * @param {MorphContext} ctx + * @param {Node | null} startPoint + * @param {Node | null} endPoint + * @returns {Node | null} + */ + function findBestMatch(ctx, node, startPoint, endPoint) { + let softMatch = null; + let nextSibling = node.nextSibling; + let siblingSoftMatchCount = 0; + + let cursor = startPoint; + while (cursor && cursor != endPoint) { + // soft matching is a prerequisite for id set matching + if (isSoftMatch(cursor, node)) { + if (isIdSetMatch(ctx, cursor, node)) { + return cursor; // found an id set match, we're done! + } + + // we haven't yet saved a soft match fallback + if (softMatch === null) { + // the current soft match will hard match something else in the future, leave it + if (!ctx.idMap.has(cursor)) { + // save this as the fallback if we get through the loop without finding a hard match + softMatch = cursor; + } + } + } + if ( + softMatch === null && + nextSibling && + isSoftMatch(cursor, nextSibling) + ) { + // The next new node has a soft match with this node, so + // increment the count of future soft matches + siblingSoftMatchCount++; + nextSibling = nextSibling.nextSibling; + + // If there are two future soft matches, block soft matching for this node to allow + // future siblings to soft match. This is to reduce churn in the DOM when an element + // is prepended. + if (siblingSoftMatchCount >= 2) { + softMatch = undefined; + } + } + + // if the current node contains active element, stop looking for better future matches, + // because if one is found, this node will be moved to the pantry, reparenting it and thus losing focus + // @ts-ignore pretend cursor is Element rather than Node, we're just testing for array inclusion + if (ctx.activeElementAndParents.includes(cursor)) break; + + cursor = cursor.nextSibling; + } + + return softMatch || null; + } + + /** + * + * @param {MorphContext} ctx + * @param {Node} oldNode + * @param {Node} newNode + * @returns {boolean} + */ + function isIdSetMatch(ctx, oldNode, newNode) { + let oldSet = ctx.idMap.get(oldNode); + let newSet = ctx.idMap.get(newNode); + + if (!newSet || !oldSet) return false; + + for (const id of oldSet) { + // a potential match is an id in the new and old nodes that + // has not already been merged into the DOM + // But the newNode content we call this on has not been + // merged yet and we don't allow duplicate IDs so it is simple + if (newSet.has(id)) { + return true; + } + } + return false; + } + + /** + * + * @param {Node} oldNode + * @param {Node} newNode + * @returns {boolean} + */ + function isSoftMatch(oldNode, newNode) { + // ok to cast: if one is not element, `id` and `tagName` will be undefined and we'll just compare that. + const oldElt = /** @type {Element} */ (oldNode); + const newElt = /** @type {Element} */ (newNode); + + return ( + oldElt.nodeType === newElt.nodeType && + oldElt.tagName === newElt.tagName && + // If oldElt has an `id` with possible state and it doesn't match newElt.id then avoid morphing. + // We'll still match an anonymous node with an IDed newElt, though, because if it got this far, + // its not persistent, and new nodes can't have any hidden state. + // We can't use .id because of form input shadowing, and we can't count on .getAttribute's presence because it could be a document-fragment + (!oldElt.getAttribute?.("id") || + oldElt.getAttribute?.("id") === newElt.getAttribute?.("id")) + ); + } + + return findBestMatch; + })(); + + //============================================================================= + // DOM Manipulation Functions + //============================================================================= + + /** + * Gets rid of an unwanted DOM node; strategy depends on nature of its reuse: + * - Persistent nodes will be moved to the pantry for later reuse + * - Other nodes will have their hooks called, and then are removed + * @param {MorphContext} ctx + * @param {Node} node + */ + function removeNode(ctx, node) { + // are we going to id set match this later? + if (ctx.idMap.has(node)) { + // skip callbacks and move to pantry + moveBefore(ctx.pantry, node, null); + } else { + // remove for realsies + if (ctx.callbacks.beforeNodeRemoved(node) === false) return; + node.parentNode?.removeChild(node); + ctx.callbacks.afterNodeRemoved(node); + } + } + + /** + * Remove nodes between the start and end nodes + * @param {MorphContext} ctx + * @param {Node} startInclusive + * @param {Node} endExclusive + * @returns {Node|null} + */ + function removeNodesBetween(ctx, startInclusive, endExclusive) { + /** @type {Node | null} */ + let cursor = startInclusive; + // remove nodes until the endExclusive node + while (cursor && cursor !== endExclusive) { + let tempNode = /** @type {Node} */ (cursor); + cursor = cursor.nextSibling; + removeNode(ctx, tempNode); + } + return cursor; + } + + /** + * Search for an element by id within the document and pantry, and move it using moveBefore. + * + * @param {Element} parentNode - The parent node to which the element will be moved. + * @param {string} id - The ID of the element to be moved. + * @param {Node | null} after - The reference node to insert the element before. + * If `null`, the element is appended as the last child. + * @param {MorphContext} ctx + * @returns {Element} The found element + */ + function moveBeforeById(parentNode, id, after, ctx) { + const target = + /** @type {Element} - will always be found */ + ( + // ctx.target.id unsafe because of form input shadowing + // ctx.target could be a document fragment which doesn't have `getAttribute` + (ctx.target.getAttribute?.("id") === id && ctx.target) || + ctx.target.querySelector(`[id="${id}"]`) || + ctx.pantry.querySelector(`[id="${id}"]`) + ); + removeElementFromAncestorsIdMaps(target, ctx); + moveBefore(parentNode, target, after); + return target; + } + + /** + * Removes an element from its ancestors' id maps. This is needed when an element is moved from the + * "future" via `moveBeforeId`. Otherwise, its erstwhile ancestors could be mistakenly moved to the + * pantry rather than being deleted, preventing their removal hooks from being called. + * + * @param {Element} element - element to remove from its ancestors' id maps + * @param {MorphContext} ctx + */ + function removeElementFromAncestorsIdMaps(element, ctx) { + // we know id is non-null String, because this function is only called on elements with ids + const id = /** @type {String} */ (element.getAttribute("id")); + /** @ts-ignore - safe to loop in this way **/ + while ((element = element.parentNode)) { + let idSet = ctx.idMap.get(element); + if (idSet) { + idSet.delete(id); + if (!idSet.size) { + ctx.idMap.delete(element); + } + } + } + } + + /** + * Moves an element before another element within the same parent. + * Uses the proposed `moveBefore` API if available (and working), otherwise falls back to `insertBefore`. + * This is essentialy a forward-compat wrapper. + * + * @param {Element} parentNode - The parent node containing the after element. + * @param {Node} element - The element to be moved. + * @param {Node | null} after - The reference node to insert `element` before. + * If `null`, `element` is appended as the last child. + */ + function moveBefore(parentNode, element, after) { + // @ts-ignore - use proposed moveBefore feature + if (parentNode.moveBefore) { + try { + // @ts-ignore - use proposed moveBefore feature + parentNode.moveBefore(element, after); + } catch (e) { + // fall back to insertBefore as some browsers may fail on moveBefore when trying to move Dom disconnected nodes to pantry + parentNode.insertBefore(element, after); + } + } else { + parentNode.insertBefore(element, after); + } + } + + return morphChildren; + })(); + + //============================================================================= + // Single Node Morphing Code + //============================================================================= + const morphNode = (function () { + /** + * @param {Node} oldNode root node to merge content into + * @param {Node} newContent new content to merge + * @param {MorphContext} ctx the merge context + * @returns {Node | null} the element that ended up in the DOM + */ + function morphNode(oldNode, newContent, ctx) { + if (ctx.ignoreActive && oldNode === document.activeElement) { + // don't morph focused element + return null; + } + + if (ctx.callbacks.beforeNodeMorphed(oldNode, newContent) === false) { + return oldNode; + } + + if (oldNode instanceof HTMLHeadElement && ctx.head.ignore) ; else if ( + oldNode instanceof HTMLHeadElement && + ctx.head.style !== "morph" + ) { + // ok to cast: if newContent wasn't also a , it would've got caught in the `!isSoftMatch` branch above + handleHeadElement( + oldNode, + /** @type {HTMLHeadElement} */ (newContent), + ctx, + ); + } else { + morphAttributes(oldNode, newContent, ctx); + if (!ignoreValueOfActiveElement(oldNode, ctx)) { + // @ts-ignore newContent can be a node here because .firstChild will be null + morphChildren(ctx, oldNode, newContent); + } + } + ctx.callbacks.afterNodeMorphed(oldNode, newContent); + return oldNode; + } + + /** + * syncs the oldNode to the newNode, copying over all attributes and + * inner element state from the newNode to the oldNode + * + * @param {Node} oldNode the node to copy attributes & state to + * @param {Node} newNode the node to copy attributes & state from + * @param {MorphContext} ctx the merge context + */ + function morphAttributes(oldNode, newNode, ctx) { + let type = newNode.nodeType; + + // if is an element type, sync the attributes from the + // new node into the new node + if (type === 1 /* element type */) { + const oldElt = /** @type {Element} */ (oldNode); + const newElt = /** @type {Element} */ (newNode); + + const oldAttributes = oldElt.attributes; + const newAttributes = newElt.attributes; + for (const newAttribute of newAttributes) { + if (ignoreAttribute(newAttribute.name, oldElt, "update", ctx)) { + continue; + } + if (oldElt.getAttribute(newAttribute.name) !== newAttribute.value) { + oldElt.setAttribute(newAttribute.name, newAttribute.value); + } + } + // iterate backwards to avoid skipping over items when a delete occurs + for (let i = oldAttributes.length - 1; 0 <= i; i--) { + const oldAttribute = oldAttributes[i]; + + // toAttributes is a live NamedNodeMap, so iteration+mutation is unsafe + // e.g. custom element attribute callbacks can remove other attributes + if (!oldAttribute) continue; + + if (!newElt.hasAttribute(oldAttribute.name)) { + if (ignoreAttribute(oldAttribute.name, oldElt, "remove", ctx)) { + continue; + } + oldElt.removeAttribute(oldAttribute.name); + } + } + + if (!ignoreValueOfActiveElement(oldElt, ctx)) { + syncInputValue(oldElt, newElt, ctx); + } + } + + // sync text nodes + if (type === 8 /* comment */ || type === 3 /* text */) { + if (oldNode.nodeValue !== newNode.nodeValue) { + oldNode.nodeValue = newNode.nodeValue; + } + } + } + + /** + * NB: many bothans died to bring us information: + * + * https://github.com/patrick-steele-idem/morphdom/blob/master/src/specialElHandlers.js + * https://github.com/choojs/nanomorph/blob/master/lib/morph.jsL113 + * + * @param {Element} oldElement the element to sync the input value to + * @param {Element} newElement the element to sync the input value from + * @param {MorphContext} ctx the merge context + */ + function syncInputValue(oldElement, newElement, ctx) { + if ( + oldElement instanceof HTMLInputElement && + newElement instanceof HTMLInputElement && + newElement.type !== "file" + ) { + let newValue = newElement.value; + let oldValue = oldElement.value; + + // sync boolean attributes + syncBooleanAttribute(oldElement, newElement, "checked", ctx); + syncBooleanAttribute(oldElement, newElement, "disabled", ctx); + + if (!newElement.hasAttribute("value")) { + if (!ignoreAttribute("value", oldElement, "remove", ctx)) { + oldElement.value = ""; + oldElement.removeAttribute("value"); + } + } else if (oldValue !== newValue) { + if (!ignoreAttribute("value", oldElement, "update", ctx)) { + oldElement.setAttribute("value", newValue); + oldElement.value = newValue; + } + } + // TODO: QUESTION(1cg): this used to only check `newElement` unlike the other branches -- why? + // did I break something? + } else if ( + oldElement instanceof HTMLOptionElement && + newElement instanceof HTMLOptionElement + ) { + syncBooleanAttribute(oldElement, newElement, "selected", ctx); + } else if ( + oldElement instanceof HTMLTextAreaElement && + newElement instanceof HTMLTextAreaElement + ) { + let newValue = newElement.value; + let oldValue = oldElement.value; + if (ignoreAttribute("value", oldElement, "update", ctx)) { + return; + } + if (newValue !== oldValue) { + oldElement.value = newValue; + } + if ( + oldElement.firstChild && + oldElement.firstChild.nodeValue !== newValue + ) { + oldElement.firstChild.nodeValue = newValue; + } + } + } + + /** + * @param {Element} oldElement element to write the value to + * @param {Element} newElement element to read the value from + * @param {string} attributeName the attribute name + * @param {MorphContext} ctx the merge context + */ + function syncBooleanAttribute(oldElement, newElement, attributeName, ctx) { + // @ts-ignore this function is only used on boolean attrs that are reflected as dom properties + const newLiveValue = newElement[attributeName], + // @ts-ignore ditto + oldLiveValue = oldElement[attributeName]; + if (newLiveValue !== oldLiveValue) { + const ignoreUpdate = ignoreAttribute( + attributeName, + oldElement, + "update", + ctx, + ); + if (!ignoreUpdate) { + // update attribute's associated DOM property + // @ts-ignore this function is only used on boolean attrs that are reflected as dom properties + oldElement[attributeName] = newElement[attributeName]; + } + if (newLiveValue) { + if (!ignoreUpdate) { + // https://developer.mozilla.org/en-US/docs/Glossary/Boolean/HTML + // this is the correct way to set a boolean attribute to "true" + oldElement.setAttribute(attributeName, ""); + } + } else { + if (!ignoreAttribute(attributeName, oldElement, "remove", ctx)) { + oldElement.removeAttribute(attributeName); + } + } + } + } + + /** + * @param {string} attr the attribute to be mutated + * @param {Element} element the element that is going to be updated + * @param {"update" | "remove"} updateType + * @param {MorphContext} ctx the merge context + * @returns {boolean} true if the attribute should be ignored, false otherwise + */ + function ignoreAttribute(attr, element, updateType, ctx) { + if ( + attr === "value" && + ctx.ignoreActiveValue && + element === document.activeElement + ) { + return true; + } + return ( + ctx.callbacks.beforeAttributeUpdated(attr, element, updateType) === + false + ); + } + + /** + * @param {Node} possibleActiveElement + * @param {MorphContext} ctx + * @returns {boolean} + */ + function ignoreValueOfActiveElement(possibleActiveElement, ctx) { + return ( + !!ctx.ignoreActiveValue && + possibleActiveElement === document.activeElement && + possibleActiveElement !== document.body + ); + } + + return morphNode; + })(); + + //============================================================================= + // Head Management Functions + //============================================================================= + /** + * @param {MorphContext} ctx + * @param {Element} oldNode + * @param {Element} newNode + * @param {function} callback + * @returns {Node[] | Promise} + */ + function withHeadBlocking(ctx, oldNode, newNode, callback) { + if (ctx.head.block) { + const oldHead = oldNode.querySelector("head"); + const newHead = newNode.querySelector("head"); + if (oldHead && newHead) { + const promises = handleHeadElement(oldHead, newHead, ctx); + // when head promises resolve, proceed ignoring the head tag + return Promise.all(promises).then(() => { + const newCtx = Object.assign(ctx, { + head: { + block: false, + ignore: true, + }, + }); + return callback(newCtx); + }); + } + } + // just proceed if we not head blocking + return callback(ctx); + } + + /** + * The HEAD tag can be handled specially, either w/ a 'merge' or 'append' style + * + * @param {Element} oldHead + * @param {Element} newHead + * @param {MorphContext} ctx + * @returns {Promise[]} + */ + function handleHeadElement(oldHead, newHead, ctx) { + let added = []; + let removed = []; + let preserved = []; + let nodesToAppend = []; + + // put all new head elements into a Map, by their outerHTML + let srcToNewHeadNodes = new Map(); + for (const newHeadChild of newHead.children) { + srcToNewHeadNodes.set(newHeadChild.outerHTML, newHeadChild); + } + + // for each elt in the current head + for (const currentHeadElt of oldHead.children) { + // If the current head element is in the map + let inNewContent = srcToNewHeadNodes.has(currentHeadElt.outerHTML); + let isReAppended = ctx.head.shouldReAppend(currentHeadElt); + let isPreserved = ctx.head.shouldPreserve(currentHeadElt); + if (inNewContent || isPreserved) { + if (isReAppended) { + // remove the current version and let the new version replace it and re-execute + removed.push(currentHeadElt); + } else { + // this element already exists and should not be re-appended, so remove it from + // the new content map, preserving it in the DOM + srcToNewHeadNodes.delete(currentHeadElt.outerHTML); + preserved.push(currentHeadElt); + } + } else { + if (ctx.head.style === "append") { + // we are appending and this existing element is not new content + // so if and only if it is marked for re-append do we do anything + if (isReAppended) { + removed.push(currentHeadElt); + nodesToAppend.push(currentHeadElt); + } + } else { + // if this is a merge, we remove this content since it is not in the new head + if (ctx.head.shouldRemove(currentHeadElt) !== false) { + removed.push(currentHeadElt); + } + } + } + } + + // Push the remaining new head elements in the Map into the + // nodes to append to the head tag + nodesToAppend.push(...srcToNewHeadNodes.values()); + + let promises = []; + for (const newNode of nodesToAppend) { + // TODO: This could theoretically be null, based on type + let newElt = /** @type {ChildNode} */ ( + document.createRange().createContextualFragment(newNode.outerHTML) + .firstChild + ); + if (ctx.callbacks.beforeNodeAdded(newElt) !== false) { + if ( + ("href" in newElt && newElt.href) || + ("src" in newElt && newElt.src) + ) { + /** @type {(result?: any) => void} */ let resolve; + let promise = new Promise(function (_resolve) { + resolve = _resolve; + }); + newElt.addEventListener("load", function () { + resolve(); + }); + promises.push(promise); + } + oldHead.appendChild(newElt); + ctx.callbacks.afterNodeAdded(newElt); + added.push(newElt); + } + } + + // remove all removed elements, after we have appended the new elements to avoid + // additional network requests for things like style sheets + for (const removedElement of removed) { + if (ctx.callbacks.beforeNodeRemoved(removedElement) !== false) { + oldHead.removeChild(removedElement); + ctx.callbacks.afterNodeRemoved(removedElement); + } + } + + ctx.head.afterHeadMorphed(oldHead, { + added: added, + kept: preserved, + removed: removed, + }); + return promises; + } + + //============================================================================= + // Create Morph Context Functions + //============================================================================= + const createMorphContext = (function () { + /** + * + * @param {Element} oldNode + * @param {Element} newContent + * @param {Config} config + * @returns {MorphContext} + */ + function createMorphContext(oldNode, newContent, config) { + const { persistentIds, idMap } = createIdMaps(oldNode, newContent); + + const mergedConfig = mergeDefaults(config); + const morphStyle = mergedConfig.morphStyle || "outerHTML"; + if (!["innerHTML", "outerHTML"].includes(morphStyle)) { + throw `Do not understand how to morph style ${morphStyle}`; + } + + return { + target: oldNode, + newContent: newContent, + config: mergedConfig, + morphStyle: morphStyle, + ignoreActive: mergedConfig.ignoreActive, + ignoreActiveValue: mergedConfig.ignoreActiveValue, + restoreFocus: mergedConfig.restoreFocus, + idMap: idMap, + persistentIds: persistentIds, + pantry: createPantry(), + activeElementAndParents: createActiveElementAndParents(oldNode), + callbacks: mergedConfig.callbacks, + head: mergedConfig.head, + }; + } + + /** + * Deep merges the config object and the Idiomorph.defaults object to + * produce a final configuration object + * @param {Config} config + * @returns {ConfigInternal} + */ + function mergeDefaults(config) { + let finalConfig = Object.assign({}, defaults); + + // copy top level stuff into final config + Object.assign(finalConfig, config); + + // copy callbacks into final config (do this to deep merge the callbacks) + finalConfig.callbacks = Object.assign( + {}, + defaults.callbacks, + config.callbacks, + ); + + // copy head config into final config (do this to deep merge the head) + finalConfig.head = Object.assign({}, defaults.head, config.head); + + return finalConfig; + } + + /** + * @returns {HTMLDivElement} + */ + function createPantry() { + const pantry = document.createElement("div"); + pantry.hidden = true; + document.body.insertAdjacentElement("afterend", pantry); + return pantry; + } + + /** + * @param {Element} oldNode + * @returns {Element[]} + */ + function createActiveElementAndParents(oldNode) { + /** @type {Element[]} */ + let activeElementAndParents = []; + let elt = document.activeElement; + if (elt?.tagName !== "BODY" && oldNode.contains(elt)) { + while (elt) { + activeElementAndParents.push(elt); + if (elt === oldNode) break; + elt = elt.parentElement; + } + } + return activeElementAndParents; + } + + /** + * Returns all elements with an ID contained within the root element and its descendants + * + * @param {Element} root + * @returns {Element[]} + */ + function findIdElements(root) { + let elements = Array.from(root.querySelectorAll("[id]")); + // root could be a document fragment which doesn't have `getAttribute` + if (root.getAttribute?.("id")) { + elements.push(root); + } + return elements; + } + + /** + * A bottom-up algorithm that populates a map of Element -> IdSet. + * The idSet for a given element is the set of all IDs contained within its subtree. + * As an optimzation, we filter these IDs through the given list of persistent IDs, + * because we don't need to bother considering IDed elements that won't be in the new content. + * + * @param {Map>} idMap + * @param {Set} persistentIds + * @param {Element} root + * @param {Element[]} elements + */ + function populateIdMapWithTree(idMap, persistentIds, root, elements) { + for (const elt of elements) { + // we can pretend id is non-null String, because the .has line will reject it immediately if not + const id = /** @type {String} */ (elt.getAttribute("id")); + if (persistentIds.has(id)) { + /** @type {Element|null} */ + let current = elt; + // walk up the parent hierarchy of that element, adding the id + // of element to the parent's id set + while (current) { + let idSet = idMap.get(current); + // if the id set doesn't exist, create it and insert it in the map + if (idSet == null) { + idSet = new Set(); + idMap.set(current, idSet); + } + idSet.add(id); + + if (current === root) break; + current = current.parentElement; + } + } + } + } + + /** + * This function computes a map of nodes to all ids contained within that node (inclusive of the + * node). This map can be used to ask if two nodes have intersecting sets of ids, which allows + * for a looser definition of "matching" than tradition id matching, and allows child nodes + * to contribute to a parent nodes matching. + * + * @param {Element} oldContent the old content that will be morphed + * @param {Element} newContent the new content to morph to + * @returns {IdSets} + */ + function createIdMaps(oldContent, newContent) { + const oldIdElements = findIdElements(oldContent); + const newIdElements = findIdElements(newContent); + + const persistentIds = createPersistentIds(oldIdElements, newIdElements); + + /** @type {Map>} */ + let idMap = new Map(); + populateIdMapWithTree(idMap, persistentIds, oldContent, oldIdElements); + + /** @ts-ignore - if newContent is a duck-typed parent, pass its single child node as the root to halt upwards iteration */ + const newRoot = newContent.__idiomorphRoot || newContent; + populateIdMapWithTree(idMap, persistentIds, newRoot, newIdElements); + + return { persistentIds, idMap }; + } + + /** + * This function computes the set of ids that persist between the two contents excluding duplicates + * + * @param {Element[]} oldIdElements + * @param {Element[]} newIdElements + * @returns {Set} + */ + function createPersistentIds(oldIdElements, newIdElements) { + let duplicateIds = new Set(); + + /** @type {Map} */ + let oldIdTagNameMap = new Map(); + for (const { id, tagName } of oldIdElements) { + if (oldIdTagNameMap.has(id)) { + duplicateIds.add(id); + } else { + oldIdTagNameMap.set(id, tagName); + } + } + + let persistentIds = new Set(); + for (const { id, tagName } of newIdElements) { + if (persistentIds.has(id)) { + duplicateIds.add(id); + } else if (oldIdTagNameMap.get(id) === tagName) { + persistentIds.add(id); + } + // skip if tag types mismatch because its not possible to morph one tag into another + } + + for (const id of duplicateIds) { + persistentIds.delete(id); + } + return persistentIds; + } + + return createMorphContext; + })(); + + //============================================================================= + // HTML Normalization Functions + //============================================================================= + const { normalizeElement, normalizeParent } = (function () { + /** @type {WeakSet} */ + const generatedByIdiomorph = new WeakSet(); + + /** + * + * @param {Element | Document} content + * @returns {Element} + */ + function normalizeElement(content) { + if (content instanceof Document) { + return content.documentElement; + } else { + return content; + } + } + + /** + * + * @param {null | string | Node | HTMLCollection | Node[] | Document & {generatedByIdiomorph:boolean}} newContent + * @returns {Element} + */ + function normalizeParent(newContent) { + if (newContent == null) { + return document.createElement("div"); // dummy parent element + } else if (typeof newContent === "string") { + return normalizeParent(parseContent(newContent)); + } else if ( + generatedByIdiomorph.has(/** @type {Element} */ (newContent)) + ) { + // the template tag created by idiomorph parsing can serve as a dummy parent + return /** @type {Element} */ (newContent); + } else if (newContent instanceof Node) { + if (newContent.parentNode) { + // we can't use the parent directly because newContent may have siblings + // that we don't want in the morph, and reparenting might be expensive (TODO is it?), + // so instead we create a fake parent node that only sees a slice of its children. + /** @type {Element} */ + return /** @type {any} */ (new SlicedParentNode(newContent)); + } else { + // a single node is added as a child to a dummy parent + const dummyParent = document.createElement("div"); + dummyParent.append(newContent); + return dummyParent; + } + } else { + // all nodes in the array or HTMLElement collection are consolidated under + // a single dummy parent element + const dummyParent = document.createElement("div"); + for (const elt of [...newContent]) { + dummyParent.append(elt); + } + return dummyParent; + } + } + + /** + * A fake duck-typed parent element to wrap a single node, without actually reparenting it. + * This is useful because the node may have siblings that we don't want in the morph, and it may also be moved + * or replaced with one or more elements during the morph. This class effectively allows us a window into + * a slice of a node's children. + * "If it walks like a duck, and quacks like a duck, then it must be a duck!" -- James Whitcomb Riley (1849–1916) + */ + class SlicedParentNode { + /** @param {Node} node */ + constructor(node) { + this.originalNode = node; + this.realParentNode = /** @type {Element} */ (node.parentNode); + this.previousSibling = node.previousSibling; + this.nextSibling = node.nextSibling; + } + + /** @returns {Node[]} */ + get childNodes() { + // return slice of realParent's current childNodes, based on previousSibling and nextSibling + const nodes = []; + let cursor = this.previousSibling + ? this.previousSibling.nextSibling + : this.realParentNode.firstChild; + while (cursor && cursor != this.nextSibling) { + nodes.push(cursor); + cursor = cursor.nextSibling; + } + return nodes; + } + + /** + * @param {string} selector + * @returns {Element[]} + */ + querySelectorAll(selector) { + return this.childNodes.reduce((results, node) => { + if (node instanceof Element) { + if (node.matches(selector)) results.push(node); + const nodeList = node.querySelectorAll(selector); + for (let i = 0; i < nodeList.length; i++) { + results.push(nodeList[i]); + } + } + return results; + }, /** @type {Element[]} */ ([])); + } + + /** + * @param {Node} node + * @param {Node} referenceNode + * @returns {Node} + */ + insertBefore(node, referenceNode) { + return this.realParentNode.insertBefore(node, referenceNode); + } + + /** + * @param {Node} node + * @param {Node} referenceNode + * @returns {Node} + */ + moveBefore(node, referenceNode) { + // @ts-ignore - use new moveBefore feature + return this.realParentNode.moveBefore(node, referenceNode); + } + + /** + * for later use with populateIdMapWithTree to halt upwards iteration + * @returns {Node} + */ + get __idiomorphRoot() { + return this.originalNode; + } + } + + /** + * + * @param {string} newContent + * @returns {Node | null | DocumentFragment} + */ + function parseContent(newContent) { + let parser = new DOMParser(); + + // remove svgs to avoid false-positive matches on head, etc. + let contentWithSvgsRemoved = newContent.replace( + /]*>|>)([\s\S]*?)<\/svg>/gim, + "", + ); + + // if the newContent contains a html, head or body tag, we can simply parse it w/o wrapping + if ( + contentWithSvgsRemoved.match(/<\/html>/) || + contentWithSvgsRemoved.match(/<\/head>/) || + contentWithSvgsRemoved.match(/<\/body>/) + ) { + let content = parser.parseFromString(newContent, "text/html"); + // if it is a full HTML document, return the document itself as the parent container + if (contentWithSvgsRemoved.match(/<\/html>/)) { + generatedByIdiomorph.add(content); + return content; + } else { + // otherwise return the html element as the parent container + let htmlElement = content.firstChild; + if (htmlElement) { + generatedByIdiomorph.add(htmlElement); + } + return htmlElement; + } + } else { + // if it is partial HTML, wrap it in a template tag to provide a parent element and also to help + // deal with touchy tags like tr, tbody, etc. + let responseDoc = parser.parseFromString( + "", + "text/html", + ); + let content = /** @type {HTMLTemplateElement} */ ( + responseDoc.body.querySelector("template") + ).content; + generatedByIdiomorph.add(content); + return content; + } + } + + return { normalizeElement, normalizeParent }; + })(); + + //============================================================================= + // This is what ends up becoming the Idiomorph global object + //============================================================================= + return { + morph, + defaults, + }; +})(); + +/** + * Morph the state of the currentElement based on the attributes and contents of + * the newElement. Morphing may dispatch turbo:before-morph-element, + * turbo:before-morph-attribute, and turbo:morph-element events. + * + * @param currentElement Element destination of morphing changes + * @param newElement Element source of morphing changes + */ +function morphElements(currentElement, newElement, { callbacks, ...options } = {}) { + Idiomorph.morph(currentElement, newElement, { + ...options, + callbacks: new DefaultIdiomorphCallbacks(callbacks) + }); +} + +/** + * Morph the child elements of the currentElement based on the child elements of + * the newElement. Morphing children may dispatch turbo:before-morph-element, + * turbo:before-morph-attribute, and turbo:morph-element events. + * + * @param currentElement Element destination of morphing children changes + * @param newElement Element source of morphing children changes + */ +function morphChildren(currentElement, newElement, options = {}) { + morphElements(currentElement, newElement.childNodes, { + ...options, + morphStyle: "innerHTML" + }); +} + +function shouldRefreshFrameWithMorphing(currentFrame, newFrame) { + return currentFrame instanceof FrameElement && + currentFrame.shouldReloadWithMorph && (!newFrame || areFramesCompatibleForRefreshing(currentFrame, newFrame)) && + !currentFrame.closest("[data-turbo-permanent]") +} + +function areFramesCompatibleForRefreshing(currentFrame, newFrame) { + // newFrame cannot yet be an instance of FrameElement because custom + // elements don't get initialized until they're attached to the DOM, so + // test its Element#nodeName instead + return newFrame instanceof Element && newFrame.nodeName === "TURBO-FRAME" && currentFrame.id === newFrame.id && + (!newFrame.getAttribute("src") || urlsAreEqual(currentFrame.src, newFrame.getAttribute("src"))) +} + +function closestFrameReloadableWithMorphing(node) { + return node.parentElement.closest("turbo-frame[src][refresh=morph]") +} + +class DefaultIdiomorphCallbacks { + #beforeNodeMorphed + + constructor({ beforeNodeMorphed } = {}) { + this.#beforeNodeMorphed = beforeNodeMorphed || (() => true); + } + + beforeNodeAdded = (node) => { + return !(node.id && node.hasAttribute("data-turbo-permanent") && document.getElementById(node.id)) + } + + beforeNodeMorphed = (currentElement, newElement) => { + if (currentElement instanceof Element) { + if (!currentElement.hasAttribute("data-turbo-permanent") && this.#beforeNodeMorphed(currentElement, newElement)) { + const event = dispatch("turbo:before-morph-element", { + cancelable: true, + target: currentElement, + detail: { currentElement, newElement } + }); + + return !event.defaultPrevented + } else { + return false + } + } + } + + beforeAttributeUpdated = (attributeName, target, mutationType) => { + const event = dispatch("turbo:before-morph-attribute", { + cancelable: true, + target, + detail: { attributeName, mutationType } + }); + + return !event.defaultPrevented + } + + beforeNodeRemoved = (node) => { + return this.beforeNodeMorphed(node) + } + + afterNodeMorphed = (currentElement, newElement) => { + if (currentElement instanceof Element) { + dispatch("turbo:morph-element", { + target: currentElement, + detail: { currentElement, newElement } + }); + } + } +} + +class MorphingFrameRenderer extends FrameRenderer { + static renderElement(currentElement, newElement) { + dispatch("turbo:before-frame-morph", { + target: currentElement, + detail: { currentElement, newElement } + }); + + morphChildren(currentElement, newElement, { + callbacks: { + beforeNodeMorphed: (node, newNode) => { + if ( + shouldRefreshFrameWithMorphing(node, newNode) && + closestFrameReloadableWithMorphing(node) === currentElement + ) { + node.reload(); + return false + } + return true + } + } + }); + } + + async preservingPermanentElements(callback) { + return await callback() + } +} + class ProgressBar { static animationDuration = 300 /*ms*/ @@ -2050,8 +3620,9 @@ class ProgressBar { const element = document.createElement("style"); element.type = "text/css"; element.textContent = ProgressBar.defaultCSS; - if (this.cspNonce) { - element.nonce = this.cspNonce; + const cspNonce = getCspNonce(); + if (cspNonce) { + element.nonce = cspNonce; } return element } @@ -2061,10 +3632,6 @@ class ProgressBar { element.className = "turbo-progress-bar"; return element } - - get cspNonce() { - return getMetaContent("csp-nonce") - } } class HeadSnapshot extends Snapshot { @@ -2215,6 +3782,10 @@ class PageSnapshot extends Snapshot { clonedPasswordInput.value = ""; } + for (const clonedNoscriptElement of clonedElement.querySelectorAll("noscript")) { + clonedNoscriptElement.remove(); + } + return new PageSnapshot(this.documentElement, clonedElement, this.headSnapshot) } @@ -2222,6 +3793,10 @@ class PageSnapshot extends Snapshot { return this.documentElement.getAttribute("lang") } + get dir() { + return this.documentElement.getAttribute("dir") + } + get headElement() { return this.headSnapshot.element } @@ -2248,15 +3823,16 @@ class PageSnapshot extends Snapshot { } get prefersViewTransitions() { - return this.headSnapshot.getMetaValue("view-transition") === "same-origin" + const viewTransitionEnabled = this.getSetting("view-transition") === "true" || this.headSnapshot.getMetaValue("view-transition") === "same-origin"; + return viewTransitionEnabled && !window.matchMedia("(prefers-reduced-motion: reduce)").matches } - get shouldMorphPage() { - return this.getSetting("refresh-method") === "morph" + get refreshMethod() { + return this.getSetting("refresh-method") } - get shouldPreserveScrollPosition() { - return this.getSetting("refresh-scroll") === "preserve" + get refreshScroll() { + return this.getSetting("refresh-scroll") } // Private @@ -2295,7 +3871,8 @@ const defaultOptions = { willRender: true, updateHistory: true, shouldCacheSnapshot: true, - acceptsStreamResponse: false + acceptsStreamResponse: false, + refresh: {} }; const TimingMetric = { @@ -2355,7 +3932,8 @@ class Visit { updateHistory, shouldCacheSnapshot, acceptsStreamResponse, - direction + direction, + refresh } = { ...defaultOptions, ...options @@ -2366,7 +3944,6 @@ class Visit { this.snapshot = snapshot; this.snapshotHTML = snapshotHTML; this.response = response; - this.isSamePage = this.delegate.locationWithActionIsSamePage(this.location, this.action); this.isPageRefresh = this.view.isPageRefresh(this); this.visitCachedSnapshot = visitCachedSnapshot; this.willRender = willRender; @@ -2375,6 +3952,7 @@ class Visit { this.shouldCacheSnapshot = shouldCacheSnapshot; this.acceptsStreamResponse = acceptsStreamResponse; this.direction = direction || Direction[action]; + this.refresh = refresh; } get adapter() { @@ -2393,10 +3971,6 @@ class Visit { return this.history.getRestorationDataForIdentifier(this.restorationIdentifier) } - get silent() { - return this.isSamePage - } - start() { if (this.state == VisitState.initialized) { this.recordTimingMetric(TimingMetric.visitStart); @@ -2533,7 +4107,7 @@ class Visit { const isPreview = this.shouldIssueRequest(); this.render(async () => { this.cacheSnapshot(); - if (this.isSamePage || this.isPageRefresh) { + if (this.isPageRefresh) { this.adapter.visitRendered(this); } else { if (this.view.renderPromise) await this.view.renderPromise; @@ -2561,17 +4135,6 @@ class Visit { } } - goToSamePageAnchor() { - if (this.isSamePage) { - this.render(async () => { - this.cacheSnapshot(); - this.performScroll(); - this.changeHistory(); - this.adapter.visitRendered(this); - }); - } - } - // Fetch request delegate prepareRequest(request) { @@ -2633,9 +4196,6 @@ class Visit { } else { this.scrollToAnchor() || this.view.scrollToTop(); } - if (this.isSamePage) { - this.delegate.visitScrolledToSamePageLocation(this.view.lastRenderedLocation, this.location); - } this.scrolled = true; } @@ -2669,24 +4229,12 @@ class Visit { // Private - getHistoryMethodForAction(action) { - switch (action) { - case "replace": - return history.replaceState - case "advance": - case "restore": - return history.pushState - } - } - hasPreloadedResponse() { return typeof this.response == "object" } shouldIssueRequest() { - if (this.isSamePage) { - return false - } else if (this.action == "restore") { + if (this.action == "restore") { return !this.hasCachedSnapshot() } else { return this.willRender @@ -2702,7 +4250,10 @@ class Visit { async render(callback) { this.cancelRender(); - this.frame = await nextRepaint(); + await new Promise((resolve) => { + this.frame = + document.visibilityState === "hidden" ? setTimeout(() => resolve(), 0) : requestAnimationFrame(() => resolve()); + }); await callback(); delete this.frame; } @@ -2743,9 +4294,10 @@ class BrowserAdapter { visitStarted(visit) { this.location = visit.location; + this.redirectedToLocation = null; + visit.loadCachedSnapshot(); visit.issueRequest(); - visit.goToSamePageAnchor(); } visitRequestStarted(visit) { @@ -2759,6 +4311,10 @@ class BrowserAdapter { visitRequestCompleted(visit) { visit.loadResponse(); + + if (visit.response.redirected) { + this.redirectedToLocation = visit.redirectedToLocation; + } } visitRequestFailedWithStatusCode(visit, statusCode) { @@ -2795,6 +4351,12 @@ class BrowserAdapter { visitRendered(_visit) {} + // Link prefetching + + linkPrefetchingIsEnabledForLocation(location) { + return true + } + // Form Submission Delegate formSubmissionStarted(_formSubmission) { @@ -2842,7 +4404,7 @@ class BrowserAdapter { reload(reason) { dispatch("turbo:reload", { detail: reason }); - window.location.href = this.location?.toString() || window.location.href; + window.location.href = (this.redirectedToLocation || this.location)?.toString() || window.location.href; } get navigator() { @@ -2852,7 +4414,6 @@ class BrowserAdapter { class CacheObserver { selector = "[data-turbo-temporary]" - deprecatedSelector = "[data-turbo-cache=false]" started = false @@ -2877,19 +4438,7 @@ class CacheObserver { } get temporaryElements() { - return [...document.querySelectorAll(this.selector), ...this.temporaryElementsWithDeprecation] - } - - get temporaryElementsWithDeprecation() { - const elements = document.querySelectorAll(this.deprecatedSelector); - - if (elements.length) { - console.warn( - `The ${this.deprecatedSelector} selector is deprecated and will be removed in a future version. Use ${this.selector} instead.` - ); - } - - return [...elements] + return [...document.querySelectorAll(this.selector)] } } @@ -2979,7 +4528,6 @@ class History { restorationIdentifier = uuid() restorationData = {} started = false - pageLoaded = false currentIndex = 0 constructor(delegate) { @@ -2989,7 +4537,6 @@ class History { start() { if (!this.started) { addEventListener("popstate", this.onPopState, false); - addEventListener("load", this.onPageLoad, false); this.currentIndex = history.state?.turbo?.restorationIndex || 0; this.started = true; this.replace(new URL(window.location.href)); @@ -2999,7 +4546,6 @@ class History { stop() { if (this.started) { removeEventListener("popstate", this.onPopState, false); - removeEventListener("load", this.onPageLoad, false); this.started = false; } } @@ -3055,34 +4601,20 @@ class History { // Event handlers onPopState = (event) => { - if (this.shouldHandlePopState()) { - const { turbo } = event.state || {}; - if (turbo) { - this.location = new URL(window.location.href); - const { restorationIdentifier, restorationIndex } = turbo; - this.restorationIdentifier = restorationIdentifier; - const direction = restorationIndex > this.currentIndex ? "forward" : "back"; - this.delegate.historyPoppedToLocationWithRestorationIdentifierAndDirection(this.location, restorationIdentifier, direction); - this.currentIndex = restorationIndex; - } + const { turbo } = event.state || {}; + this.location = new URL(window.location.href); + + if (turbo) { + const { restorationIdentifier, restorationIndex } = turbo; + this.restorationIdentifier = restorationIdentifier; + const direction = restorationIndex > this.currentIndex ? "forward" : "back"; + this.delegate.historyPoppedToLocationWithRestorationIdentifierAndDirection(this.location, restorationIdentifier, direction); + this.currentIndex = restorationIndex; + } else { + this.currentIndex++; + this.delegate.historyPoppedWithEmptyState(this.location); } } - - onPageLoad = async (_event) => { - await nextMicrotask(); - this.pageLoaded = true; - } - - // Private - - shouldHandlePopState() { - // Safari dispatches a popstate event after window's load event, ignore it - return this.pageIsLoaded() - } - - pageIsLoaded() { - return this.pageLoaded || document.readyState == "complete" - } } class LinkPrefetchObserver { @@ -3155,7 +4687,9 @@ class LinkPrefetchObserver { target ); - prefetchCache.setLater(location.toString(), fetchRequest, this.#cacheTtl); + fetchRequest.fetchOptions.priority = "low"; + + prefetchCache.putLater(location, fetchRequest, this.#cacheTtl); } } } @@ -3171,7 +4705,7 @@ class LinkPrefetchObserver { #tryToUsePrefetchedRequest = (event) => { if (event.target.tagName !== "FORM" && event.detail.fetchOptions.method === "GET") { - const cached = prefetchCache.get(event.detail.url.toString()); + const cached = prefetchCache.get(event.detail.url); if (cached) { // User clicked link, use cache response @@ -3361,7 +4895,7 @@ class Navigator { } else { await this.view.renderPage(snapshot, false, true, this.currentVisit); } - if(!snapshot.shouldPreserveScrollPosition) { + if (snapshot.refreshScroll !== "preserve") { this.view.scrollToTop(); } this.view.clearSnapshotCache(); @@ -3379,6 +4913,17 @@ class Navigator { } } + // Link prefetching + + linkPrefetchingIsEnabledForLocation(location) { + // Not all adapters implement linkPrefetchingIsEnabledForLocation + if (typeof this.adapter.linkPrefetchingIsEnabledForLocation === "function") { + return this.adapter.linkPrefetchingIsEnabledForLocation(location) + } + + return true + } + // Visit delegate visitStarted(visit) { @@ -3390,20 +4935,10 @@ class Navigator { delete this.currentVisit; } + // Same-page links are no longer handled with a Visit. + // This method is still needed for Turbo Native adapters. locationWithActionIsSamePage(location, action) { - const anchor = getAnchor(location); - const currentAnchor = getAnchor(this.view.lastRenderedLocation); - const isRestorationToTop = action === "restore" && typeof anchor === "undefined"; - - return ( - action !== "replace" && - getRequestURL(location) === getRequestURL(this.view.lastRenderedLocation) && - (isRestorationToTop || (anchor != null && anchor !== currentAnchor)) - ) - } - - visitScrolledToSamePageLocation(oldURL, newURL) { - this.delegate.visitScrolledToSamePageLocation(oldURL, newURL); + return false } // Visits @@ -3737,914 +5272,6 @@ class ErrorRenderer extends Renderer { } } -// base IIFE to define idiomorph -var Idiomorph = (function () { - - //============================================================================= - // AND NOW IT BEGINS... - //============================================================================= - let EMPTY_SET = new Set(); - - // default configuration values, updatable by users now - let defaults = { - morphStyle: "outerHTML", - callbacks : { - beforeNodeAdded: noOp, - afterNodeAdded: noOp, - beforeNodeMorphed: noOp, - afterNodeMorphed: noOp, - beforeNodeRemoved: noOp, - afterNodeRemoved: noOp, - beforeAttributeUpdated: noOp, - - }, - head: { - style: 'merge', - shouldPreserve: function (elt) { - return elt.getAttribute("im-preserve") === "true"; - }, - shouldReAppend: function (elt) { - return elt.getAttribute("im-re-append") === "true"; - }, - shouldRemove: noOp, - afterHeadMorphed: noOp, - } - }; - - //============================================================================= - // Core Morphing Algorithm - morph, morphNormalizedContent, morphOldNodeTo, morphChildren - //============================================================================= - function morph(oldNode, newContent, config = {}) { - - if (oldNode instanceof Document) { - oldNode = oldNode.documentElement; - } - - if (typeof newContent === 'string') { - newContent = parseContent(newContent); - } - - let normalizedContent = normalizeContent(newContent); - - let ctx = createMorphContext(oldNode, normalizedContent, config); - - return morphNormalizedContent(oldNode, normalizedContent, ctx); - } - - function morphNormalizedContent(oldNode, normalizedNewContent, ctx) { - if (ctx.head.block) { - let oldHead = oldNode.querySelector('head'); - let newHead = normalizedNewContent.querySelector('head'); - if (oldHead && newHead) { - let promises = handleHeadElement(newHead, oldHead, ctx); - // when head promises resolve, call morph again, ignoring the head tag - Promise.all(promises).then(function () { - morphNormalizedContent(oldNode, normalizedNewContent, Object.assign(ctx, { - head: { - block: false, - ignore: true - } - })); - }); - return; - } - } - - if (ctx.morphStyle === "innerHTML") { - - // innerHTML, so we are only updating the children - morphChildren(normalizedNewContent, oldNode, ctx); - return oldNode.children; - - } else if (ctx.morphStyle === "outerHTML" || ctx.morphStyle == null) { - // otherwise find the best element match in the new content, morph that, and merge its siblings - // into either side of the best match - let bestMatch = findBestNodeMatch(normalizedNewContent, oldNode, ctx); - - // stash the siblings that will need to be inserted on either side of the best match - let previousSibling = bestMatch?.previousSibling; - let nextSibling = bestMatch?.nextSibling; - - // morph it - let morphedNode = morphOldNodeTo(oldNode, bestMatch, ctx); - - if (bestMatch) { - // if there was a best match, merge the siblings in too and return the - // whole bunch - return insertSiblings(previousSibling, morphedNode, nextSibling); - } else { - // otherwise nothing was added to the DOM - return [] - } - } else { - throw "Do not understand how to morph style " + ctx.morphStyle; - } - } - - - /** - * @param possibleActiveElement - * @param ctx - * @returns {boolean} - */ - function ignoreValueOfActiveElement(possibleActiveElement, ctx) { - return ctx.ignoreActiveValue && possibleActiveElement === document.activeElement && possibleActiveElement !== document.body; - } - - /** - * @param oldNode root node to merge content into - * @param newContent new content to merge - * @param ctx the merge context - * @returns {Element} the element that ended up in the DOM - */ - function morphOldNodeTo(oldNode, newContent, ctx) { - if (ctx.ignoreActive && oldNode === document.activeElement) ; else if (newContent == null) { - if (ctx.callbacks.beforeNodeRemoved(oldNode) === false) return oldNode; - - oldNode.remove(); - ctx.callbacks.afterNodeRemoved(oldNode); - return null; - } else if (!isSoftMatch(oldNode, newContent)) { - if (ctx.callbacks.beforeNodeRemoved(oldNode) === false) return oldNode; - if (ctx.callbacks.beforeNodeAdded(newContent) === false) return oldNode; - - oldNode.parentElement.replaceChild(newContent, oldNode); - ctx.callbacks.afterNodeAdded(newContent); - ctx.callbacks.afterNodeRemoved(oldNode); - return newContent; - } else { - if (ctx.callbacks.beforeNodeMorphed(oldNode, newContent) === false) return oldNode; - - if (oldNode instanceof HTMLHeadElement && ctx.head.ignore) ; else if (oldNode instanceof HTMLHeadElement && ctx.head.style !== "morph") { - handleHeadElement(newContent, oldNode, ctx); - } else { - syncNodeFrom(newContent, oldNode, ctx); - if (!ignoreValueOfActiveElement(oldNode, ctx)) { - morphChildren(newContent, oldNode, ctx); - } - } - ctx.callbacks.afterNodeMorphed(oldNode, newContent); - return oldNode; - } - } - - /** - * This is the core algorithm for matching up children. The idea is to use id sets to try to match up - * nodes as faithfully as possible. We greedily match, which allows us to keep the algorithm fast, but - * by using id sets, we are able to better match up with content deeper in the DOM. - * - * Basic algorithm is, for each node in the new content: - * - * - if we have reached the end of the old parent, append the new content - * - if the new content has an id set match with the current insertion point, morph - * - search for an id set match - * - if id set match found, morph - * - otherwise search for a "soft" match - * - if a soft match is found, morph - * - otherwise, prepend the new node before the current insertion point - * - * The two search algorithms terminate if competing node matches appear to outweigh what can be achieved - * with the current node. See findIdSetMatch() and findSoftMatch() for details. - * - * @param {Element} newParent the parent element of the new content - * @param {Element } oldParent the old content that we are merging the new content into - * @param ctx the merge context - */ - function morphChildren(newParent, oldParent, ctx) { - - let nextNewChild = newParent.firstChild; - let insertionPoint = oldParent.firstChild; - let newChild; - - // run through all the new content - while (nextNewChild) { - - newChild = nextNewChild; - nextNewChild = newChild.nextSibling; - - // if we are at the end of the exiting parent's children, just append - if (insertionPoint == null) { - if (ctx.callbacks.beforeNodeAdded(newChild) === false) return; - - oldParent.appendChild(newChild); - ctx.callbacks.afterNodeAdded(newChild); - removeIdsFromConsideration(ctx, newChild); - continue; - } - - // if the current node has an id set match then morph - if (isIdSetMatch(newChild, insertionPoint, ctx)) { - morphOldNodeTo(insertionPoint, newChild, ctx); - insertionPoint = insertionPoint.nextSibling; - removeIdsFromConsideration(ctx, newChild); - continue; - } - - // otherwise search forward in the existing old children for an id set match - let idSetMatch = findIdSetMatch(newParent, oldParent, newChild, insertionPoint, ctx); - - // if we found a potential match, remove the nodes until that point and morph - if (idSetMatch) { - insertionPoint = removeNodesBetween(insertionPoint, idSetMatch, ctx); - morphOldNodeTo(idSetMatch, newChild, ctx); - removeIdsFromConsideration(ctx, newChild); - continue; - } - - // no id set match found, so scan forward for a soft match for the current node - let softMatch = findSoftMatch(newParent, oldParent, newChild, insertionPoint, ctx); - - // if we found a soft match for the current node, morph - if (softMatch) { - insertionPoint = removeNodesBetween(insertionPoint, softMatch, ctx); - morphOldNodeTo(softMatch, newChild, ctx); - removeIdsFromConsideration(ctx, newChild); - continue; - } - - // abandon all hope of morphing, just insert the new child before the insertion point - // and move on - if (ctx.callbacks.beforeNodeAdded(newChild) === false) return; - - oldParent.insertBefore(newChild, insertionPoint); - ctx.callbacks.afterNodeAdded(newChild); - removeIdsFromConsideration(ctx, newChild); - } - - // remove any remaining old nodes that didn't match up with new content - while (insertionPoint !== null) { - - let tempNode = insertionPoint; - insertionPoint = insertionPoint.nextSibling; - removeNode(tempNode, ctx); - } - } - - //============================================================================= - // Attribute Syncing Code - //============================================================================= - - /** - * @param attr {String} the attribute to be mutated - * @param to {Element} the element that is going to be updated - * @param updateType {("update"|"remove")} - * @param ctx the merge context - * @returns {boolean} true if the attribute should be ignored, false otherwise - */ - function ignoreAttribute(attr, to, updateType, ctx) { - if(attr === 'value' && ctx.ignoreActiveValue && to === document.activeElement){ - return true; - } - return ctx.callbacks.beforeAttributeUpdated(attr, to, updateType) === false; - } - - /** - * syncs a given node with another node, copying over all attributes and - * inner element state from the 'from' node to the 'to' node - * - * @param {Element} from the element to copy attributes & state from - * @param {Element} to the element to copy attributes & state to - * @param ctx the merge context - */ - function syncNodeFrom(from, to, ctx) { - let type = from.nodeType; - - // if is an element type, sync the attributes from the - // new node into the new node - if (type === 1 /* element type */) { - const fromAttributes = from.attributes; - const toAttributes = to.attributes; - for (const fromAttribute of fromAttributes) { - if (ignoreAttribute(fromAttribute.name, to, 'update', ctx)) { - continue; - } - if (to.getAttribute(fromAttribute.name) !== fromAttribute.value) { - to.setAttribute(fromAttribute.name, fromAttribute.value); - } - } - // iterate backwards to avoid skipping over items when a delete occurs - for (let i = toAttributes.length - 1; 0 <= i; i--) { - const toAttribute = toAttributes[i]; - if (ignoreAttribute(toAttribute.name, to, 'remove', ctx)) { - continue; - } - if (!from.hasAttribute(toAttribute.name)) { - to.removeAttribute(toAttribute.name); - } - } - } - - // sync text nodes - if (type === 8 /* comment */ || type === 3 /* text */) { - if (to.nodeValue !== from.nodeValue) { - to.nodeValue = from.nodeValue; - } - } - - if (!ignoreValueOfActiveElement(to, ctx)) { - // sync input values - syncInputValue(from, to, ctx); - } - } - - /** - * @param from {Element} element to sync the value from - * @param to {Element} element to sync the value to - * @param attributeName {String} the attribute name - * @param ctx the merge context - */ - function syncBooleanAttribute(from, to, attributeName, ctx) { - if (from[attributeName] !== to[attributeName]) { - let ignoreUpdate = ignoreAttribute(attributeName, to, 'update', ctx); - if (!ignoreUpdate) { - to[attributeName] = from[attributeName]; - } - if (from[attributeName]) { - if (!ignoreUpdate) { - to.setAttribute(attributeName, from[attributeName]); - } - } else { - if (!ignoreAttribute(attributeName, to, 'remove', ctx)) { - to.removeAttribute(attributeName); - } - } - } - } - - /** - * NB: many bothans died to bring us information: - * - * https://github.com/patrick-steele-idem/morphdom/blob/master/src/specialElHandlers.js - * https://github.com/choojs/nanomorph/blob/master/lib/morph.jsL113 - * - * @param from {Element} the element to sync the input value from - * @param to {Element} the element to sync the input value to - * @param ctx the merge context - */ - function syncInputValue(from, to, ctx) { - if (from instanceof HTMLInputElement && - to instanceof HTMLInputElement && - from.type !== 'file') { - - let fromValue = from.value; - let toValue = to.value; - - // sync boolean attributes - syncBooleanAttribute(from, to, 'checked', ctx); - syncBooleanAttribute(from, to, 'disabled', ctx); - - if (!from.hasAttribute('value')) { - if (!ignoreAttribute('value', to, 'remove', ctx)) { - to.value = ''; - to.removeAttribute('value'); - } - } else if (fromValue !== toValue) { - if (!ignoreAttribute('value', to, 'update', ctx)) { - to.setAttribute('value', fromValue); - to.value = fromValue; - } - } - } else if (from instanceof HTMLOptionElement) { - syncBooleanAttribute(from, to, 'selected', ctx); - } else if (from instanceof HTMLTextAreaElement && to instanceof HTMLTextAreaElement) { - let fromValue = from.value; - let toValue = to.value; - if (ignoreAttribute('value', to, 'update', ctx)) { - return; - } - if (fromValue !== toValue) { - to.value = fromValue; - } - if (to.firstChild && to.firstChild.nodeValue !== fromValue) { - to.firstChild.nodeValue = fromValue; - } - } - } - - //============================================================================= - // the HEAD tag can be handled specially, either w/ a 'merge' or 'append' style - //============================================================================= - function handleHeadElement(newHeadTag, currentHead, ctx) { - - let added = []; - let removed = []; - let preserved = []; - let nodesToAppend = []; - - let headMergeStyle = ctx.head.style; - - // put all new head elements into a Map, by their outerHTML - let srcToNewHeadNodes = new Map(); - for (const newHeadChild of newHeadTag.children) { - srcToNewHeadNodes.set(newHeadChild.outerHTML, newHeadChild); - } - - // for each elt in the current head - for (const currentHeadElt of currentHead.children) { - - // If the current head element is in the map - let inNewContent = srcToNewHeadNodes.has(currentHeadElt.outerHTML); - let isReAppended = ctx.head.shouldReAppend(currentHeadElt); - let isPreserved = ctx.head.shouldPreserve(currentHeadElt); - if (inNewContent || isPreserved) { - if (isReAppended) { - // remove the current version and let the new version replace it and re-execute - removed.push(currentHeadElt); - } else { - // this element already exists and should not be re-appended, so remove it from - // the new content map, preserving it in the DOM - srcToNewHeadNodes.delete(currentHeadElt.outerHTML); - preserved.push(currentHeadElt); - } - } else { - if (headMergeStyle === "append") { - // we are appending and this existing element is not new content - // so if and only if it is marked for re-append do we do anything - if (isReAppended) { - removed.push(currentHeadElt); - nodesToAppend.push(currentHeadElt); - } - } else { - // if this is a merge, we remove this content since it is not in the new head - if (ctx.head.shouldRemove(currentHeadElt) !== false) { - removed.push(currentHeadElt); - } - } - } - } - - // Push the remaining new head elements in the Map into the - // nodes to append to the head tag - nodesToAppend.push(...srcToNewHeadNodes.values()); - - let promises = []; - for (const newNode of nodesToAppend) { - let newElt = document.createRange().createContextualFragment(newNode.outerHTML).firstChild; - if (ctx.callbacks.beforeNodeAdded(newElt) !== false) { - if (newElt.href || newElt.src) { - let resolve = null; - let promise = new Promise(function (_resolve) { - resolve = _resolve; - }); - newElt.addEventListener('load', function () { - resolve(); - }); - promises.push(promise); - } - currentHead.appendChild(newElt); - ctx.callbacks.afterNodeAdded(newElt); - added.push(newElt); - } - } - - // remove all removed elements, after we have appended the new elements to avoid - // additional network requests for things like style sheets - for (const removedElement of removed) { - if (ctx.callbacks.beforeNodeRemoved(removedElement) !== false) { - currentHead.removeChild(removedElement); - ctx.callbacks.afterNodeRemoved(removedElement); - } - } - - ctx.head.afterHeadMorphed(currentHead, {added: added, kept: preserved, removed: removed}); - return promises; - } - - function noOp() { - } - - /* - Deep merges the config object and the Idiomoroph.defaults object to - produce a final configuration object - */ - function mergeDefaults(config) { - let finalConfig = {}; - // copy top level stuff into final config - Object.assign(finalConfig, defaults); - Object.assign(finalConfig, config); - - // copy callbacks into final config (do this to deep merge the callbacks) - finalConfig.callbacks = {}; - Object.assign(finalConfig.callbacks, defaults.callbacks); - Object.assign(finalConfig.callbacks, config.callbacks); - - // copy head config into final config (do this to deep merge the head) - finalConfig.head = {}; - Object.assign(finalConfig.head, defaults.head); - Object.assign(finalConfig.head, config.head); - return finalConfig; - } - - function createMorphContext(oldNode, newContent, config) { - config = mergeDefaults(config); - return { - target: oldNode, - newContent: newContent, - config: config, - morphStyle: config.morphStyle, - ignoreActive: config.ignoreActive, - ignoreActiveValue: config.ignoreActiveValue, - idMap: createIdMap(oldNode, newContent), - deadIds: new Set(), - callbacks: config.callbacks, - head: config.head - } - } - - function isIdSetMatch(node1, node2, ctx) { - if (node1 == null || node2 == null) { - return false; - } - if (node1.nodeType === node2.nodeType && node1.tagName === node2.tagName) { - if (node1.id !== "" && node1.id === node2.id) { - return true; - } else { - return getIdIntersectionCount(ctx, node1, node2) > 0; - } - } - return false; - } - - function isSoftMatch(node1, node2) { - if (node1 == null || node2 == null) { - return false; - } - return node1.nodeType === node2.nodeType && node1.tagName === node2.tagName - } - - function removeNodesBetween(startInclusive, endExclusive, ctx) { - while (startInclusive !== endExclusive) { - let tempNode = startInclusive; - startInclusive = startInclusive.nextSibling; - removeNode(tempNode, ctx); - } - removeIdsFromConsideration(ctx, endExclusive); - return endExclusive.nextSibling; - } - - //============================================================================= - // Scans forward from the insertionPoint in the old parent looking for a potential id match - // for the newChild. We stop if we find a potential id match for the new child OR - // if the number of potential id matches we are discarding is greater than the - // potential id matches for the new child - //============================================================================= - function findIdSetMatch(newContent, oldParent, newChild, insertionPoint, ctx) { - - // max id matches we are willing to discard in our search - let newChildPotentialIdCount = getIdIntersectionCount(ctx, newChild, oldParent); - - let potentialMatch = null; - - // only search forward if there is a possibility of an id match - if (newChildPotentialIdCount > 0) { - let potentialMatch = insertionPoint; - // if there is a possibility of an id match, scan forward - // keep track of the potential id match count we are discarding (the - // newChildPotentialIdCount must be greater than this to make it likely - // worth it) - let otherMatchCount = 0; - while (potentialMatch != null) { - - // If we have an id match, return the current potential match - if (isIdSetMatch(newChild, potentialMatch, ctx)) { - return potentialMatch; - } - - // computer the other potential matches of this new content - otherMatchCount += getIdIntersectionCount(ctx, potentialMatch, newContent); - if (otherMatchCount > newChildPotentialIdCount) { - // if we have more potential id matches in _other_ content, we - // do not have a good candidate for an id match, so return null - return null; - } - - // advanced to the next old content child - potentialMatch = potentialMatch.nextSibling; - } - } - return potentialMatch; - } - - //============================================================================= - // Scans forward from the insertionPoint in the old parent looking for a potential soft match - // for the newChild. We stop if we find a potential soft match for the new child OR - // if we find a potential id match in the old parents children OR if we find two - // potential soft matches for the next two pieces of new content - //============================================================================= - function findSoftMatch(newContent, oldParent, newChild, insertionPoint, ctx) { - - let potentialSoftMatch = insertionPoint; - let nextSibling = newChild.nextSibling; - let siblingSoftMatchCount = 0; - - while (potentialSoftMatch != null) { - - if (getIdIntersectionCount(ctx, potentialSoftMatch, newContent) > 0) { - // the current potential soft match has a potential id set match with the remaining new - // content so bail out of looking - return null; - } - - // if we have a soft match with the current node, return it - if (isSoftMatch(newChild, potentialSoftMatch)) { - return potentialSoftMatch; - } - - if (isSoftMatch(nextSibling, potentialSoftMatch)) { - // the next new node has a soft match with this node, so - // increment the count of future soft matches - siblingSoftMatchCount++; - nextSibling = nextSibling.nextSibling; - - // If there are two future soft matches, bail to allow the siblings to soft match - // so that we don't consume future soft matches for the sake of the current node - if (siblingSoftMatchCount >= 2) { - return null; - } - } - - // advanced to the next old content child - potentialSoftMatch = potentialSoftMatch.nextSibling; - } - - return potentialSoftMatch; - } - - function parseContent(newContent) { - let parser = new DOMParser(); - - // remove svgs to avoid false-positive matches on head, etc. - let contentWithSvgsRemoved = newContent.replace(/]*>|>)([\s\S]*?)<\/svg>/gim, ''); - - // if the newContent contains a html, head or body tag, we can simply parse it w/o wrapping - if (contentWithSvgsRemoved.match(/<\/html>/) || contentWithSvgsRemoved.match(/<\/head>/) || contentWithSvgsRemoved.match(/<\/body>/)) { - let content = parser.parseFromString(newContent, "text/html"); - // if it is a full HTML document, return the document itself as the parent container - if (contentWithSvgsRemoved.match(/<\/html>/)) { - content.generatedByIdiomorph = true; - return content; - } else { - // otherwise return the html element as the parent container - let htmlElement = content.firstChild; - if (htmlElement) { - htmlElement.generatedByIdiomorph = true; - return htmlElement; - } else { - return null; - } - } - } else { - // if it is partial HTML, wrap it in a template tag to provide a parent element and also to help - // deal with touchy tags like tr, tbody, etc. - let responseDoc = parser.parseFromString("", "text/html"); - let content = responseDoc.body.querySelector('template').content; - content.generatedByIdiomorph = true; - return content - } - } - - function normalizeContent(newContent) { - if (newContent == null) { - // noinspection UnnecessaryLocalVariableJS - const dummyParent = document.createElement('div'); - return dummyParent; - } else if (newContent.generatedByIdiomorph) { - // the template tag created by idiomorph parsing can serve as a dummy parent - return newContent; - } else if (newContent instanceof Node) { - // a single node is added as a child to a dummy parent - const dummyParent = document.createElement('div'); - dummyParent.append(newContent); - return dummyParent; - } else { - // all nodes in the array or HTMLElement collection are consolidated under - // a single dummy parent element - const dummyParent = document.createElement('div'); - for (const elt of [...newContent]) { - dummyParent.append(elt); - } - return dummyParent; - } - } - - function insertSiblings(previousSibling, morphedNode, nextSibling) { - let stack = []; - let added = []; - while (previousSibling != null) { - stack.push(previousSibling); - previousSibling = previousSibling.previousSibling; - } - while (stack.length > 0) { - let node = stack.pop(); - added.push(node); // push added preceding siblings on in order and insert - morphedNode.parentElement.insertBefore(node, morphedNode); - } - added.push(morphedNode); - while (nextSibling != null) { - stack.push(nextSibling); - added.push(nextSibling); // here we are going in order, so push on as we scan, rather than add - nextSibling = nextSibling.nextSibling; - } - while (stack.length > 0) { - morphedNode.parentElement.insertBefore(stack.pop(), morphedNode.nextSibling); - } - return added; - } - - function findBestNodeMatch(newContent, oldNode, ctx) { - let currentElement; - currentElement = newContent.firstChild; - let bestElement = currentElement; - let score = 0; - while (currentElement) { - let newScore = scoreElement(currentElement, oldNode, ctx); - if (newScore > score) { - bestElement = currentElement; - score = newScore; - } - currentElement = currentElement.nextSibling; - } - return bestElement; - } - - function scoreElement(node1, node2, ctx) { - if (isSoftMatch(node1, node2)) { - return .5 + getIdIntersectionCount(ctx, node1, node2); - } - return 0; - } - - function removeNode(tempNode, ctx) { - removeIdsFromConsideration(ctx, tempNode); - if (ctx.callbacks.beforeNodeRemoved(tempNode) === false) return; - - tempNode.remove(); - ctx.callbacks.afterNodeRemoved(tempNode); - } - - //============================================================================= - // ID Set Functions - //============================================================================= - - function isIdInConsideration(ctx, id) { - return !ctx.deadIds.has(id); - } - - function idIsWithinNode(ctx, id, targetNode) { - let idSet = ctx.idMap.get(targetNode) || EMPTY_SET; - return idSet.has(id); - } - - function removeIdsFromConsideration(ctx, node) { - let idSet = ctx.idMap.get(node) || EMPTY_SET; - for (const id of idSet) { - ctx.deadIds.add(id); - } - } - - function getIdIntersectionCount(ctx, node1, node2) { - let sourceSet = ctx.idMap.get(node1) || EMPTY_SET; - let matchCount = 0; - for (const id of sourceSet) { - // a potential match is an id in the source and potentialIdsSet, but - // that has not already been merged into the DOM - if (isIdInConsideration(ctx, id) && idIsWithinNode(ctx, id, node2)) { - ++matchCount; - } - } - return matchCount; - } - - /** - * A bottom up algorithm that finds all elements with ids inside of the node - * argument and populates id sets for those nodes and all their parents, generating - * a set of ids contained within all nodes for the entire hierarchy in the DOM - * - * @param node {Element} - * @param {Map>} idMap - */ - function populateIdMapForNode(node, idMap) { - let nodeParent = node.parentElement; - // find all elements with an id property - let idElements = node.querySelectorAll('[id]'); - for (const elt of idElements) { - let current = elt; - // walk up the parent hierarchy of that element, adding the id - // of element to the parent's id set - while (current !== nodeParent && current != null) { - let idSet = idMap.get(current); - // if the id set doesn't exist, create it and insert it in the map - if (idSet == null) { - idSet = new Set(); - idMap.set(current, idSet); - } - idSet.add(elt.id); - current = current.parentElement; - } - } - } - - /** - * This function computes a map of nodes to all ids contained within that node (inclusive of the - * node). This map can be used to ask if two nodes have intersecting sets of ids, which allows - * for a looser definition of "matching" than tradition id matching, and allows child nodes - * to contribute to a parent nodes matching. - * - * @param {Element} oldContent the old content that will be morphed - * @param {Element} newContent the new content to morph to - * @returns {Map>} a map of nodes to id sets for the - */ - function createIdMap(oldContent, newContent) { - let idMap = new Map(); - populateIdMapForNode(oldContent, idMap); - populateIdMapForNode(newContent, idMap); - return idMap; - } - - //============================================================================= - // This is what ends up becoming the Idiomorph global object - //============================================================================= - return { - morph, - defaults - } - })(); - -function morphElements(currentElement, newElement, { callbacks, ...options } = {}) { - Idiomorph.morph(currentElement, newElement, { - ...options, - callbacks: new DefaultIdiomorphCallbacks(callbacks) - }); -} - -function morphChildren(currentElement, newElement) { - morphElements(currentElement, newElement.children, { - morphStyle: "innerHTML" - }); -} - -class DefaultIdiomorphCallbacks { - #beforeNodeMorphed - - constructor({ beforeNodeMorphed } = {}) { - this.#beforeNodeMorphed = beforeNodeMorphed || (() => true); - } - - beforeNodeAdded = (node) => { - return !(node.id && node.hasAttribute("data-turbo-permanent") && document.getElementById(node.id)) - } - - beforeNodeMorphed = (currentElement, newElement) => { - if (currentElement instanceof Element) { - if (!currentElement.hasAttribute("data-turbo-permanent") && this.#beforeNodeMorphed(currentElement, newElement)) { - const event = dispatch("turbo:before-morph-element", { - cancelable: true, - target: currentElement, - detail: { currentElement, newElement } - }); - - return !event.defaultPrevented - } else { - return false - } - } - } - - beforeAttributeUpdated = (attributeName, target, mutationType) => { - const event = dispatch("turbo:before-morph-attribute", { - cancelable: true, - target, - detail: { attributeName, mutationType } - }); - - return !event.defaultPrevented - } - - beforeNodeRemoved = (node) => { - return this.beforeNodeMorphed(node) - } - - afterNodeMorphed = (currentElement, newElement) => { - if (currentElement instanceof Element) { - dispatch("turbo:morph-element", { - target: currentElement, - detail: { currentElement, newElement } - }); - } - } -} - -class MorphingFrameRenderer extends FrameRenderer { - static renderElement(currentElement, newElement) { - dispatch("turbo:before-frame-morph", { - target: currentElement, - detail: { currentElement, newElement } - }); - - morphChildren(currentElement, newElement); - } -} - class PageRenderer extends Renderer { static renderElement(currentElement, newElement) { if (document.body && newElement instanceof HTMLBodyElement) { @@ -4704,13 +5331,18 @@ class PageRenderer extends Renderer { #setLanguage() { const { documentElement } = this.currentSnapshot; - const { lang } = this.newSnapshot; + const { dir, lang } = this.newSnapshot; if (lang) { documentElement.setAttribute("lang", lang); } else { documentElement.removeAttribute("lang"); } + if (dir) { + documentElement.setAttribute("dir", dir); + } else { + documentElement.removeAttribute("dir"); + } } async mergeHead() { @@ -4812,9 +5444,16 @@ class PageRenderer extends Renderer { activateNewBody() { document.adoptNode(this.newElement); + this.removeNoscriptElements(); this.activateNewBodyScriptElements(); } + removeNoscriptElements() { + for (const noscriptElement of this.newElement.querySelectorAll("noscript")) { + noscriptElement.remove(); + } + } + activateNewBodyScriptElements() { for (const inertScriptElement of this.newBodyScriptElements) { const activatedScriptElement = activateScriptElement(inertScriptElement); @@ -4861,14 +5500,19 @@ class MorphingPageRenderer extends PageRenderer { static renderElement(currentElement, newElement) { morphElements(currentElement, newElement, { callbacks: { - beforeNodeMorphed: element => !canRefreshFrame(element) + beforeNodeMorphed: (node, newNode) => { + if ( + shouldRefreshFrameWithMorphing(node, newNode) && + !closestFrameReloadableWithMorphing(node) + ) { + node.reload(); + return false + } + return true + } } }); - for (const frame of currentElement.querySelectorAll("turbo-frame")) { - if (canRefreshFrame(frame)) refreshFrame(frame); - } - dispatch("turbo:morph", { detail: { currentElement, newElement } }); } @@ -4885,73 +5529,13 @@ class MorphingPageRenderer extends PageRenderer { } } -function canRefreshFrame(frame) { - return frame instanceof FrameElement && - frame.src && - frame.refresh === "morph" && - !frame.closest("[data-turbo-permanent]") -} - -function refreshFrame(frame) { - frame.addEventListener("turbo:before-frame-render", ({ detail }) => { - detail.render = MorphingFrameRenderer.renderElement; - }, { once: true }); - - frame.reload(); -} - -class SnapshotCache { - keys = [] - snapshots = {} - +class SnapshotCache extends LRUCache { constructor(size) { - this.size = size; + super(size, toCacheKey); } - has(location) { - return toCacheKey(location) in this.snapshots - } - - get(location) { - if (this.has(location)) { - const snapshot = this.read(location); - this.touch(location); - return snapshot - } - } - - put(location, snapshot) { - this.write(location, snapshot); - this.touch(location); - return snapshot - } - - clear() { - this.snapshots = {}; - } - - // Private - - read(location) { - return this.snapshots[toCacheKey(location)] - } - - write(location, snapshot) { - this.snapshots[toCacheKey(location)] = snapshot; - } - - touch(location) { - const key = toCacheKey(location); - const index = this.keys.indexOf(key); - if (index > -1) this.keys.splice(index, 1); - this.keys.unshift(key); - this.trim(); - } - - trim() { - for (const key of this.keys.splice(this.size)) { - delete this.snapshots[key]; - } + get snapshots() { + return this.entries } } @@ -4965,10 +5549,10 @@ class PageView extends View { } renderPage(snapshot, isPreview = false, willRender = true, visit) { - const shouldMorphPage = this.isPageRefresh(visit) && this.snapshot.shouldMorphPage; + const shouldMorphPage = this.isPageRefresh(visit) && (visit?.refresh?.method || this.snapshot.refreshMethod) === "morph"; const rendererClass = shouldMorphPage ? MorphingPageRenderer : PageRenderer; - const renderer = new rendererClass(this.snapshot, snapshot, rendererClass.renderElement, isPreview, willRender); + const renderer = new rendererClass(this.snapshot, snapshot, isPreview, willRender); if (!renderer.shouldRender) { this.forceReloaded = true; @@ -4981,7 +5565,7 @@ class PageView extends View { renderError(snapshot, visit) { visit?.changeHistory(); - const renderer = new ErrorRenderer(this.snapshot, snapshot, ErrorRenderer.renderElement, false); + const renderer = new ErrorRenderer(this.snapshot, snapshot, false); return this.render(renderer) } @@ -5009,7 +5593,7 @@ class PageView extends View { } shouldPreserveScrollPosition(visit) { - return this.isPageRefresh(visit) && this.snapshot.shouldPreserveScrollPosition + return this.isPageRefresh(visit) && (visit?.refresh?.scroll || this.snapshot.refreshScroll) === "preserve" } get snapshot() { @@ -5132,11 +5716,8 @@ class Session { streamMessageRenderer = new StreamMessageRenderer() cache = new Cache(this) - drive = true enabled = true - progressBarDelay = 500 started = false - formMode = "on" #pageRefreshDebouncePeriod = 150 constructor(recentRequests) { @@ -5202,10 +5783,14 @@ class Session { } } - refresh(url, requestId) { + refresh(url, options = {}) { + options = typeof options === "string" ? { requestId: options } : options; + + const { method, requestId, scroll } = options; const isRecentRequest = requestId && this.recentRequests.has(requestId); - if (!isRecentRequest && !this.navigator.currentVisit) { - this.visit(url, { action: "replace", shouldCacheSnapshot: false }); + const isCurrentUrl = url === document.baseURI; + if (!isRecentRequest && !this.navigator.currentVisit && isCurrentUrl) { + this.visit(url, { action: "replace", shouldCacheSnapshot: false, refresh: { method, scroll } }); } } @@ -5226,11 +5811,35 @@ class Session { } setProgressBarDelay(delay) { + console.warn( + "Please replace `session.setProgressBarDelay(delay)` with `session.progressBarDelay = delay`. The function is deprecated and will be removed in a future version of Turbo.`" + ); + this.progressBarDelay = delay; } - setFormMode(mode) { - this.formMode = mode; + set progressBarDelay(delay) { + config.drive.progressBarDelay = delay; + } + + get progressBarDelay() { + return config.drive.progressBarDelay + } + + set drive(value) { + config.drive.enabled = value; + } + + get drive() { + return config.drive.enabled + } + + set formMode(value) { + config.forms.mode = value; + } + + get formMode() { + return config.forms.mode } get location() { @@ -5285,6 +5894,12 @@ class Session { } } + historyPoppedWithEmptyState(location) { + this.history.replace(location); + this.view.lastRenderedLocation = location; + this.view.cacheSnapshot(); + } + // Scroll observer delegate scrollPositionChanged(position) { @@ -5304,7 +5919,8 @@ class Session { canPrefetchRequestToLocation(link, location) { return ( this.elementIsNavigatable(link) && - locationIsVisitable(location, this.snapshot.rootLocation) + locationIsVisitable(location, this.snapshot.rootLocation) && + this.navigator.linkPrefetchingIsEnabledForLocation(location) ) } @@ -5328,7 +5944,7 @@ class Session { // Navigator delegate allowsVisitingLocationWithAction(location, action) { - return this.locationWithActionIsSamePage(location, action) || this.applicationAllowsVisitingLocation(location) + return this.applicationAllowsVisitingLocation(location) } visitProposedToLocation(location, options) { @@ -5344,9 +5960,7 @@ class Session { this.view.markVisitDirection(visit.direction); } extendURLWithDeprecatedProperties(visit.location); - if (!visit.silent) { - this.notifyApplicationAfterVisitingLocation(visit.location, visit.action); - } + this.notifyApplicationAfterVisitingLocation(visit.location, visit.action); } visitCompleted(visit) { @@ -5355,14 +5969,6 @@ class Session { this.notifyApplicationAfterPageLoad(visit.getTimingMetrics()); } - locationWithActionIsSamePage(location, action) { - return this.navigator.locationWithActionIsSamePage(location, action) - } - - visitScrolledToSamePageLocation(oldURL, newURL) { - this.notifyApplicationAfterVisitingSamePageLocation(oldURL, newURL); - } - // Form submit observer delegate willSubmitForm(form, submitter) { @@ -5402,9 +6008,7 @@ class Session { // Page view delegate viewWillCacheSnapshot() { - if (!this.navigator.currentVisit?.silent) { - this.notifyApplicationBeforeCachingSnapshot(); - } + this.notifyApplicationBeforeCachingSnapshot(); } allowsImmediateRender({ element }, options) { @@ -5496,15 +6100,6 @@ class Session { }) } - notifyApplicationAfterVisitingSamePageLocation(oldURL, newURL) { - dispatchEvent( - new HashChangeEvent("hashchange", { - oldURL: oldURL.toString(), - newURL: newURL.toString() - }) - ); - } - notifyApplicationAfterFrameLoad(frame) { return dispatch("turbo:frame-load", { target: frame }) } @@ -5520,12 +6115,12 @@ class Session { // Helpers submissionIsNavigatable(form, submitter) { - if (this.formMode == "off") { + if (config.forms.mode == "off") { return false } else { const submitterIsNavigatable = submitter ? this.elementIsNavigatable(submitter) : true; - if (this.formMode == "optin") { + if (config.forms.mode == "optin") { return submitterIsNavigatable && form.closest('[data-turbo="true"]') != null } else { return submitterIsNavigatable && this.elementIsNavigatable(form) @@ -5538,7 +6133,7 @@ class Session { const withinFrame = findClosestRecursively(element, "turbo-frame"); // Check if Drive is enabled on the session or we're within a Frame. - if (this.drive || withinFrame) { + if (config.drive.enabled || withinFrame) { // Element is navigatable by default, unless `data-turbo="false"`. if (container) { return container.getAttribute("data-turbo") != "false" @@ -5590,7 +6185,9 @@ const deprecatedLocationPropertyDescriptors = { }; const session = new Session(recentRequests); -const { cache, navigator: navigator$1 } = session; + +// Rename `navigator` to avoid shadowing `window.navigator` +const { cache, navigator: sessionNavigator } = session; /** * Starts the main session. @@ -5656,19 +6253,6 @@ function renderStreamMessage(message) { session.renderStreamMessage(message); } -/** - * Removes all entries from the Turbo Drive page cache. - * Call this when state has changed on the server that may affect cached pages. - * - * @deprecated since version 7.2.0 in favor of `Turbo.cache.clear()` - */ -function clearCache() { - console.warn( - "Please replace `Turbo.clearCache()` with `Turbo.cache.clear()`. The top-level function is deprecated and will be removed in a future version of Turbo.`" - ); - session.clearCache(); -} - /** * Sets the delay after which the progress bar will appear during navigation. * @@ -5680,36 +6264,75 @@ function clearCache() { * @param delay Time to delay in milliseconds */ function setProgressBarDelay(delay) { - session.setProgressBarDelay(delay); + console.warn( + "Please replace `Turbo.setProgressBarDelay(delay)` with `Turbo.config.drive.progressBarDelay = delay`. The top-level function is deprecated and will be removed in a future version of Turbo.`" + ); + config.drive.progressBarDelay = delay; } function setConfirmMethod(confirmMethod) { - FormSubmission.confirmMethod = confirmMethod; + console.warn( + "Please replace `Turbo.setConfirmMethod(confirmMethod)` with `Turbo.config.forms.confirm = confirmMethod`. The top-level function is deprecated and will be removed in a future version of Turbo.`" + ); + config.forms.confirm = confirmMethod; } function setFormMode(mode) { - session.setFormMode(mode); + console.warn( + "Please replace `Turbo.setFormMode(mode)` with `Turbo.config.forms.mode = mode`. The top-level function is deprecated and will be removed in a future version of Turbo.`" + ); + config.forms.mode = mode; +} + +/** + * Morph the state of the currentBody based on the attributes and contents of + * the newBody. Morphing body elements may dispatch turbo:morph, + * turbo:before-morph-element, turbo:before-morph-attribute, and + * turbo:morph-element events. + * + * @param currentBody HTMLBodyElement destination of morphing changes + * @param newBody HTMLBodyElement source of morphing changes + */ +function morphBodyElements(currentBody, newBody) { + MorphingPageRenderer.renderElement(currentBody, newBody); +} + +/** + * Morph the child elements of the currentFrame based on the child elements of + * the newFrame. Morphing turbo-frame elements may dispatch turbo:before-frame-morph, + * turbo:before-morph-element, turbo:before-morph-attribute, and + * turbo:morph-element events. + * + * @param currentFrame FrameElement destination of morphing children changes + * @param newFrame FrameElement source of morphing children changes + */ +function morphTurboFrameElements(currentFrame, newFrame) { + MorphingFrameRenderer.renderElement(currentFrame, newFrame); } var Turbo = /*#__PURE__*/Object.freeze({ __proto__: null, - navigator: navigator$1, - session: session, - cache: cache, PageRenderer: PageRenderer, PageSnapshot: PageSnapshot, FrameRenderer: FrameRenderer, fetch: fetchWithTurboHeaders, + config: config, + session: session, + cache: cache, + navigator: sessionNavigator, start: start, registerAdapter: registerAdapter, visit: visit, connectStreamSource: connectStreamSource, disconnectStreamSource: disconnectStreamSource, renderStreamMessage: renderStreamMessage, - clearCache: clearCache, setProgressBarDelay: setProgressBarDelay, setConfirmMethod: setConfirmMethod, - setFormMode: setFormMode + setFormMode: setFormMode, + morphBodyElements: morphBodyElements, + morphTurboFrameElements: morphTurboFrameElements, + morphChildren: morphChildren, + morphElements: morphElements }); class TurboFrameMissingError extends Error {} @@ -5721,6 +6344,7 @@ class FrameController { #connected = false #hasBeenLoaded = false #ignoredAttributes = new Set() + #shouldMorphFrame = false action = null constructor(element) { @@ -5756,11 +6380,17 @@ class FrameController { this.formLinkClickObserver.stop(); this.linkInterceptor.stop(); this.formSubmitObserver.stop(); + + if (!this.element.hasAttribute("recurse")) { + this.#currentFetchRequest?.cancel(); + } } } disabledChanged() { - if (this.loadingStyle == FrameLoadingStyle.eager) { + if (this.disabled) { + this.#currentFetchRequest?.cancel(); + } else if (this.loadingStyle == FrameLoadingStyle.eager) { this.#loadSourceURL(); } } @@ -5768,6 +6398,10 @@ class FrameController { sourceURLChanged() { if (this.#isIgnoringChangesTo("src")) return + if (!this.sourceURL) { + this.#currentFetchRequest?.cancel(); + } + if (this.element.isConnected) { this.complete = false; } @@ -5778,7 +6412,10 @@ class FrameController { } sourceURLReloaded() { - const { src } = this.element; + const { refresh, src } = this.element; + + this.#shouldMorphFrame = src && refresh === "morph"; + this.element.removeAttribute("complete"); this.element.src = null; this.element.src = src; @@ -5821,6 +6458,7 @@ class FrameController { } } } finally { + this.#shouldMorphFrame = false; this.fetchResponseLoaded = () => Promise.resolve(); } } @@ -5865,15 +6503,18 @@ class FrameController { } this.formSubmission = new FormSubmission(this, element, submitter); + const { fetchRequest } = this.formSubmission; - this.prepareRequest(fetchRequest); + const frame = this.#findFrameElement(element, submitter); + + this.prepareRequest(fetchRequest, frame); this.formSubmission.start(); } // Fetch request delegate - prepareRequest(request) { - request.headers["Turbo-Frame"] = this.id; + prepareRequest(request, frame = this) { + request.headers["Turbo-Frame"] = frame.id; if (this.currentNavigationElement?.hasAttribute("data-turbo-stream")) { request.acceptResponseType(StreamMessage.contentType); @@ -5945,6 +6586,7 @@ class FrameController { detail: { newFrame, ...options }, cancelable: true }); + const { defaultPrevented, detail: { render } @@ -5985,10 +6627,11 @@ class FrameController { async #loadFrameResponse(fetchResponse, document) { const newFrameElement = await this.extractForeignFrameElement(document.body); + const rendererClass = this.#shouldMorphFrame ? MorphingFrameRenderer : FrameRenderer; if (newFrameElement) { const snapshot = new Snapshot(newFrameElement); - const renderer = new FrameRenderer(this, this.view.snapshot, snapshot, FrameRenderer.renderElement, false, false); + const renderer = new rendererClass(this, this.view.snapshot, snapshot, false, false); if (this.view.renderPromise) await this.view.renderPromise; this.changeHistory(); @@ -6113,7 +6756,9 @@ class FrameController { #findFrameElement(element, submitter) { const id = getAttribute("data-turbo-frame", submitter, element) || this.element.getAttribute("target"); - return getFrameElementById(id) ?? this.element + const target = this.#getFrameElementById(id); + + return target instanceof FrameElement ? target : this.element } async extractForeignFrameElement(container) { @@ -6157,9 +6802,11 @@ class FrameController { } if (id) { - const frameElement = getFrameElementById(id); + const frameElement = this.#getFrameElementById(id); if (frameElement) { return !frameElement.disabled + } else if (id == "_parent") { + return false } } @@ -6180,8 +6827,12 @@ class FrameController { return this.element.id } + get disabled() { + return this.element.disabled + } + get enabled() { - return !this.element.disabled + return !this.disabled } get sourceURL() { @@ -6241,13 +6892,15 @@ class FrameController { callback(); delete this.currentNavigationElement; } -} -function getFrameElementById(id) { - if (id != null) { - const element = document.getElementById(id); - if (element instanceof FrameElement) { - return element + #getFrameElementById(id) { + if (id != null) { + const element = id === "_parent" ? + this.element.parentElement.closest("turbo-frame") : + document.getElementById(id); + if (element instanceof FrameElement) { + return element + } } } } @@ -6272,6 +6925,7 @@ function activateElement(element, currentURL) { const StreamActions = { after() { + this.removeDuplicateTargetSiblings(); this.targetElements.forEach((e) => e.parentElement?.insertBefore(this.templateContent, e.nextSibling)); }, @@ -6281,6 +6935,7 @@ const StreamActions = { }, before() { + this.removeDuplicateTargetSiblings(); this.targetElements.forEach((e) => e.parentElement?.insertBefore(this.templateContent, e)); }, @@ -6319,7 +6974,11 @@ const StreamActions = { }, refresh() { - session.refresh(this.baseURI, this.requestId); + const method = this.getAttribute("method"); + const requestId = this.requestId; + const scroll = this.getAttribute("scroll"); + + session.refresh(this.baseURI, { method, requestId, scroll }); } }; @@ -6391,7 +7050,24 @@ class StreamElement extends HTMLElement { * Gets the list of duplicate children (i.e. those with the same ID) */ get duplicateChildren() { - const existingChildren = this.targetElements.flatMap((e) => [...e.children]).filter((c) => !!c.id); + const existingChildren = this.targetElements.flatMap((e) => [...e.children]).filter((c) => !!c.getAttribute("id")); + const newChildrenIds = [...(this.templateContent?.children || [])].filter((c) => !!c.getAttribute("id")).map((c) => c.getAttribute("id")); + + return existingChildren.filter((c) => newChildrenIds.includes(c.getAttribute("id"))) + } + + /** + * Removes duplicate siblings (by ID) + */ + removeDuplicateTargetSiblings() { + this.duplicateSiblings.forEach((c) => c.remove()); + } + + /** + * Gets the list of duplicate siblings (i.e. those with the same ID) + */ + get duplicateSiblings() { + const existingChildren = this.targetElements.flatMap((e) => [...e.parentElement.children]).filter((c) => !!c.id); const newChildrenIds = [...(this.templateContent?.children || [])].filter((c) => !!c.id).map((c) => c.id); return existingChildren.filter((c) => newChildrenIds.includes(c.id)) @@ -6548,11 +7224,11 @@ if (customElements.get("turbo-stream-source") === undefined) { } (() => { - let element = document.currentScript; - if (!element) return - if (element.hasAttribute("data-turbo-suppress-warning")) return + const scriptElement = document.currentScript; + if (!scriptElement) return + if (scriptElement.hasAttribute("data-turbo-suppress-warning")) return - element = element.parentElement; + let element = scriptElement.parentElement; while (element) { if (element == document.body) { return console.warn( @@ -6566,7 +7242,7 @@ if (customElements.get("turbo-stream-source") === undefined) { —— Suppress this warning by adding a "data-turbo-suppress-warning" attribute to: %s `, - element.outerHTML + scriptElement.outerHTML ) } @@ -6577,4 +7253,4 @@ if (customElements.get("turbo-stream-source") === undefined) { window.Turbo = { ...Turbo, StreamActions }; start(); -export { FetchEnctype, FetchMethod, FetchRequest, FetchResponse, FrameElement, FrameLoadingStyle, FrameRenderer, PageRenderer, PageSnapshot, StreamActions, StreamElement, StreamSourceElement, cache, clearCache, connectStreamSource, disconnectStreamSource, fetchWithTurboHeaders as fetch, fetchEnctypeFromString, fetchMethodFromString, isSafe, navigator$1 as navigator, registerAdapter, renderStreamMessage, session, setConfirmMethod, setFormMode, setProgressBarDelay, start, visit }; +export { FetchEnctype, FetchMethod, FetchRequest, FetchResponse, FrameElement, FrameLoadingStyle, FrameRenderer, PageRenderer, PageSnapshot, StreamActions, StreamElement, StreamSourceElement, cache, config, connectStreamSource, disconnectStreamSource, fetchWithTurboHeaders as fetch, fetchEnctypeFromString, fetchMethodFromString, isSafe, morphBodyElements, morphChildren, morphElements, morphTurboFrameElements, sessionNavigator as navigator, registerAdapter, renderStreamMessage, session, setConfirmMethod, setFormMode, setProgressBarDelay, start, visit }; diff --git a/node_modules/@hotwired/turbo/dist/turbo.es2017-umd.js b/node_modules/@hotwired/turbo/dist/turbo.es2017-umd.js index 6235611fd0..120ed1143f 100644 --- a/node_modules/@hotwired/turbo/dist/turbo.es2017-umd.js +++ b/node_modules/@hotwired/turbo/dist/turbo.es2017-umd.js @@ -1,6 +1,6 @@ /*! -Turbo 8.0.5 -Copyright © 2024 37signals LLC +Turbo 8.0.23 +Copyright © 2026 37signals LLC */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : @@ -8,103 +8,6 @@ Copyright © 2024 37signals LLC (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Turbo = {})); })(this, (function (exports) { 'use strict'; - /** - * The MIT License (MIT) - * - * Copyright (c) 2019 Javan Makhmali - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - - (function (prototype) { - if (typeof prototype.requestSubmit == "function") return - - prototype.requestSubmit = function (submitter) { - if (submitter) { - validateSubmitter(submitter, this); - submitter.click(); - } else { - submitter = document.createElement("input"); - submitter.type = "submit"; - submitter.hidden = true; - this.appendChild(submitter); - submitter.click(); - this.removeChild(submitter); - } - }; - - function validateSubmitter(submitter, form) { - submitter instanceof HTMLElement || raise(TypeError, "parameter 1 is not of type 'HTMLElement'"); - submitter.type == "submit" || raise(TypeError, "The specified element is not a submit button"); - submitter.form == form || - raise(DOMException, "The specified element is not owned by this form element", "NotFoundError"); - } - - function raise(errorConstructor, message, name) { - throw new errorConstructor("Failed to execute 'requestSubmit' on 'HTMLFormElement': " + message + ".", name) - } - })(HTMLFormElement.prototype); - - const submittersByForm = new WeakMap(); - - function findSubmitterFromClickTarget(target) { - const element = target instanceof Element ? target : target instanceof Node ? target.parentElement : null; - const candidate = element ? element.closest("input, button") : null; - return candidate?.type == "submit" ? candidate : null - } - - function clickCaptured(event) { - const submitter = findSubmitterFromClickTarget(event.target); - - if (submitter && submitter.form) { - submittersByForm.set(submitter.form, submitter); - } - } - - (function () { - if ("submitter" in Event.prototype) return - - let prototype = window.Event.prototype; - // Certain versions of Safari 15 have a bug where they won't - // populate the submitter. This hurts TurboDrive's enable/disable detection. - // See https://bugs.webkit.org/show_bug.cgi?id=229660 - if ("SubmitEvent" in window) { - const prototypeOfSubmitEvent = window.SubmitEvent.prototype; - - if (/Apple Computer/.test(navigator.vendor) && !("submitter" in prototypeOfSubmitEvent)) { - prototype = prototypeOfSubmitEvent; - } else { - return // polyfill not needed - } - } - - addEventListener("click", clickCaptured, true); - - Object.defineProperty(prototype, "submitter", { - get() { - if (this.type == "submit" && this.target instanceof HTMLFormElement) { - return submittersByForm.get(this.target) - } - } - }); - })(); - const FrameLoadingStyle = { eager: "eager", lazy: "lazy" @@ -198,6 +101,10 @@ Copyright © 2024 37signals LLC } } + get shouldReloadWithMorph() { + return this.src && this.refresh === "morph" + } + /** * Determines if the element is loading */ @@ -295,136 +202,27 @@ Copyright © 2024 37signals LLC } } - function expandURL(locatable) { - return new URL(locatable.toString(), document.baseURI) - } - - function getAnchor(url) { - let anchorMatch; - if (url.hash) { - return url.hash.slice(1) - // eslint-disable-next-line no-cond-assign - } else if ((anchorMatch = url.href.match(/#(.*)$/))) { - return anchorMatch[1] - } - } - - function getAction$1(form, submitter) { - const action = submitter?.getAttribute("formaction") || form.getAttribute("action") || form.action; - - return expandURL(action) - } - - function getExtension(url) { - return (getLastPathComponent(url).match(/\.[^.]*$/) || [])[0] || "" - } - - function isHTML(url) { - return !!getExtension(url).match(/^(?:|\.(?:htm|html|xhtml|php))$/) - } - - function isPrefixedBy(baseURL, url) { - const prefix = getPrefix(url); - return baseURL.href === expandURL(prefix).href || baseURL.href.startsWith(prefix) - } - - function locationIsVisitable(location, rootLocation) { - return isPrefixedBy(location, rootLocation) && isHTML(location) - } - - function getRequestURL(url) { - const anchor = getAnchor(url); - return anchor != null ? url.href.slice(0, -(anchor.length + 1)) : url.href - } - - function toCacheKey(url) { - return getRequestURL(url) - } - - function urlsAreEqual(left, right) { - return expandURL(left).href == expandURL(right).href - } - - function getPathComponents(url) { - return url.pathname.split("/").slice(1) - } - - function getLastPathComponent(url) { - return getPathComponents(url).slice(-1)[0] - } - - function getPrefix(url) { - return addTrailingSlash(url.origin + url.pathname) - } - - function addTrailingSlash(value) { - return value.endsWith("/") ? value : value + "/" - } - - class FetchResponse { - constructor(response) { - this.response = response; - } - - get succeeded() { - return this.response.ok - } - - get failed() { - return !this.succeeded - } - - get clientError() { - return this.statusCode >= 400 && this.statusCode <= 499 - } - - get serverError() { - return this.statusCode >= 500 && this.statusCode <= 599 - } - - get redirected() { - return this.response.redirected - } - - get location() { - return expandURL(this.response.url) - } - - get isHTML() { - return this.contentType && this.contentType.match(/^(?:text\/([^\s;,]+\b)?html|application\/xhtml\+xml)\b/) - } - - get statusCode() { - return this.response.status - } - - get contentType() { - return this.header("Content-Type") - } - - get responseText() { - return this.response.clone().text() - } - - get responseHTML() { - if (this.isHTML) { - return this.response.clone().text() - } else { - return Promise.resolve(undefined) - } - } - - header(name) { - return this.response.headers.get(name) - } - } + const drive = { + enabled: true, + progressBarDelay: 500, + unvisitableExtensions: new Set( + [ + ".7z", ".aac", ".apk", ".avi", ".bmp", ".bz2", ".css", ".csv", ".deb", ".dmg", ".doc", + ".docx", ".exe", ".gif", ".gz", ".heic", ".heif", ".ico", ".iso", ".jpeg", ".jpg", + ".js", ".json", ".m4a", ".mkv", ".mov", ".mp3", ".mp4", ".mpeg", ".mpg", ".msi", + ".ogg", ".ogv", ".pdf", ".pkg", ".png", ".ppt", ".pptx", ".rar", ".rtf", + ".svg", ".tar", ".tif", ".tiff", ".txt", ".wav", ".webm", ".webp", ".wma", ".wmv", + ".xls", ".xlsx", ".xml", ".zip" + ] + ) + }; function activateScriptElement(element) { if (element.getAttribute("data-turbo-eval") == "false") { return element } else { const createdScriptElement = document.createElement("script"); - const cspNonce = getMetaContent("csp-nonce"); + const cspNonce = getCspNonce(); if (cspNonce) { createdScriptElement.nonce = cspNonce; } @@ -464,6 +262,11 @@ Copyright © 2024 37signals LLC return event } + function cancelEvent(event) { + event.preventDefault(); + event.stopImmediatePropagation(); + } + function nextRepaint() { if (document.visibilityState === "hidden") { return nextEventLoopTick() @@ -480,10 +283,6 @@ Copyright © 2024 37signals LLC return new Promise((resolve) => setTimeout(() => resolve(), 0)) } - function nextMicrotask() { - return Promise.resolve() - } - function parseHTMLDocument(html = "") { return new DOMParser().parseFromString(html, "text/html") } @@ -512,7 +311,7 @@ Copyright © 2024 37signals LLC } else if (i == 19) { return (Math.floor(Math.random() * 4) + 8).toString(16) } else { - return Math.floor(Math.random() * 15).toString(16) + return Math.floor(Math.random() * 16).toString(16) } }) .join("") @@ -592,6 +391,15 @@ Copyright © 2024 37signals LLC return element && element.content } + function getCspNonce() { + const element = getMetaElement("csp-nonce"); + + if (element) { + const { nonce, content } = element; + return nonce == "" ? content : nonce + } + } + function setMetaContent(name, content) { let element = getMetaElement(name); @@ -652,11 +460,16 @@ Copyright © 2024 37signals LLC } function findLinkFromClickTarget(target) { - return findClosestRecursively(target, "a[href]:not([target^=_]):not([download])") - } + const link = findClosestRecursively(target, "a[href], a[xlink\\:href]"); - function getLocationForLink(link) { - return expandURL(link.getAttribute("href") || "") + if (!link) return null + if (link.href.startsWith("#")) return null + if (link.hasAttribute("download")) return null + + const linkTarget = link.getAttribute("target"); + if (linkTarget && linkTarget !== "_self") return null + + return link } function debounce(fn, delay) { @@ -669,6 +482,171 @@ Copyright © 2024 37signals LLC } } + const submitter = { + "aria-disabled": { + beforeSubmit: submitter => { + submitter.setAttribute("aria-disabled", "true"); + submitter.addEventListener("click", cancelEvent); + }, + + afterSubmit: submitter => { + submitter.removeAttribute("aria-disabled"); + submitter.removeEventListener("click", cancelEvent); + } + }, + + "disabled": { + beforeSubmit: submitter => submitter.disabled = true, + afterSubmit: submitter => submitter.disabled = false + } + }; + + class Config { + #submitter = null + + constructor(config) { + Object.assign(this, config); + } + + get submitter() { + return this.#submitter + } + + set submitter(value) { + this.#submitter = submitter[value] || value; + } + } + + const forms = new Config({ + mode: "on", + submitter: "disabled" + }); + + const config = { + drive, + forms + }; + + function expandURL(locatable) { + return new URL(locatable.toString(), document.baseURI) + } + + function getAnchor(url) { + let anchorMatch; + if (url.hash) { + return url.hash.slice(1) + // eslint-disable-next-line no-cond-assign + } else if ((anchorMatch = url.href.match(/#(.*)$/))) { + return anchorMatch[1] + } + } + + function getAction$1(form, submitter) { + const action = submitter?.getAttribute("formaction") || form.getAttribute("action") || form.action; + + return expandURL(action) + } + + function getExtension(url) { + return (getLastPathComponent(url).match(/\.[^.]*$/) || [])[0] || "" + } + + function isPrefixedBy(baseURL, url) { + const prefix = addTrailingSlash(url.origin + url.pathname); + return addTrailingSlash(baseURL.href) === prefix || baseURL.href.startsWith(prefix) + } + + function locationIsVisitable(location, rootLocation) { + return isPrefixedBy(location, rootLocation) && !config.drive.unvisitableExtensions.has(getExtension(location)) + } + + function getLocationForLink(link) { + return expandURL(link.getAttribute("href") || "") + } + + function getRequestURL(url) { + const anchor = getAnchor(url); + return anchor != null ? url.href.slice(0, -(anchor.length + 1)) : url.href + } + + function toCacheKey(url) { + return getRequestURL(url) + } + + function urlsAreEqual(left, right) { + return expandURL(left).href == expandURL(right).href + } + + function getPathComponents(url) { + return url.pathname.split("/").slice(1) + } + + function getLastPathComponent(url) { + return getPathComponents(url).slice(-1)[0] + } + + function addTrailingSlash(value) { + return value.endsWith("/") ? value : value + "/" + } + + class FetchResponse { + constructor(response) { + this.response = response; + } + + get succeeded() { + return this.response.ok + } + + get failed() { + return !this.succeeded + } + + get clientError() { + return this.statusCode >= 400 && this.statusCode <= 499 + } + + get serverError() { + return this.statusCode >= 500 && this.statusCode <= 599 + } + + get redirected() { + return this.response.redirected + } + + get location() { + return expandURL(this.response.url) + } + + get isHTML() { + return this.contentType && this.contentType.match(/^(?:text\/([^\s;,]+\b)?html|application\/xhtml\+xml)\b/) + } + + get statusCode() { + return this.response.status + } + + get contentType() { + return this.header("Content-Type") + } + + get responseText() { + return this.response.clone().text() + } + + get responseHTML() { + if (this.isHTML) { + return this.response.clone().text() + } else { + return Promise.resolve(undefined) + } + } + + header(name) { + return this.response.headers.get(name) + } + } + class LimitedSet extends Set { constructor(maxSize) { super(); @@ -687,15 +665,13 @@ Copyright © 2024 37signals LLC const recentRequests = new LimitedSet(20); - const nativeFetch = window.fetch; - function fetchWithTurboHeaders(url, options = {}) { const modifiedHeaders = new Headers(options.headers || {}); const requestUID = uuid(); recentRequests.add(requestUID); modifiedHeaders.append("X-Turbo-Request-Id", requestUID); - return nativeFetch(url, { + return window.fetch(url, { ...options, headers: modifiedHeaders }) @@ -1003,35 +979,113 @@ Copyright © 2024 37signals LLC return fragment } - const PREFETCH_DELAY = 100; + const identity = key => key; - class PrefetchCache { - #prefetchTimeout = null - #prefetched = null + class LRUCache { + keys = [] + entries = {} + #toCacheKey - get(url) { - if (this.#prefetched && this.#prefetched.url === url && this.#prefetched.expire > Date.now()) { - return this.#prefetched.request + constructor(size, toCacheKey = identity) { + this.size = size; + this.#toCacheKey = toCacheKey; + } + + has(key) { + return this.#toCacheKey(key) in this.entries + } + + get(key) { + if (this.has(key)) { + const entry = this.read(key); + this.touch(key); + return entry } } - setLater(url, request, ttl) { - this.clear(); - - this.#prefetchTimeout = setTimeout(() => { - request.perform(); - this.set(url, request, ttl); - this.#prefetchTimeout = null; - }, PREFETCH_DELAY); - } - - set(url, request, ttl) { - this.#prefetched = { url, request, expire: new Date(new Date().getTime() + ttl) }; + put(key, entry) { + this.write(key, entry); + this.touch(key); + return entry } clear() { + for (const key of Object.keys(this.entries)) { + this.evict(key); + } + } + + // Private + + read(key) { + return this.entries[this.#toCacheKey(key)] + } + + write(key, entry) { + this.entries[this.#toCacheKey(key)] = entry; + } + + touch(key) { + key = this.#toCacheKey(key); + const index = this.keys.indexOf(key); + if (index > -1) this.keys.splice(index, 1); + this.keys.unshift(key); + this.trim(); + } + + trim() { + for (const key of this.keys.splice(this.size)) { + this.evict(key); + } + } + + evict(key) { + delete this.entries[key]; + } + } + + const PREFETCH_DELAY = 100; + + class PrefetchCache extends LRUCache { + #prefetchTimeout = null + #maxAges = {} + + constructor(size = 1, prefetchDelay = PREFETCH_DELAY) { + super(size, toCacheKey); + this.prefetchDelay = prefetchDelay; + } + + putLater(url, request, ttl) { + this.#prefetchTimeout = setTimeout(() => { + request.perform(); + this.put(url, request, ttl); + this.#prefetchTimeout = null; + }, this.prefetchDelay); + } + + put(url, request, ttl = cacheTtl) { + super.put(url, request); + this.#maxAges[toCacheKey(url)] = new Date(new Date().getTime() + ttl); + } + + clear() { + super.clear(); if (this.#prefetchTimeout) clearTimeout(this.#prefetchTimeout); - this.#prefetched = null; + } + + evict(key) { + super.evict(key); + delete this.#maxAges[key]; + } + + has(key) { + if (super.has(key)) { + const maxAge = this.#maxAges[toCacheKey(key)]; + + return maxAge && maxAge > Date.now() + } else { + return false + } } } @@ -1050,7 +1104,7 @@ Copyright © 2024 37signals LLC class FormSubmission { state = FormSubmissionState.initialized - static confirmMethod(message, _element, _submitter) { + static confirmMethod(message) { return Promise.resolve(confirm(message)) } @@ -1106,7 +1160,11 @@ Copyright © 2024 37signals LLC const confirmationMessage = getAttribute("data-turbo-confirm", this.submitter, this.formElement); if (typeof confirmationMessage === "string") { - const answer = await FormSubmission.confirmMethod(confirmationMessage, this.formElement, this.submitter); + const confirmMethod = typeof config.forms.confirm === "function" ? + config.forms.confirm : + FormSubmission.confirmMethod; + + const answer = await confirmMethod(confirmationMessage, this.formElement, this.submitter); if (!answer) { return } @@ -1144,7 +1202,7 @@ Copyright © 2024 37signals LLC requestStarted(_request) { this.state = FormSubmissionState.waiting; - this.submitter?.setAttribute("disabled", ""); + if (this.submitter) config.forms.submitter.beforeSubmit(this.submitter); this.setSubmitsWith(); markAsBusy(this.formElement); dispatch("turbo:submit-start", { @@ -1190,7 +1248,7 @@ Copyright © 2024 37signals LLC requestFinished(_request) { this.state = FormSubmissionState.stopped; - this.submitter?.removeAttribute("disabled"); + if (this.submitter) config.forms.submitter.afterSubmit(this.submitter); this.resetSubmitterText(); clearBusyState(this.formElement); dispatch("turbo:submit-end", { @@ -1427,8 +1485,8 @@ Copyright © 2024 37signals LLC scrollToAnchor(anchor) { const element = this.snapshot.getElementForAnchor(anchor); if (element) { - this.scrollToElement(element); this.focusElement(element); + this.scrollToElement(element); } else { this.scrollToPosition({ x: 0, y: 0 }); } @@ -1780,12 +1838,16 @@ Copyright © 2024 37signals LLC class Renderer { #activeElement = null - constructor(currentSnapshot, newSnapshot, renderElement, isPreview, willRender = true) { + static renderElement(currentElement, newElement) { + // Abstract method + } + + constructor(currentSnapshot, newSnapshot, isPreview, willRender = true) { this.currentSnapshot = currentSnapshot; this.newSnapshot = newSnapshot; this.isPreview = isPreview; this.willRender = willRender; - this.renderElement = renderElement; + this.renderElement = this.constructor.renderElement; this.promise = new Promise((resolve, reject) => (this.resolvingFunctions = { resolve, reject })); } @@ -1950,6 +2012,1514 @@ Copyright © 2024 37signals LLC } } + /** + * @typedef {object} ConfigHead + * + * @property {'merge' | 'append' | 'morph' | 'none'} [style] + * @property {boolean} [block] + * @property {boolean} [ignore] + * @property {function(Element): boolean} [shouldPreserve] + * @property {function(Element): boolean} [shouldReAppend] + * @property {function(Element): boolean} [shouldRemove] + * @property {function(Element, {added: Node[], kept: Element[], removed: Element[]}): void} [afterHeadMorphed] + */ + + /** + * @typedef {object} ConfigCallbacks + * + * @property {function(Node): boolean} [beforeNodeAdded] + * @property {function(Node): void} [afterNodeAdded] + * @property {function(Element, Node): boolean} [beforeNodeMorphed] + * @property {function(Element, Node): void} [afterNodeMorphed] + * @property {function(Element): boolean} [beforeNodeRemoved] + * @property {function(Element): void} [afterNodeRemoved] + * @property {function(string, Element, "update" | "remove"): boolean} [beforeAttributeUpdated] + */ + + /** + * @typedef {object} Config + * + * @property {'outerHTML' | 'innerHTML'} [morphStyle] + * @property {boolean} [ignoreActive] + * @property {boolean} [ignoreActiveValue] + * @property {boolean} [restoreFocus] + * @property {ConfigCallbacks} [callbacks] + * @property {ConfigHead} [head] + */ + + /** + * @typedef {function} NoOp + * + * @returns {void} + */ + + /** + * @typedef {object} ConfigHeadInternal + * + * @property {'merge' | 'append' | 'morph' | 'none'} style + * @property {boolean} [block] + * @property {boolean} [ignore] + * @property {(function(Element): boolean) | NoOp} shouldPreserve + * @property {(function(Element): boolean) | NoOp} shouldReAppend + * @property {(function(Element): boolean) | NoOp} shouldRemove + * @property {(function(Element, {added: Node[], kept: Element[], removed: Element[]}): void) | NoOp} afterHeadMorphed + */ + + /** + * @typedef {object} ConfigCallbacksInternal + * + * @property {(function(Node): boolean) | NoOp} beforeNodeAdded + * @property {(function(Node): void) | NoOp} afterNodeAdded + * @property {(function(Node, Node): boolean) | NoOp} beforeNodeMorphed + * @property {(function(Node, Node): void) | NoOp} afterNodeMorphed + * @property {(function(Node): boolean) | NoOp} beforeNodeRemoved + * @property {(function(Node): void) | NoOp} afterNodeRemoved + * @property {(function(string, Element, "update" | "remove"): boolean) | NoOp} beforeAttributeUpdated + */ + + /** + * @typedef {object} ConfigInternal + * + * @property {'outerHTML' | 'innerHTML'} morphStyle + * @property {boolean} [ignoreActive] + * @property {boolean} [ignoreActiveValue] + * @property {boolean} [restoreFocus] + * @property {ConfigCallbacksInternal} callbacks + * @property {ConfigHeadInternal} head + */ + + /** + * @typedef {Object} IdSets + * @property {Set} persistentIds + * @property {Map>} idMap + */ + + /** + * @typedef {Function} Morph + * + * @param {Element | Document} oldNode + * @param {Element | Node | HTMLCollection | Node[] | string | null} newContent + * @param {Config} [config] + * @returns {undefined | Node[]} + */ + + // base IIFE to define idiomorph + /** + * + * @type {{defaults: ConfigInternal, morph: Morph}} + */ + var Idiomorph = (function () { + + /** + * @typedef {object} MorphContext + * + * @property {Element} target + * @property {Element} newContent + * @property {ConfigInternal} config + * @property {ConfigInternal['morphStyle']} morphStyle + * @property {ConfigInternal['ignoreActive']} ignoreActive + * @property {ConfigInternal['ignoreActiveValue']} ignoreActiveValue + * @property {ConfigInternal['restoreFocus']} restoreFocus + * @property {Map>} idMap + * @property {Set} persistentIds + * @property {ConfigInternal['callbacks']} callbacks + * @property {ConfigInternal['head']} head + * @property {HTMLDivElement} pantry + * @property {Element[]} activeElementAndParents + */ + + //============================================================================= + // AND NOW IT BEGINS... + //============================================================================= + + const noOp = () => {}; + /** + * Default configuration values, updatable by users now + * @type {ConfigInternal} + */ + const defaults = { + morphStyle: "outerHTML", + callbacks: { + beforeNodeAdded: noOp, + afterNodeAdded: noOp, + beforeNodeMorphed: noOp, + afterNodeMorphed: noOp, + beforeNodeRemoved: noOp, + afterNodeRemoved: noOp, + beforeAttributeUpdated: noOp, + }, + head: { + style: "merge", + shouldPreserve: (elt) => elt.getAttribute("im-preserve") === "true", + shouldReAppend: (elt) => elt.getAttribute("im-re-append") === "true", + shouldRemove: noOp, + afterHeadMorphed: noOp, + }, + restoreFocus: true, + }; + + /** + * Core idiomorph function for morphing one DOM tree to another + * + * @param {Element | Document} oldNode + * @param {Element | Node | HTMLCollection | Node[] | string | null} newContent + * @param {Config} [config] + * @returns {Promise | Node[]} + */ + function morph(oldNode, newContent, config = {}) { + oldNode = normalizeElement(oldNode); + const newNode = normalizeParent(newContent); + const ctx = createMorphContext(oldNode, newNode, config); + + const morphedNodes = saveAndRestoreFocus(ctx, () => { + return withHeadBlocking( + ctx, + oldNode, + newNode, + /** @param {MorphContext} ctx */ (ctx) => { + if (ctx.morphStyle === "innerHTML") { + morphChildren(ctx, oldNode, newNode); + return Array.from(oldNode.childNodes); + } else { + return morphOuterHTML(ctx, oldNode, newNode); + } + }, + ); + }); + + ctx.pantry.remove(); + return morphedNodes; + } + + /** + * Morph just the outerHTML of the oldNode to the newContent + * We have to be careful because the oldNode could have siblings which need to be untouched + * @param {MorphContext} ctx + * @param {Element} oldNode + * @param {Element} newNode + * @returns {Node[]} + */ + function morphOuterHTML(ctx, oldNode, newNode) { + const oldParent = normalizeParent(oldNode); + morphChildren( + ctx, + oldParent, + newNode, + // these two optional params are the secret sauce + oldNode, // start point for iteration + oldNode.nextSibling, // end point for iteration + ); + // this is safe even with siblings, because normalizeParent returns a SlicedParentNode if needed. + return Array.from(oldParent.childNodes); + } + + /** + * @param {MorphContext} ctx + * @param {Function} fn + * @returns {Promise | Node[]} + */ + function saveAndRestoreFocus(ctx, fn) { + if (!ctx.config.restoreFocus) return fn(); + let activeElement = + /** @type {HTMLInputElement|HTMLTextAreaElement|null} */ ( + document.activeElement + ); + + // don't bother if the active element is not an input or textarea + if ( + !( + activeElement instanceof HTMLInputElement || + activeElement instanceof HTMLTextAreaElement + ) + ) { + return fn(); + } + + const { id: activeElementId, selectionStart, selectionEnd } = activeElement; + + const results = fn(); + + if ( + activeElementId && + activeElementId !== document.activeElement?.getAttribute("id") + ) { + activeElement = ctx.target.querySelector(`[id="${activeElementId}"]`); + activeElement?.focus(); + } + if (activeElement && !activeElement.selectionEnd && selectionEnd) { + activeElement.setSelectionRange(selectionStart, selectionEnd); + } + + return results; + } + + const morphChildren = (function () { + /** + * This is the core algorithm for matching up children. The idea is to use id sets to try to match up + * nodes as faithfully as possible. We greedily match, which allows us to keep the algorithm fast, but + * by using id sets, we are able to better match up with content deeper in the DOM. + * + * Basic algorithm: + * - for each node in the new content: + * - search self and siblings for an id set match, falling back to a soft match + * - if match found + * - remove any nodes up to the match: + * - pantry persistent nodes + * - delete the rest + * - morph the match + * - elsif no match found, and node is persistent + * - find its match by querying the old root (future) and pantry (past) + * - move it and its children here + * - morph it + * - else + * - create a new node from scratch as a last result + * + * @param {MorphContext} ctx the merge context + * @param {Element} oldParent the old content that we are merging the new content into + * @param {Element} newParent the parent element of the new content + * @param {Node|null} [insertionPoint] the point in the DOM we start morphing at (defaults to first child) + * @param {Node|null} [endPoint] the point in the DOM we stop morphing at (defaults to after last child) + */ + function morphChildren( + ctx, + oldParent, + newParent, + insertionPoint = null, + endPoint = null, + ) { + // normalize + if ( + oldParent instanceof HTMLTemplateElement && + newParent instanceof HTMLTemplateElement + ) { + // @ts-ignore we can pretend the DocumentFragment is an Element + oldParent = oldParent.content; + // @ts-ignore ditto + newParent = newParent.content; + } + insertionPoint ||= oldParent.firstChild; + + // run through all the new content + for (const newChild of newParent.childNodes) { + // once we reach the end of the old parent content skip to the end and insert the rest + if (insertionPoint && insertionPoint != endPoint) { + const bestMatch = findBestMatch( + ctx, + newChild, + insertionPoint, + endPoint, + ); + if (bestMatch) { + // if the node to morph is not at the insertion point then remove/move up to it + if (bestMatch !== insertionPoint) { + removeNodesBetween(ctx, insertionPoint, bestMatch); + } + morphNode(bestMatch, newChild, ctx); + insertionPoint = bestMatch.nextSibling; + continue; + } + } + + // if the matching node is elsewhere in the original content + if (newChild instanceof Element) { + // we can pretend the id is non-null because the next `.has` line will reject it if not + const newChildId = /** @type {String} */ ( + newChild.getAttribute("id") + ); + if (ctx.persistentIds.has(newChildId)) { + // move it and all its children here and morph + const movedChild = moveBeforeById( + oldParent, + newChildId, + insertionPoint, + ctx, + ); + morphNode(movedChild, newChild, ctx); + insertionPoint = movedChild.nextSibling; + continue; + } + } + + // last resort: insert the new node from scratch + const insertedNode = createNode( + oldParent, + newChild, + insertionPoint, + ctx, + ); + // could be null if beforeNodeAdded prevented insertion + if (insertedNode) { + insertionPoint = insertedNode.nextSibling; + } + } + + // remove any remaining old nodes that didn't match up with new content + while (insertionPoint && insertionPoint != endPoint) { + const tempNode = insertionPoint; + insertionPoint = insertionPoint.nextSibling; + removeNode(ctx, tempNode); + } + } + + /** + * This performs the action of inserting a new node while handling situations where the node contains + * elements with persistent ids and possible state info we can still preserve by moving in and then morphing + * + * @param {Element} oldParent + * @param {Node} newChild + * @param {Node|null} insertionPoint + * @param {MorphContext} ctx + * @returns {Node|null} + */ + function createNode(oldParent, newChild, insertionPoint, ctx) { + if (ctx.callbacks.beforeNodeAdded(newChild) === false) return null; + if (ctx.idMap.has(newChild)) { + // node has children with ids with possible state so create a dummy elt of same type and apply full morph algorithm + const newEmptyChild = document.createElement( + /** @type {Element} */ (newChild).tagName, + ); + oldParent.insertBefore(newEmptyChild, insertionPoint); + morphNode(newEmptyChild, newChild, ctx); + ctx.callbacks.afterNodeAdded(newEmptyChild); + return newEmptyChild; + } else { + // optimisation: no id state to preserve so we can just insert a clone of the newChild and its descendants + const newClonedChild = document.importNode(newChild, true); // importNode to not mutate newParent + oldParent.insertBefore(newClonedChild, insertionPoint); + ctx.callbacks.afterNodeAdded(newClonedChild); + return newClonedChild; + } + } + + //============================================================================= + // Matching Functions + //============================================================================= + const findBestMatch = (function () { + /** + * Scans forward from the startPoint to the endPoint looking for a match + * for the node. It looks for an id set match first, then a soft match. + * We abort softmatching if we find two future soft matches, to reduce churn. + * @param {Node} node + * @param {MorphContext} ctx + * @param {Node | null} startPoint + * @param {Node | null} endPoint + * @returns {Node | null} + */ + function findBestMatch(ctx, node, startPoint, endPoint) { + let softMatch = null; + let nextSibling = node.nextSibling; + let siblingSoftMatchCount = 0; + + let cursor = startPoint; + while (cursor && cursor != endPoint) { + // soft matching is a prerequisite for id set matching + if (isSoftMatch(cursor, node)) { + if (isIdSetMatch(ctx, cursor, node)) { + return cursor; // found an id set match, we're done! + } + + // we haven't yet saved a soft match fallback + if (softMatch === null) { + // the current soft match will hard match something else in the future, leave it + if (!ctx.idMap.has(cursor)) { + // save this as the fallback if we get through the loop without finding a hard match + softMatch = cursor; + } + } + } + if ( + softMatch === null && + nextSibling && + isSoftMatch(cursor, nextSibling) + ) { + // The next new node has a soft match with this node, so + // increment the count of future soft matches + siblingSoftMatchCount++; + nextSibling = nextSibling.nextSibling; + + // If there are two future soft matches, block soft matching for this node to allow + // future siblings to soft match. This is to reduce churn in the DOM when an element + // is prepended. + if (siblingSoftMatchCount >= 2) { + softMatch = undefined; + } + } + + // if the current node contains active element, stop looking for better future matches, + // because if one is found, this node will be moved to the pantry, reparenting it and thus losing focus + // @ts-ignore pretend cursor is Element rather than Node, we're just testing for array inclusion + if (ctx.activeElementAndParents.includes(cursor)) break; + + cursor = cursor.nextSibling; + } + + return softMatch || null; + } + + /** + * + * @param {MorphContext} ctx + * @param {Node} oldNode + * @param {Node} newNode + * @returns {boolean} + */ + function isIdSetMatch(ctx, oldNode, newNode) { + let oldSet = ctx.idMap.get(oldNode); + let newSet = ctx.idMap.get(newNode); + + if (!newSet || !oldSet) return false; + + for (const id of oldSet) { + // a potential match is an id in the new and old nodes that + // has not already been merged into the DOM + // But the newNode content we call this on has not been + // merged yet and we don't allow duplicate IDs so it is simple + if (newSet.has(id)) { + return true; + } + } + return false; + } + + /** + * + * @param {Node} oldNode + * @param {Node} newNode + * @returns {boolean} + */ + function isSoftMatch(oldNode, newNode) { + // ok to cast: if one is not element, `id` and `tagName` will be undefined and we'll just compare that. + const oldElt = /** @type {Element} */ (oldNode); + const newElt = /** @type {Element} */ (newNode); + + return ( + oldElt.nodeType === newElt.nodeType && + oldElt.tagName === newElt.tagName && + // If oldElt has an `id` with possible state and it doesn't match newElt.id then avoid morphing. + // We'll still match an anonymous node with an IDed newElt, though, because if it got this far, + // its not persistent, and new nodes can't have any hidden state. + // We can't use .id because of form input shadowing, and we can't count on .getAttribute's presence because it could be a document-fragment + (!oldElt.getAttribute?.("id") || + oldElt.getAttribute?.("id") === newElt.getAttribute?.("id")) + ); + } + + return findBestMatch; + })(); + + //============================================================================= + // DOM Manipulation Functions + //============================================================================= + + /** + * Gets rid of an unwanted DOM node; strategy depends on nature of its reuse: + * - Persistent nodes will be moved to the pantry for later reuse + * - Other nodes will have their hooks called, and then are removed + * @param {MorphContext} ctx + * @param {Node} node + */ + function removeNode(ctx, node) { + // are we going to id set match this later? + if (ctx.idMap.has(node)) { + // skip callbacks and move to pantry + moveBefore(ctx.pantry, node, null); + } else { + // remove for realsies + if (ctx.callbacks.beforeNodeRemoved(node) === false) return; + node.parentNode?.removeChild(node); + ctx.callbacks.afterNodeRemoved(node); + } + } + + /** + * Remove nodes between the start and end nodes + * @param {MorphContext} ctx + * @param {Node} startInclusive + * @param {Node} endExclusive + * @returns {Node|null} + */ + function removeNodesBetween(ctx, startInclusive, endExclusive) { + /** @type {Node | null} */ + let cursor = startInclusive; + // remove nodes until the endExclusive node + while (cursor && cursor !== endExclusive) { + let tempNode = /** @type {Node} */ (cursor); + cursor = cursor.nextSibling; + removeNode(ctx, tempNode); + } + return cursor; + } + + /** + * Search for an element by id within the document and pantry, and move it using moveBefore. + * + * @param {Element} parentNode - The parent node to which the element will be moved. + * @param {string} id - The ID of the element to be moved. + * @param {Node | null} after - The reference node to insert the element before. + * If `null`, the element is appended as the last child. + * @param {MorphContext} ctx + * @returns {Element} The found element + */ + function moveBeforeById(parentNode, id, after, ctx) { + const target = + /** @type {Element} - will always be found */ + ( + // ctx.target.id unsafe because of form input shadowing + // ctx.target could be a document fragment which doesn't have `getAttribute` + (ctx.target.getAttribute?.("id") === id && ctx.target) || + ctx.target.querySelector(`[id="${id}"]`) || + ctx.pantry.querySelector(`[id="${id}"]`) + ); + removeElementFromAncestorsIdMaps(target, ctx); + moveBefore(parentNode, target, after); + return target; + } + + /** + * Removes an element from its ancestors' id maps. This is needed when an element is moved from the + * "future" via `moveBeforeId`. Otherwise, its erstwhile ancestors could be mistakenly moved to the + * pantry rather than being deleted, preventing their removal hooks from being called. + * + * @param {Element} element - element to remove from its ancestors' id maps + * @param {MorphContext} ctx + */ + function removeElementFromAncestorsIdMaps(element, ctx) { + // we know id is non-null String, because this function is only called on elements with ids + const id = /** @type {String} */ (element.getAttribute("id")); + /** @ts-ignore - safe to loop in this way **/ + while ((element = element.parentNode)) { + let idSet = ctx.idMap.get(element); + if (idSet) { + idSet.delete(id); + if (!idSet.size) { + ctx.idMap.delete(element); + } + } + } + } + + /** + * Moves an element before another element within the same parent. + * Uses the proposed `moveBefore` API if available (and working), otherwise falls back to `insertBefore`. + * This is essentialy a forward-compat wrapper. + * + * @param {Element} parentNode - The parent node containing the after element. + * @param {Node} element - The element to be moved. + * @param {Node | null} after - The reference node to insert `element` before. + * If `null`, `element` is appended as the last child. + */ + function moveBefore(parentNode, element, after) { + // @ts-ignore - use proposed moveBefore feature + if (parentNode.moveBefore) { + try { + // @ts-ignore - use proposed moveBefore feature + parentNode.moveBefore(element, after); + } catch (e) { + // fall back to insertBefore as some browsers may fail on moveBefore when trying to move Dom disconnected nodes to pantry + parentNode.insertBefore(element, after); + } + } else { + parentNode.insertBefore(element, after); + } + } + + return morphChildren; + })(); + + //============================================================================= + // Single Node Morphing Code + //============================================================================= + const morphNode = (function () { + /** + * @param {Node} oldNode root node to merge content into + * @param {Node} newContent new content to merge + * @param {MorphContext} ctx the merge context + * @returns {Node | null} the element that ended up in the DOM + */ + function morphNode(oldNode, newContent, ctx) { + if (ctx.ignoreActive && oldNode === document.activeElement) { + // don't morph focused element + return null; + } + + if (ctx.callbacks.beforeNodeMorphed(oldNode, newContent) === false) { + return oldNode; + } + + if (oldNode instanceof HTMLHeadElement && ctx.head.ignore) ; else if ( + oldNode instanceof HTMLHeadElement && + ctx.head.style !== "morph" + ) { + // ok to cast: if newContent wasn't also a , it would've got caught in the `!isSoftMatch` branch above + handleHeadElement( + oldNode, + /** @type {HTMLHeadElement} */ (newContent), + ctx, + ); + } else { + morphAttributes(oldNode, newContent, ctx); + if (!ignoreValueOfActiveElement(oldNode, ctx)) { + // @ts-ignore newContent can be a node here because .firstChild will be null + morphChildren(ctx, oldNode, newContent); + } + } + ctx.callbacks.afterNodeMorphed(oldNode, newContent); + return oldNode; + } + + /** + * syncs the oldNode to the newNode, copying over all attributes and + * inner element state from the newNode to the oldNode + * + * @param {Node} oldNode the node to copy attributes & state to + * @param {Node} newNode the node to copy attributes & state from + * @param {MorphContext} ctx the merge context + */ + function morphAttributes(oldNode, newNode, ctx) { + let type = newNode.nodeType; + + // if is an element type, sync the attributes from the + // new node into the new node + if (type === 1 /* element type */) { + const oldElt = /** @type {Element} */ (oldNode); + const newElt = /** @type {Element} */ (newNode); + + const oldAttributes = oldElt.attributes; + const newAttributes = newElt.attributes; + for (const newAttribute of newAttributes) { + if (ignoreAttribute(newAttribute.name, oldElt, "update", ctx)) { + continue; + } + if (oldElt.getAttribute(newAttribute.name) !== newAttribute.value) { + oldElt.setAttribute(newAttribute.name, newAttribute.value); + } + } + // iterate backwards to avoid skipping over items when a delete occurs + for (let i = oldAttributes.length - 1; 0 <= i; i--) { + const oldAttribute = oldAttributes[i]; + + // toAttributes is a live NamedNodeMap, so iteration+mutation is unsafe + // e.g. custom element attribute callbacks can remove other attributes + if (!oldAttribute) continue; + + if (!newElt.hasAttribute(oldAttribute.name)) { + if (ignoreAttribute(oldAttribute.name, oldElt, "remove", ctx)) { + continue; + } + oldElt.removeAttribute(oldAttribute.name); + } + } + + if (!ignoreValueOfActiveElement(oldElt, ctx)) { + syncInputValue(oldElt, newElt, ctx); + } + } + + // sync text nodes + if (type === 8 /* comment */ || type === 3 /* text */) { + if (oldNode.nodeValue !== newNode.nodeValue) { + oldNode.nodeValue = newNode.nodeValue; + } + } + } + + /** + * NB: many bothans died to bring us information: + * + * https://github.com/patrick-steele-idem/morphdom/blob/master/src/specialElHandlers.js + * https://github.com/choojs/nanomorph/blob/master/lib/morph.jsL113 + * + * @param {Element} oldElement the element to sync the input value to + * @param {Element} newElement the element to sync the input value from + * @param {MorphContext} ctx the merge context + */ + function syncInputValue(oldElement, newElement, ctx) { + if ( + oldElement instanceof HTMLInputElement && + newElement instanceof HTMLInputElement && + newElement.type !== "file" + ) { + let newValue = newElement.value; + let oldValue = oldElement.value; + + // sync boolean attributes + syncBooleanAttribute(oldElement, newElement, "checked", ctx); + syncBooleanAttribute(oldElement, newElement, "disabled", ctx); + + if (!newElement.hasAttribute("value")) { + if (!ignoreAttribute("value", oldElement, "remove", ctx)) { + oldElement.value = ""; + oldElement.removeAttribute("value"); + } + } else if (oldValue !== newValue) { + if (!ignoreAttribute("value", oldElement, "update", ctx)) { + oldElement.setAttribute("value", newValue); + oldElement.value = newValue; + } + } + // TODO: QUESTION(1cg): this used to only check `newElement` unlike the other branches -- why? + // did I break something? + } else if ( + oldElement instanceof HTMLOptionElement && + newElement instanceof HTMLOptionElement + ) { + syncBooleanAttribute(oldElement, newElement, "selected", ctx); + } else if ( + oldElement instanceof HTMLTextAreaElement && + newElement instanceof HTMLTextAreaElement + ) { + let newValue = newElement.value; + let oldValue = oldElement.value; + if (ignoreAttribute("value", oldElement, "update", ctx)) { + return; + } + if (newValue !== oldValue) { + oldElement.value = newValue; + } + if ( + oldElement.firstChild && + oldElement.firstChild.nodeValue !== newValue + ) { + oldElement.firstChild.nodeValue = newValue; + } + } + } + + /** + * @param {Element} oldElement element to write the value to + * @param {Element} newElement element to read the value from + * @param {string} attributeName the attribute name + * @param {MorphContext} ctx the merge context + */ + function syncBooleanAttribute(oldElement, newElement, attributeName, ctx) { + // @ts-ignore this function is only used on boolean attrs that are reflected as dom properties + const newLiveValue = newElement[attributeName], + // @ts-ignore ditto + oldLiveValue = oldElement[attributeName]; + if (newLiveValue !== oldLiveValue) { + const ignoreUpdate = ignoreAttribute( + attributeName, + oldElement, + "update", + ctx, + ); + if (!ignoreUpdate) { + // update attribute's associated DOM property + // @ts-ignore this function is only used on boolean attrs that are reflected as dom properties + oldElement[attributeName] = newElement[attributeName]; + } + if (newLiveValue) { + if (!ignoreUpdate) { + // https://developer.mozilla.org/en-US/docs/Glossary/Boolean/HTML + // this is the correct way to set a boolean attribute to "true" + oldElement.setAttribute(attributeName, ""); + } + } else { + if (!ignoreAttribute(attributeName, oldElement, "remove", ctx)) { + oldElement.removeAttribute(attributeName); + } + } + } + } + + /** + * @param {string} attr the attribute to be mutated + * @param {Element} element the element that is going to be updated + * @param {"update" | "remove"} updateType + * @param {MorphContext} ctx the merge context + * @returns {boolean} true if the attribute should be ignored, false otherwise + */ + function ignoreAttribute(attr, element, updateType, ctx) { + if ( + attr === "value" && + ctx.ignoreActiveValue && + element === document.activeElement + ) { + return true; + } + return ( + ctx.callbacks.beforeAttributeUpdated(attr, element, updateType) === + false + ); + } + + /** + * @param {Node} possibleActiveElement + * @param {MorphContext} ctx + * @returns {boolean} + */ + function ignoreValueOfActiveElement(possibleActiveElement, ctx) { + return ( + !!ctx.ignoreActiveValue && + possibleActiveElement === document.activeElement && + possibleActiveElement !== document.body + ); + } + + return morphNode; + })(); + + //============================================================================= + // Head Management Functions + //============================================================================= + /** + * @param {MorphContext} ctx + * @param {Element} oldNode + * @param {Element} newNode + * @param {function} callback + * @returns {Node[] | Promise} + */ + function withHeadBlocking(ctx, oldNode, newNode, callback) { + if (ctx.head.block) { + const oldHead = oldNode.querySelector("head"); + const newHead = newNode.querySelector("head"); + if (oldHead && newHead) { + const promises = handleHeadElement(oldHead, newHead, ctx); + // when head promises resolve, proceed ignoring the head tag + return Promise.all(promises).then(() => { + const newCtx = Object.assign(ctx, { + head: { + block: false, + ignore: true, + }, + }); + return callback(newCtx); + }); + } + } + // just proceed if we not head blocking + return callback(ctx); + } + + /** + * The HEAD tag can be handled specially, either w/ a 'merge' or 'append' style + * + * @param {Element} oldHead + * @param {Element} newHead + * @param {MorphContext} ctx + * @returns {Promise[]} + */ + function handleHeadElement(oldHead, newHead, ctx) { + let added = []; + let removed = []; + let preserved = []; + let nodesToAppend = []; + + // put all new head elements into a Map, by their outerHTML + let srcToNewHeadNodes = new Map(); + for (const newHeadChild of newHead.children) { + srcToNewHeadNodes.set(newHeadChild.outerHTML, newHeadChild); + } + + // for each elt in the current head + for (const currentHeadElt of oldHead.children) { + // If the current head element is in the map + let inNewContent = srcToNewHeadNodes.has(currentHeadElt.outerHTML); + let isReAppended = ctx.head.shouldReAppend(currentHeadElt); + let isPreserved = ctx.head.shouldPreserve(currentHeadElt); + if (inNewContent || isPreserved) { + if (isReAppended) { + // remove the current version and let the new version replace it and re-execute + removed.push(currentHeadElt); + } else { + // this element already exists and should not be re-appended, so remove it from + // the new content map, preserving it in the DOM + srcToNewHeadNodes.delete(currentHeadElt.outerHTML); + preserved.push(currentHeadElt); + } + } else { + if (ctx.head.style === "append") { + // we are appending and this existing element is not new content + // so if and only if it is marked for re-append do we do anything + if (isReAppended) { + removed.push(currentHeadElt); + nodesToAppend.push(currentHeadElt); + } + } else { + // if this is a merge, we remove this content since it is not in the new head + if (ctx.head.shouldRemove(currentHeadElt) !== false) { + removed.push(currentHeadElt); + } + } + } + } + + // Push the remaining new head elements in the Map into the + // nodes to append to the head tag + nodesToAppend.push(...srcToNewHeadNodes.values()); + + let promises = []; + for (const newNode of nodesToAppend) { + // TODO: This could theoretically be null, based on type + let newElt = /** @type {ChildNode} */ ( + document.createRange().createContextualFragment(newNode.outerHTML) + .firstChild + ); + if (ctx.callbacks.beforeNodeAdded(newElt) !== false) { + if ( + ("href" in newElt && newElt.href) || + ("src" in newElt && newElt.src) + ) { + /** @type {(result?: any) => void} */ let resolve; + let promise = new Promise(function (_resolve) { + resolve = _resolve; + }); + newElt.addEventListener("load", function () { + resolve(); + }); + promises.push(promise); + } + oldHead.appendChild(newElt); + ctx.callbacks.afterNodeAdded(newElt); + added.push(newElt); + } + } + + // remove all removed elements, after we have appended the new elements to avoid + // additional network requests for things like style sheets + for (const removedElement of removed) { + if (ctx.callbacks.beforeNodeRemoved(removedElement) !== false) { + oldHead.removeChild(removedElement); + ctx.callbacks.afterNodeRemoved(removedElement); + } + } + + ctx.head.afterHeadMorphed(oldHead, { + added: added, + kept: preserved, + removed: removed, + }); + return promises; + } + + //============================================================================= + // Create Morph Context Functions + //============================================================================= + const createMorphContext = (function () { + /** + * + * @param {Element} oldNode + * @param {Element} newContent + * @param {Config} config + * @returns {MorphContext} + */ + function createMorphContext(oldNode, newContent, config) { + const { persistentIds, idMap } = createIdMaps(oldNode, newContent); + + const mergedConfig = mergeDefaults(config); + const morphStyle = mergedConfig.morphStyle || "outerHTML"; + if (!["innerHTML", "outerHTML"].includes(morphStyle)) { + throw `Do not understand how to morph style ${morphStyle}`; + } + + return { + target: oldNode, + newContent: newContent, + config: mergedConfig, + morphStyle: morphStyle, + ignoreActive: mergedConfig.ignoreActive, + ignoreActiveValue: mergedConfig.ignoreActiveValue, + restoreFocus: mergedConfig.restoreFocus, + idMap: idMap, + persistentIds: persistentIds, + pantry: createPantry(), + activeElementAndParents: createActiveElementAndParents(oldNode), + callbacks: mergedConfig.callbacks, + head: mergedConfig.head, + }; + } + + /** + * Deep merges the config object and the Idiomorph.defaults object to + * produce a final configuration object + * @param {Config} config + * @returns {ConfigInternal} + */ + function mergeDefaults(config) { + let finalConfig = Object.assign({}, defaults); + + // copy top level stuff into final config + Object.assign(finalConfig, config); + + // copy callbacks into final config (do this to deep merge the callbacks) + finalConfig.callbacks = Object.assign( + {}, + defaults.callbacks, + config.callbacks, + ); + + // copy head config into final config (do this to deep merge the head) + finalConfig.head = Object.assign({}, defaults.head, config.head); + + return finalConfig; + } + + /** + * @returns {HTMLDivElement} + */ + function createPantry() { + const pantry = document.createElement("div"); + pantry.hidden = true; + document.body.insertAdjacentElement("afterend", pantry); + return pantry; + } + + /** + * @param {Element} oldNode + * @returns {Element[]} + */ + function createActiveElementAndParents(oldNode) { + /** @type {Element[]} */ + let activeElementAndParents = []; + let elt = document.activeElement; + if (elt?.tagName !== "BODY" && oldNode.contains(elt)) { + while (elt) { + activeElementAndParents.push(elt); + if (elt === oldNode) break; + elt = elt.parentElement; + } + } + return activeElementAndParents; + } + + /** + * Returns all elements with an ID contained within the root element and its descendants + * + * @param {Element} root + * @returns {Element[]} + */ + function findIdElements(root) { + let elements = Array.from(root.querySelectorAll("[id]")); + // root could be a document fragment which doesn't have `getAttribute` + if (root.getAttribute?.("id")) { + elements.push(root); + } + return elements; + } + + /** + * A bottom-up algorithm that populates a map of Element -> IdSet. + * The idSet for a given element is the set of all IDs contained within its subtree. + * As an optimzation, we filter these IDs through the given list of persistent IDs, + * because we don't need to bother considering IDed elements that won't be in the new content. + * + * @param {Map>} idMap + * @param {Set} persistentIds + * @param {Element} root + * @param {Element[]} elements + */ + function populateIdMapWithTree(idMap, persistentIds, root, elements) { + for (const elt of elements) { + // we can pretend id is non-null String, because the .has line will reject it immediately if not + const id = /** @type {String} */ (elt.getAttribute("id")); + if (persistentIds.has(id)) { + /** @type {Element|null} */ + let current = elt; + // walk up the parent hierarchy of that element, adding the id + // of element to the parent's id set + while (current) { + let idSet = idMap.get(current); + // if the id set doesn't exist, create it and insert it in the map + if (idSet == null) { + idSet = new Set(); + idMap.set(current, idSet); + } + idSet.add(id); + + if (current === root) break; + current = current.parentElement; + } + } + } + } + + /** + * This function computes a map of nodes to all ids contained within that node (inclusive of the + * node). This map can be used to ask if two nodes have intersecting sets of ids, which allows + * for a looser definition of "matching" than tradition id matching, and allows child nodes + * to contribute to a parent nodes matching. + * + * @param {Element} oldContent the old content that will be morphed + * @param {Element} newContent the new content to morph to + * @returns {IdSets} + */ + function createIdMaps(oldContent, newContent) { + const oldIdElements = findIdElements(oldContent); + const newIdElements = findIdElements(newContent); + + const persistentIds = createPersistentIds(oldIdElements, newIdElements); + + /** @type {Map>} */ + let idMap = new Map(); + populateIdMapWithTree(idMap, persistentIds, oldContent, oldIdElements); + + /** @ts-ignore - if newContent is a duck-typed parent, pass its single child node as the root to halt upwards iteration */ + const newRoot = newContent.__idiomorphRoot || newContent; + populateIdMapWithTree(idMap, persistentIds, newRoot, newIdElements); + + return { persistentIds, idMap }; + } + + /** + * This function computes the set of ids that persist between the two contents excluding duplicates + * + * @param {Element[]} oldIdElements + * @param {Element[]} newIdElements + * @returns {Set} + */ + function createPersistentIds(oldIdElements, newIdElements) { + let duplicateIds = new Set(); + + /** @type {Map} */ + let oldIdTagNameMap = new Map(); + for (const { id, tagName } of oldIdElements) { + if (oldIdTagNameMap.has(id)) { + duplicateIds.add(id); + } else { + oldIdTagNameMap.set(id, tagName); + } + } + + let persistentIds = new Set(); + for (const { id, tagName } of newIdElements) { + if (persistentIds.has(id)) { + duplicateIds.add(id); + } else if (oldIdTagNameMap.get(id) === tagName) { + persistentIds.add(id); + } + // skip if tag types mismatch because its not possible to morph one tag into another + } + + for (const id of duplicateIds) { + persistentIds.delete(id); + } + return persistentIds; + } + + return createMorphContext; + })(); + + //============================================================================= + // HTML Normalization Functions + //============================================================================= + const { normalizeElement, normalizeParent } = (function () { + /** @type {WeakSet} */ + const generatedByIdiomorph = new WeakSet(); + + /** + * + * @param {Element | Document} content + * @returns {Element} + */ + function normalizeElement(content) { + if (content instanceof Document) { + return content.documentElement; + } else { + return content; + } + } + + /** + * + * @param {null | string | Node | HTMLCollection | Node[] | Document & {generatedByIdiomorph:boolean}} newContent + * @returns {Element} + */ + function normalizeParent(newContent) { + if (newContent == null) { + return document.createElement("div"); // dummy parent element + } else if (typeof newContent === "string") { + return normalizeParent(parseContent(newContent)); + } else if ( + generatedByIdiomorph.has(/** @type {Element} */ (newContent)) + ) { + // the template tag created by idiomorph parsing can serve as a dummy parent + return /** @type {Element} */ (newContent); + } else if (newContent instanceof Node) { + if (newContent.parentNode) { + // we can't use the parent directly because newContent may have siblings + // that we don't want in the morph, and reparenting might be expensive (TODO is it?), + // so instead we create a fake parent node that only sees a slice of its children. + /** @type {Element} */ + return /** @type {any} */ (new SlicedParentNode(newContent)); + } else { + // a single node is added as a child to a dummy parent + const dummyParent = document.createElement("div"); + dummyParent.append(newContent); + return dummyParent; + } + } else { + // all nodes in the array or HTMLElement collection are consolidated under + // a single dummy parent element + const dummyParent = document.createElement("div"); + for (const elt of [...newContent]) { + dummyParent.append(elt); + } + return dummyParent; + } + } + + /** + * A fake duck-typed parent element to wrap a single node, without actually reparenting it. + * This is useful because the node may have siblings that we don't want in the morph, and it may also be moved + * or replaced with one or more elements during the morph. This class effectively allows us a window into + * a slice of a node's children. + * "If it walks like a duck, and quacks like a duck, then it must be a duck!" -- James Whitcomb Riley (1849–1916) + */ + class SlicedParentNode { + /** @param {Node} node */ + constructor(node) { + this.originalNode = node; + this.realParentNode = /** @type {Element} */ (node.parentNode); + this.previousSibling = node.previousSibling; + this.nextSibling = node.nextSibling; + } + + /** @returns {Node[]} */ + get childNodes() { + // return slice of realParent's current childNodes, based on previousSibling and nextSibling + const nodes = []; + let cursor = this.previousSibling + ? this.previousSibling.nextSibling + : this.realParentNode.firstChild; + while (cursor && cursor != this.nextSibling) { + nodes.push(cursor); + cursor = cursor.nextSibling; + } + return nodes; + } + + /** + * @param {string} selector + * @returns {Element[]} + */ + querySelectorAll(selector) { + return this.childNodes.reduce((results, node) => { + if (node instanceof Element) { + if (node.matches(selector)) results.push(node); + const nodeList = node.querySelectorAll(selector); + for (let i = 0; i < nodeList.length; i++) { + results.push(nodeList[i]); + } + } + return results; + }, /** @type {Element[]} */ ([])); + } + + /** + * @param {Node} node + * @param {Node} referenceNode + * @returns {Node} + */ + insertBefore(node, referenceNode) { + return this.realParentNode.insertBefore(node, referenceNode); + } + + /** + * @param {Node} node + * @param {Node} referenceNode + * @returns {Node} + */ + moveBefore(node, referenceNode) { + // @ts-ignore - use new moveBefore feature + return this.realParentNode.moveBefore(node, referenceNode); + } + + /** + * for later use with populateIdMapWithTree to halt upwards iteration + * @returns {Node} + */ + get __idiomorphRoot() { + return this.originalNode; + } + } + + /** + * + * @param {string} newContent + * @returns {Node | null | DocumentFragment} + */ + function parseContent(newContent) { + let parser = new DOMParser(); + + // remove svgs to avoid false-positive matches on head, etc. + let contentWithSvgsRemoved = newContent.replace( + /]*>|>)([\s\S]*?)<\/svg>/gim, + "", + ); + + // if the newContent contains a html, head or body tag, we can simply parse it w/o wrapping + if ( + contentWithSvgsRemoved.match(/<\/html>/) || + contentWithSvgsRemoved.match(/<\/head>/) || + contentWithSvgsRemoved.match(/<\/body>/) + ) { + let content = parser.parseFromString(newContent, "text/html"); + // if it is a full HTML document, return the document itself as the parent container + if (contentWithSvgsRemoved.match(/<\/html>/)) { + generatedByIdiomorph.add(content); + return content; + } else { + // otherwise return the html element as the parent container + let htmlElement = content.firstChild; + if (htmlElement) { + generatedByIdiomorph.add(htmlElement); + } + return htmlElement; + } + } else { + // if it is partial HTML, wrap it in a template tag to provide a parent element and also to help + // deal with touchy tags like tr, tbody, etc. + let responseDoc = parser.parseFromString( + "", + "text/html", + ); + let content = /** @type {HTMLTemplateElement} */ ( + responseDoc.body.querySelector("template") + ).content; + generatedByIdiomorph.add(content); + return content; + } + } + + return { normalizeElement, normalizeParent }; + })(); + + //============================================================================= + // This is what ends up becoming the Idiomorph global object + //============================================================================= + return { + morph, + defaults, + }; + })(); + + /** + * Morph the state of the currentElement based on the attributes and contents of + * the newElement. Morphing may dispatch turbo:before-morph-element, + * turbo:before-morph-attribute, and turbo:morph-element events. + * + * @param currentElement Element destination of morphing changes + * @param newElement Element source of morphing changes + */ + function morphElements(currentElement, newElement, { callbacks, ...options } = {}) { + Idiomorph.morph(currentElement, newElement, { + ...options, + callbacks: new DefaultIdiomorphCallbacks(callbacks) + }); + } + + /** + * Morph the child elements of the currentElement based on the child elements of + * the newElement. Morphing children may dispatch turbo:before-morph-element, + * turbo:before-morph-attribute, and turbo:morph-element events. + * + * @param currentElement Element destination of morphing children changes + * @param newElement Element source of morphing children changes + */ + function morphChildren(currentElement, newElement, options = {}) { + morphElements(currentElement, newElement.childNodes, { + ...options, + morphStyle: "innerHTML" + }); + } + + function shouldRefreshFrameWithMorphing(currentFrame, newFrame) { + return currentFrame instanceof FrameElement && + currentFrame.shouldReloadWithMorph && (!newFrame || areFramesCompatibleForRefreshing(currentFrame, newFrame)) && + !currentFrame.closest("[data-turbo-permanent]") + } + + function areFramesCompatibleForRefreshing(currentFrame, newFrame) { + // newFrame cannot yet be an instance of FrameElement because custom + // elements don't get initialized until they're attached to the DOM, so + // test its Element#nodeName instead + return newFrame instanceof Element && newFrame.nodeName === "TURBO-FRAME" && currentFrame.id === newFrame.id && + (!newFrame.getAttribute("src") || urlsAreEqual(currentFrame.src, newFrame.getAttribute("src"))) + } + + function closestFrameReloadableWithMorphing(node) { + return node.parentElement.closest("turbo-frame[src][refresh=morph]") + } + + class DefaultIdiomorphCallbacks { + #beforeNodeMorphed + + constructor({ beforeNodeMorphed } = {}) { + this.#beforeNodeMorphed = beforeNodeMorphed || (() => true); + } + + beforeNodeAdded = (node) => { + return !(node.id && node.hasAttribute("data-turbo-permanent") && document.getElementById(node.id)) + } + + beforeNodeMorphed = (currentElement, newElement) => { + if (currentElement instanceof Element) { + if (!currentElement.hasAttribute("data-turbo-permanent") && this.#beforeNodeMorphed(currentElement, newElement)) { + const event = dispatch("turbo:before-morph-element", { + cancelable: true, + target: currentElement, + detail: { currentElement, newElement } + }); + + return !event.defaultPrevented + } else { + return false + } + } + } + + beforeAttributeUpdated = (attributeName, target, mutationType) => { + const event = dispatch("turbo:before-morph-attribute", { + cancelable: true, + target, + detail: { attributeName, mutationType } + }); + + return !event.defaultPrevented + } + + beforeNodeRemoved = (node) => { + return this.beforeNodeMorphed(node) + } + + afterNodeMorphed = (currentElement, newElement) => { + if (currentElement instanceof Element) { + dispatch("turbo:morph-element", { + target: currentElement, + detail: { currentElement, newElement } + }); + } + } + } + + class MorphingFrameRenderer extends FrameRenderer { + static renderElement(currentElement, newElement) { + dispatch("turbo:before-frame-morph", { + target: currentElement, + detail: { currentElement, newElement } + }); + + morphChildren(currentElement, newElement, { + callbacks: { + beforeNodeMorphed: (node, newNode) => { + if ( + shouldRefreshFrameWithMorphing(node, newNode) && + closestFrameReloadableWithMorphing(node) === currentElement + ) { + node.reload(); + return false + } + return true + } + } + }); + } + + async preservingPermanentElements(callback) { + return await callback() + } + } + class ProgressBar { static animationDuration = 300 /*ms*/ @@ -2056,8 +3626,9 @@ Copyright © 2024 37signals LLC const element = document.createElement("style"); element.type = "text/css"; element.textContent = ProgressBar.defaultCSS; - if (this.cspNonce) { - element.nonce = this.cspNonce; + const cspNonce = getCspNonce(); + if (cspNonce) { + element.nonce = cspNonce; } return element } @@ -2067,10 +3638,6 @@ Copyright © 2024 37signals LLC element.className = "turbo-progress-bar"; return element } - - get cspNonce() { - return getMetaContent("csp-nonce") - } } class HeadSnapshot extends Snapshot { @@ -2221,6 +3788,10 @@ Copyright © 2024 37signals LLC clonedPasswordInput.value = ""; } + for (const clonedNoscriptElement of clonedElement.querySelectorAll("noscript")) { + clonedNoscriptElement.remove(); + } + return new PageSnapshot(this.documentElement, clonedElement, this.headSnapshot) } @@ -2228,6 +3799,10 @@ Copyright © 2024 37signals LLC return this.documentElement.getAttribute("lang") } + get dir() { + return this.documentElement.getAttribute("dir") + } + get headElement() { return this.headSnapshot.element } @@ -2254,15 +3829,16 @@ Copyright © 2024 37signals LLC } get prefersViewTransitions() { - return this.headSnapshot.getMetaValue("view-transition") === "same-origin" + const viewTransitionEnabled = this.getSetting("view-transition") === "true" || this.headSnapshot.getMetaValue("view-transition") === "same-origin"; + return viewTransitionEnabled && !window.matchMedia("(prefers-reduced-motion: reduce)").matches } - get shouldMorphPage() { - return this.getSetting("refresh-method") === "morph" + get refreshMethod() { + return this.getSetting("refresh-method") } - get shouldPreserveScrollPosition() { - return this.getSetting("refresh-scroll") === "preserve" + get refreshScroll() { + return this.getSetting("refresh-scroll") } // Private @@ -2301,7 +3877,8 @@ Copyright © 2024 37signals LLC willRender: true, updateHistory: true, shouldCacheSnapshot: true, - acceptsStreamResponse: false + acceptsStreamResponse: false, + refresh: {} }; const TimingMetric = { @@ -2361,7 +3938,8 @@ Copyright © 2024 37signals LLC updateHistory, shouldCacheSnapshot, acceptsStreamResponse, - direction + direction, + refresh } = { ...defaultOptions, ...options @@ -2372,7 +3950,6 @@ Copyright © 2024 37signals LLC this.snapshot = snapshot; this.snapshotHTML = snapshotHTML; this.response = response; - this.isSamePage = this.delegate.locationWithActionIsSamePage(this.location, this.action); this.isPageRefresh = this.view.isPageRefresh(this); this.visitCachedSnapshot = visitCachedSnapshot; this.willRender = willRender; @@ -2381,6 +3958,7 @@ Copyright © 2024 37signals LLC this.shouldCacheSnapshot = shouldCacheSnapshot; this.acceptsStreamResponse = acceptsStreamResponse; this.direction = direction || Direction[action]; + this.refresh = refresh; } get adapter() { @@ -2399,10 +3977,6 @@ Copyright © 2024 37signals LLC return this.history.getRestorationDataForIdentifier(this.restorationIdentifier) } - get silent() { - return this.isSamePage - } - start() { if (this.state == VisitState.initialized) { this.recordTimingMetric(TimingMetric.visitStart); @@ -2539,7 +4113,7 @@ Copyright © 2024 37signals LLC const isPreview = this.shouldIssueRequest(); this.render(async () => { this.cacheSnapshot(); - if (this.isSamePage || this.isPageRefresh) { + if (this.isPageRefresh) { this.adapter.visitRendered(this); } else { if (this.view.renderPromise) await this.view.renderPromise; @@ -2567,17 +4141,6 @@ Copyright © 2024 37signals LLC } } - goToSamePageAnchor() { - if (this.isSamePage) { - this.render(async () => { - this.cacheSnapshot(); - this.performScroll(); - this.changeHistory(); - this.adapter.visitRendered(this); - }); - } - } - // Fetch request delegate prepareRequest(request) { @@ -2639,9 +4202,6 @@ Copyright © 2024 37signals LLC } else { this.scrollToAnchor() || this.view.scrollToTop(); } - if (this.isSamePage) { - this.delegate.visitScrolledToSamePageLocation(this.view.lastRenderedLocation, this.location); - } this.scrolled = true; } @@ -2675,24 +4235,12 @@ Copyright © 2024 37signals LLC // Private - getHistoryMethodForAction(action) { - switch (action) { - case "replace": - return history.replaceState - case "advance": - case "restore": - return history.pushState - } - } - hasPreloadedResponse() { return typeof this.response == "object" } shouldIssueRequest() { - if (this.isSamePage) { - return false - } else if (this.action == "restore") { + if (this.action == "restore") { return !this.hasCachedSnapshot() } else { return this.willRender @@ -2708,7 +4256,10 @@ Copyright © 2024 37signals LLC async render(callback) { this.cancelRender(); - this.frame = await nextRepaint(); + await new Promise((resolve) => { + this.frame = + document.visibilityState === "hidden" ? setTimeout(() => resolve(), 0) : requestAnimationFrame(() => resolve()); + }); await callback(); delete this.frame; } @@ -2749,9 +4300,10 @@ Copyright © 2024 37signals LLC visitStarted(visit) { this.location = visit.location; + this.redirectedToLocation = null; + visit.loadCachedSnapshot(); visit.issueRequest(); - visit.goToSamePageAnchor(); } visitRequestStarted(visit) { @@ -2765,6 +4317,10 @@ Copyright © 2024 37signals LLC visitRequestCompleted(visit) { visit.loadResponse(); + + if (visit.response.redirected) { + this.redirectedToLocation = visit.redirectedToLocation; + } } visitRequestFailedWithStatusCode(visit, statusCode) { @@ -2801,6 +4357,12 @@ Copyright © 2024 37signals LLC visitRendered(_visit) {} + // Link prefetching + + linkPrefetchingIsEnabledForLocation(location) { + return true + } + // Form Submission Delegate formSubmissionStarted(_formSubmission) { @@ -2848,7 +4410,7 @@ Copyright © 2024 37signals LLC reload(reason) { dispatch("turbo:reload", { detail: reason }); - window.location.href = this.location?.toString() || window.location.href; + window.location.href = (this.redirectedToLocation || this.location)?.toString() || window.location.href; } get navigator() { @@ -2858,7 +4420,6 @@ Copyright © 2024 37signals LLC class CacheObserver { selector = "[data-turbo-temporary]" - deprecatedSelector = "[data-turbo-cache=false]" started = false @@ -2883,19 +4444,7 @@ Copyright © 2024 37signals LLC } get temporaryElements() { - return [...document.querySelectorAll(this.selector), ...this.temporaryElementsWithDeprecation] - } - - get temporaryElementsWithDeprecation() { - const elements = document.querySelectorAll(this.deprecatedSelector); - - if (elements.length) { - console.warn( - `The ${this.deprecatedSelector} selector is deprecated and will be removed in a future version. Use ${this.selector} instead.` - ); - } - - return [...elements] + return [...document.querySelectorAll(this.selector)] } } @@ -2985,7 +4534,6 @@ Copyright © 2024 37signals LLC restorationIdentifier = uuid() restorationData = {} started = false - pageLoaded = false currentIndex = 0 constructor(delegate) { @@ -2995,7 +4543,6 @@ Copyright © 2024 37signals LLC start() { if (!this.started) { addEventListener("popstate", this.onPopState, false); - addEventListener("load", this.onPageLoad, false); this.currentIndex = history.state?.turbo?.restorationIndex || 0; this.started = true; this.replace(new URL(window.location.href)); @@ -3005,7 +4552,6 @@ Copyright © 2024 37signals LLC stop() { if (this.started) { removeEventListener("popstate", this.onPopState, false); - removeEventListener("load", this.onPageLoad, false); this.started = false; } } @@ -3061,34 +4607,20 @@ Copyright © 2024 37signals LLC // Event handlers onPopState = (event) => { - if (this.shouldHandlePopState()) { - const { turbo } = event.state || {}; - if (turbo) { - this.location = new URL(window.location.href); - const { restorationIdentifier, restorationIndex } = turbo; - this.restorationIdentifier = restorationIdentifier; - const direction = restorationIndex > this.currentIndex ? "forward" : "back"; - this.delegate.historyPoppedToLocationWithRestorationIdentifierAndDirection(this.location, restorationIdentifier, direction); - this.currentIndex = restorationIndex; - } + const { turbo } = event.state || {}; + this.location = new URL(window.location.href); + + if (turbo) { + const { restorationIdentifier, restorationIndex } = turbo; + this.restorationIdentifier = restorationIdentifier; + const direction = restorationIndex > this.currentIndex ? "forward" : "back"; + this.delegate.historyPoppedToLocationWithRestorationIdentifierAndDirection(this.location, restorationIdentifier, direction); + this.currentIndex = restorationIndex; + } else { + this.currentIndex++; + this.delegate.historyPoppedWithEmptyState(this.location); } } - - onPageLoad = async (_event) => { - await nextMicrotask(); - this.pageLoaded = true; - } - - // Private - - shouldHandlePopState() { - // Safari dispatches a popstate event after window's load event, ignore it - return this.pageIsLoaded() - } - - pageIsLoaded() { - return this.pageLoaded || document.readyState == "complete" - } } class LinkPrefetchObserver { @@ -3161,7 +4693,9 @@ Copyright © 2024 37signals LLC target ); - prefetchCache.setLater(location.toString(), fetchRequest, this.#cacheTtl); + fetchRequest.fetchOptions.priority = "low"; + + prefetchCache.putLater(location, fetchRequest, this.#cacheTtl); } } } @@ -3177,7 +4711,7 @@ Copyright © 2024 37signals LLC #tryToUsePrefetchedRequest = (event) => { if (event.target.tagName !== "FORM" && event.detail.fetchOptions.method === "GET") { - const cached = prefetchCache.get(event.detail.url.toString()); + const cached = prefetchCache.get(event.detail.url); if (cached) { // User clicked link, use cache response @@ -3367,7 +4901,7 @@ Copyright © 2024 37signals LLC } else { await this.view.renderPage(snapshot, false, true, this.currentVisit); } - if(!snapshot.shouldPreserveScrollPosition) { + if (snapshot.refreshScroll !== "preserve") { this.view.scrollToTop(); } this.view.clearSnapshotCache(); @@ -3385,6 +4919,17 @@ Copyright © 2024 37signals LLC } } + // Link prefetching + + linkPrefetchingIsEnabledForLocation(location) { + // Not all adapters implement linkPrefetchingIsEnabledForLocation + if (typeof this.adapter.linkPrefetchingIsEnabledForLocation === "function") { + return this.adapter.linkPrefetchingIsEnabledForLocation(location) + } + + return true + } + // Visit delegate visitStarted(visit) { @@ -3396,20 +4941,10 @@ Copyright © 2024 37signals LLC delete this.currentVisit; } + // Same-page links are no longer handled with a Visit. + // This method is still needed for Turbo Native adapters. locationWithActionIsSamePage(location, action) { - const anchor = getAnchor(location); - const currentAnchor = getAnchor(this.view.lastRenderedLocation); - const isRestorationToTop = action === "restore" && typeof anchor === "undefined"; - - return ( - action !== "replace" && - getRequestURL(location) === getRequestURL(this.view.lastRenderedLocation) && - (isRestorationToTop || (anchor != null && anchor !== currentAnchor)) - ) - } - - visitScrolledToSamePageLocation(oldURL, newURL) { - this.delegate.visitScrolledToSamePageLocation(oldURL, newURL); + return false } // Visits @@ -3743,914 +5278,6 @@ Copyright © 2024 37signals LLC } } - // base IIFE to define idiomorph - var Idiomorph = (function () { - - //============================================================================= - // AND NOW IT BEGINS... - //============================================================================= - let EMPTY_SET = new Set(); - - // default configuration values, updatable by users now - let defaults = { - morphStyle: "outerHTML", - callbacks : { - beforeNodeAdded: noOp, - afterNodeAdded: noOp, - beforeNodeMorphed: noOp, - afterNodeMorphed: noOp, - beforeNodeRemoved: noOp, - afterNodeRemoved: noOp, - beforeAttributeUpdated: noOp, - - }, - head: { - style: 'merge', - shouldPreserve: function (elt) { - return elt.getAttribute("im-preserve") === "true"; - }, - shouldReAppend: function (elt) { - return elt.getAttribute("im-re-append") === "true"; - }, - shouldRemove: noOp, - afterHeadMorphed: noOp, - } - }; - - //============================================================================= - // Core Morphing Algorithm - morph, morphNormalizedContent, morphOldNodeTo, morphChildren - //============================================================================= - function morph(oldNode, newContent, config = {}) { - - if (oldNode instanceof Document) { - oldNode = oldNode.documentElement; - } - - if (typeof newContent === 'string') { - newContent = parseContent(newContent); - } - - let normalizedContent = normalizeContent(newContent); - - let ctx = createMorphContext(oldNode, normalizedContent, config); - - return morphNormalizedContent(oldNode, normalizedContent, ctx); - } - - function morphNormalizedContent(oldNode, normalizedNewContent, ctx) { - if (ctx.head.block) { - let oldHead = oldNode.querySelector('head'); - let newHead = normalizedNewContent.querySelector('head'); - if (oldHead && newHead) { - let promises = handleHeadElement(newHead, oldHead, ctx); - // when head promises resolve, call morph again, ignoring the head tag - Promise.all(promises).then(function () { - morphNormalizedContent(oldNode, normalizedNewContent, Object.assign(ctx, { - head: { - block: false, - ignore: true - } - })); - }); - return; - } - } - - if (ctx.morphStyle === "innerHTML") { - - // innerHTML, so we are only updating the children - morphChildren(normalizedNewContent, oldNode, ctx); - return oldNode.children; - - } else if (ctx.morphStyle === "outerHTML" || ctx.morphStyle == null) { - // otherwise find the best element match in the new content, morph that, and merge its siblings - // into either side of the best match - let bestMatch = findBestNodeMatch(normalizedNewContent, oldNode, ctx); - - // stash the siblings that will need to be inserted on either side of the best match - let previousSibling = bestMatch?.previousSibling; - let nextSibling = bestMatch?.nextSibling; - - // morph it - let morphedNode = morphOldNodeTo(oldNode, bestMatch, ctx); - - if (bestMatch) { - // if there was a best match, merge the siblings in too and return the - // whole bunch - return insertSiblings(previousSibling, morphedNode, nextSibling); - } else { - // otherwise nothing was added to the DOM - return [] - } - } else { - throw "Do not understand how to morph style " + ctx.morphStyle; - } - } - - - /** - * @param possibleActiveElement - * @param ctx - * @returns {boolean} - */ - function ignoreValueOfActiveElement(possibleActiveElement, ctx) { - return ctx.ignoreActiveValue && possibleActiveElement === document.activeElement && possibleActiveElement !== document.body; - } - - /** - * @param oldNode root node to merge content into - * @param newContent new content to merge - * @param ctx the merge context - * @returns {Element} the element that ended up in the DOM - */ - function morphOldNodeTo(oldNode, newContent, ctx) { - if (ctx.ignoreActive && oldNode === document.activeElement) ; else if (newContent == null) { - if (ctx.callbacks.beforeNodeRemoved(oldNode) === false) return oldNode; - - oldNode.remove(); - ctx.callbacks.afterNodeRemoved(oldNode); - return null; - } else if (!isSoftMatch(oldNode, newContent)) { - if (ctx.callbacks.beforeNodeRemoved(oldNode) === false) return oldNode; - if (ctx.callbacks.beforeNodeAdded(newContent) === false) return oldNode; - - oldNode.parentElement.replaceChild(newContent, oldNode); - ctx.callbacks.afterNodeAdded(newContent); - ctx.callbacks.afterNodeRemoved(oldNode); - return newContent; - } else { - if (ctx.callbacks.beforeNodeMorphed(oldNode, newContent) === false) return oldNode; - - if (oldNode instanceof HTMLHeadElement && ctx.head.ignore) ; else if (oldNode instanceof HTMLHeadElement && ctx.head.style !== "morph") { - handleHeadElement(newContent, oldNode, ctx); - } else { - syncNodeFrom(newContent, oldNode, ctx); - if (!ignoreValueOfActiveElement(oldNode, ctx)) { - morphChildren(newContent, oldNode, ctx); - } - } - ctx.callbacks.afterNodeMorphed(oldNode, newContent); - return oldNode; - } - } - - /** - * This is the core algorithm for matching up children. The idea is to use id sets to try to match up - * nodes as faithfully as possible. We greedily match, which allows us to keep the algorithm fast, but - * by using id sets, we are able to better match up with content deeper in the DOM. - * - * Basic algorithm is, for each node in the new content: - * - * - if we have reached the end of the old parent, append the new content - * - if the new content has an id set match with the current insertion point, morph - * - search for an id set match - * - if id set match found, morph - * - otherwise search for a "soft" match - * - if a soft match is found, morph - * - otherwise, prepend the new node before the current insertion point - * - * The two search algorithms terminate if competing node matches appear to outweigh what can be achieved - * with the current node. See findIdSetMatch() and findSoftMatch() for details. - * - * @param {Element} newParent the parent element of the new content - * @param {Element } oldParent the old content that we are merging the new content into - * @param ctx the merge context - */ - function morphChildren(newParent, oldParent, ctx) { - - let nextNewChild = newParent.firstChild; - let insertionPoint = oldParent.firstChild; - let newChild; - - // run through all the new content - while (nextNewChild) { - - newChild = nextNewChild; - nextNewChild = newChild.nextSibling; - - // if we are at the end of the exiting parent's children, just append - if (insertionPoint == null) { - if (ctx.callbacks.beforeNodeAdded(newChild) === false) return; - - oldParent.appendChild(newChild); - ctx.callbacks.afterNodeAdded(newChild); - removeIdsFromConsideration(ctx, newChild); - continue; - } - - // if the current node has an id set match then morph - if (isIdSetMatch(newChild, insertionPoint, ctx)) { - morphOldNodeTo(insertionPoint, newChild, ctx); - insertionPoint = insertionPoint.nextSibling; - removeIdsFromConsideration(ctx, newChild); - continue; - } - - // otherwise search forward in the existing old children for an id set match - let idSetMatch = findIdSetMatch(newParent, oldParent, newChild, insertionPoint, ctx); - - // if we found a potential match, remove the nodes until that point and morph - if (idSetMatch) { - insertionPoint = removeNodesBetween(insertionPoint, idSetMatch, ctx); - morphOldNodeTo(idSetMatch, newChild, ctx); - removeIdsFromConsideration(ctx, newChild); - continue; - } - - // no id set match found, so scan forward for a soft match for the current node - let softMatch = findSoftMatch(newParent, oldParent, newChild, insertionPoint, ctx); - - // if we found a soft match for the current node, morph - if (softMatch) { - insertionPoint = removeNodesBetween(insertionPoint, softMatch, ctx); - morphOldNodeTo(softMatch, newChild, ctx); - removeIdsFromConsideration(ctx, newChild); - continue; - } - - // abandon all hope of morphing, just insert the new child before the insertion point - // and move on - if (ctx.callbacks.beforeNodeAdded(newChild) === false) return; - - oldParent.insertBefore(newChild, insertionPoint); - ctx.callbacks.afterNodeAdded(newChild); - removeIdsFromConsideration(ctx, newChild); - } - - // remove any remaining old nodes that didn't match up with new content - while (insertionPoint !== null) { - - let tempNode = insertionPoint; - insertionPoint = insertionPoint.nextSibling; - removeNode(tempNode, ctx); - } - } - - //============================================================================= - // Attribute Syncing Code - //============================================================================= - - /** - * @param attr {String} the attribute to be mutated - * @param to {Element} the element that is going to be updated - * @param updateType {("update"|"remove")} - * @param ctx the merge context - * @returns {boolean} true if the attribute should be ignored, false otherwise - */ - function ignoreAttribute(attr, to, updateType, ctx) { - if(attr === 'value' && ctx.ignoreActiveValue && to === document.activeElement){ - return true; - } - return ctx.callbacks.beforeAttributeUpdated(attr, to, updateType) === false; - } - - /** - * syncs a given node with another node, copying over all attributes and - * inner element state from the 'from' node to the 'to' node - * - * @param {Element} from the element to copy attributes & state from - * @param {Element} to the element to copy attributes & state to - * @param ctx the merge context - */ - function syncNodeFrom(from, to, ctx) { - let type = from.nodeType; - - // if is an element type, sync the attributes from the - // new node into the new node - if (type === 1 /* element type */) { - const fromAttributes = from.attributes; - const toAttributes = to.attributes; - for (const fromAttribute of fromAttributes) { - if (ignoreAttribute(fromAttribute.name, to, 'update', ctx)) { - continue; - } - if (to.getAttribute(fromAttribute.name) !== fromAttribute.value) { - to.setAttribute(fromAttribute.name, fromAttribute.value); - } - } - // iterate backwards to avoid skipping over items when a delete occurs - for (let i = toAttributes.length - 1; 0 <= i; i--) { - const toAttribute = toAttributes[i]; - if (ignoreAttribute(toAttribute.name, to, 'remove', ctx)) { - continue; - } - if (!from.hasAttribute(toAttribute.name)) { - to.removeAttribute(toAttribute.name); - } - } - } - - // sync text nodes - if (type === 8 /* comment */ || type === 3 /* text */) { - if (to.nodeValue !== from.nodeValue) { - to.nodeValue = from.nodeValue; - } - } - - if (!ignoreValueOfActiveElement(to, ctx)) { - // sync input values - syncInputValue(from, to, ctx); - } - } - - /** - * @param from {Element} element to sync the value from - * @param to {Element} element to sync the value to - * @param attributeName {String} the attribute name - * @param ctx the merge context - */ - function syncBooleanAttribute(from, to, attributeName, ctx) { - if (from[attributeName] !== to[attributeName]) { - let ignoreUpdate = ignoreAttribute(attributeName, to, 'update', ctx); - if (!ignoreUpdate) { - to[attributeName] = from[attributeName]; - } - if (from[attributeName]) { - if (!ignoreUpdate) { - to.setAttribute(attributeName, from[attributeName]); - } - } else { - if (!ignoreAttribute(attributeName, to, 'remove', ctx)) { - to.removeAttribute(attributeName); - } - } - } - } - - /** - * NB: many bothans died to bring us information: - * - * https://github.com/patrick-steele-idem/morphdom/blob/master/src/specialElHandlers.js - * https://github.com/choojs/nanomorph/blob/master/lib/morph.jsL113 - * - * @param from {Element} the element to sync the input value from - * @param to {Element} the element to sync the input value to - * @param ctx the merge context - */ - function syncInputValue(from, to, ctx) { - if (from instanceof HTMLInputElement && - to instanceof HTMLInputElement && - from.type !== 'file') { - - let fromValue = from.value; - let toValue = to.value; - - // sync boolean attributes - syncBooleanAttribute(from, to, 'checked', ctx); - syncBooleanAttribute(from, to, 'disabled', ctx); - - if (!from.hasAttribute('value')) { - if (!ignoreAttribute('value', to, 'remove', ctx)) { - to.value = ''; - to.removeAttribute('value'); - } - } else if (fromValue !== toValue) { - if (!ignoreAttribute('value', to, 'update', ctx)) { - to.setAttribute('value', fromValue); - to.value = fromValue; - } - } - } else if (from instanceof HTMLOptionElement) { - syncBooleanAttribute(from, to, 'selected', ctx); - } else if (from instanceof HTMLTextAreaElement && to instanceof HTMLTextAreaElement) { - let fromValue = from.value; - let toValue = to.value; - if (ignoreAttribute('value', to, 'update', ctx)) { - return; - } - if (fromValue !== toValue) { - to.value = fromValue; - } - if (to.firstChild && to.firstChild.nodeValue !== fromValue) { - to.firstChild.nodeValue = fromValue; - } - } - } - - //============================================================================= - // the HEAD tag can be handled specially, either w/ a 'merge' or 'append' style - //============================================================================= - function handleHeadElement(newHeadTag, currentHead, ctx) { - - let added = []; - let removed = []; - let preserved = []; - let nodesToAppend = []; - - let headMergeStyle = ctx.head.style; - - // put all new head elements into a Map, by their outerHTML - let srcToNewHeadNodes = new Map(); - for (const newHeadChild of newHeadTag.children) { - srcToNewHeadNodes.set(newHeadChild.outerHTML, newHeadChild); - } - - // for each elt in the current head - for (const currentHeadElt of currentHead.children) { - - // If the current head element is in the map - let inNewContent = srcToNewHeadNodes.has(currentHeadElt.outerHTML); - let isReAppended = ctx.head.shouldReAppend(currentHeadElt); - let isPreserved = ctx.head.shouldPreserve(currentHeadElt); - if (inNewContent || isPreserved) { - if (isReAppended) { - // remove the current version and let the new version replace it and re-execute - removed.push(currentHeadElt); - } else { - // this element already exists and should not be re-appended, so remove it from - // the new content map, preserving it in the DOM - srcToNewHeadNodes.delete(currentHeadElt.outerHTML); - preserved.push(currentHeadElt); - } - } else { - if (headMergeStyle === "append") { - // we are appending and this existing element is not new content - // so if and only if it is marked for re-append do we do anything - if (isReAppended) { - removed.push(currentHeadElt); - nodesToAppend.push(currentHeadElt); - } - } else { - // if this is a merge, we remove this content since it is not in the new head - if (ctx.head.shouldRemove(currentHeadElt) !== false) { - removed.push(currentHeadElt); - } - } - } - } - - // Push the remaining new head elements in the Map into the - // nodes to append to the head tag - nodesToAppend.push(...srcToNewHeadNodes.values()); - - let promises = []; - for (const newNode of nodesToAppend) { - let newElt = document.createRange().createContextualFragment(newNode.outerHTML).firstChild; - if (ctx.callbacks.beforeNodeAdded(newElt) !== false) { - if (newElt.href || newElt.src) { - let resolve = null; - let promise = new Promise(function (_resolve) { - resolve = _resolve; - }); - newElt.addEventListener('load', function () { - resolve(); - }); - promises.push(promise); - } - currentHead.appendChild(newElt); - ctx.callbacks.afterNodeAdded(newElt); - added.push(newElt); - } - } - - // remove all removed elements, after we have appended the new elements to avoid - // additional network requests for things like style sheets - for (const removedElement of removed) { - if (ctx.callbacks.beforeNodeRemoved(removedElement) !== false) { - currentHead.removeChild(removedElement); - ctx.callbacks.afterNodeRemoved(removedElement); - } - } - - ctx.head.afterHeadMorphed(currentHead, {added: added, kept: preserved, removed: removed}); - return promises; - } - - function noOp() { - } - - /* - Deep merges the config object and the Idiomoroph.defaults object to - produce a final configuration object - */ - function mergeDefaults(config) { - let finalConfig = {}; - // copy top level stuff into final config - Object.assign(finalConfig, defaults); - Object.assign(finalConfig, config); - - // copy callbacks into final config (do this to deep merge the callbacks) - finalConfig.callbacks = {}; - Object.assign(finalConfig.callbacks, defaults.callbacks); - Object.assign(finalConfig.callbacks, config.callbacks); - - // copy head config into final config (do this to deep merge the head) - finalConfig.head = {}; - Object.assign(finalConfig.head, defaults.head); - Object.assign(finalConfig.head, config.head); - return finalConfig; - } - - function createMorphContext(oldNode, newContent, config) { - config = mergeDefaults(config); - return { - target: oldNode, - newContent: newContent, - config: config, - morphStyle: config.morphStyle, - ignoreActive: config.ignoreActive, - ignoreActiveValue: config.ignoreActiveValue, - idMap: createIdMap(oldNode, newContent), - deadIds: new Set(), - callbacks: config.callbacks, - head: config.head - } - } - - function isIdSetMatch(node1, node2, ctx) { - if (node1 == null || node2 == null) { - return false; - } - if (node1.nodeType === node2.nodeType && node1.tagName === node2.tagName) { - if (node1.id !== "" && node1.id === node2.id) { - return true; - } else { - return getIdIntersectionCount(ctx, node1, node2) > 0; - } - } - return false; - } - - function isSoftMatch(node1, node2) { - if (node1 == null || node2 == null) { - return false; - } - return node1.nodeType === node2.nodeType && node1.tagName === node2.tagName - } - - function removeNodesBetween(startInclusive, endExclusive, ctx) { - while (startInclusive !== endExclusive) { - let tempNode = startInclusive; - startInclusive = startInclusive.nextSibling; - removeNode(tempNode, ctx); - } - removeIdsFromConsideration(ctx, endExclusive); - return endExclusive.nextSibling; - } - - //============================================================================= - // Scans forward from the insertionPoint in the old parent looking for a potential id match - // for the newChild. We stop if we find a potential id match for the new child OR - // if the number of potential id matches we are discarding is greater than the - // potential id matches for the new child - //============================================================================= - function findIdSetMatch(newContent, oldParent, newChild, insertionPoint, ctx) { - - // max id matches we are willing to discard in our search - let newChildPotentialIdCount = getIdIntersectionCount(ctx, newChild, oldParent); - - let potentialMatch = null; - - // only search forward if there is a possibility of an id match - if (newChildPotentialIdCount > 0) { - let potentialMatch = insertionPoint; - // if there is a possibility of an id match, scan forward - // keep track of the potential id match count we are discarding (the - // newChildPotentialIdCount must be greater than this to make it likely - // worth it) - let otherMatchCount = 0; - while (potentialMatch != null) { - - // If we have an id match, return the current potential match - if (isIdSetMatch(newChild, potentialMatch, ctx)) { - return potentialMatch; - } - - // computer the other potential matches of this new content - otherMatchCount += getIdIntersectionCount(ctx, potentialMatch, newContent); - if (otherMatchCount > newChildPotentialIdCount) { - // if we have more potential id matches in _other_ content, we - // do not have a good candidate for an id match, so return null - return null; - } - - // advanced to the next old content child - potentialMatch = potentialMatch.nextSibling; - } - } - return potentialMatch; - } - - //============================================================================= - // Scans forward from the insertionPoint in the old parent looking for a potential soft match - // for the newChild. We stop if we find a potential soft match for the new child OR - // if we find a potential id match in the old parents children OR if we find two - // potential soft matches for the next two pieces of new content - //============================================================================= - function findSoftMatch(newContent, oldParent, newChild, insertionPoint, ctx) { - - let potentialSoftMatch = insertionPoint; - let nextSibling = newChild.nextSibling; - let siblingSoftMatchCount = 0; - - while (potentialSoftMatch != null) { - - if (getIdIntersectionCount(ctx, potentialSoftMatch, newContent) > 0) { - // the current potential soft match has a potential id set match with the remaining new - // content so bail out of looking - return null; - } - - // if we have a soft match with the current node, return it - if (isSoftMatch(newChild, potentialSoftMatch)) { - return potentialSoftMatch; - } - - if (isSoftMatch(nextSibling, potentialSoftMatch)) { - // the next new node has a soft match with this node, so - // increment the count of future soft matches - siblingSoftMatchCount++; - nextSibling = nextSibling.nextSibling; - - // If there are two future soft matches, bail to allow the siblings to soft match - // so that we don't consume future soft matches for the sake of the current node - if (siblingSoftMatchCount >= 2) { - return null; - } - } - - // advanced to the next old content child - potentialSoftMatch = potentialSoftMatch.nextSibling; - } - - return potentialSoftMatch; - } - - function parseContent(newContent) { - let parser = new DOMParser(); - - // remove svgs to avoid false-positive matches on head, etc. - let contentWithSvgsRemoved = newContent.replace(/]*>|>)([\s\S]*?)<\/svg>/gim, ''); - - // if the newContent contains a html, head or body tag, we can simply parse it w/o wrapping - if (contentWithSvgsRemoved.match(/<\/html>/) || contentWithSvgsRemoved.match(/<\/head>/) || contentWithSvgsRemoved.match(/<\/body>/)) { - let content = parser.parseFromString(newContent, "text/html"); - // if it is a full HTML document, return the document itself as the parent container - if (contentWithSvgsRemoved.match(/<\/html>/)) { - content.generatedByIdiomorph = true; - return content; - } else { - // otherwise return the html element as the parent container - let htmlElement = content.firstChild; - if (htmlElement) { - htmlElement.generatedByIdiomorph = true; - return htmlElement; - } else { - return null; - } - } - } else { - // if it is partial HTML, wrap it in a template tag to provide a parent element and also to help - // deal with touchy tags like tr, tbody, etc. - let responseDoc = parser.parseFromString("", "text/html"); - let content = responseDoc.body.querySelector('template').content; - content.generatedByIdiomorph = true; - return content - } - } - - function normalizeContent(newContent) { - if (newContent == null) { - // noinspection UnnecessaryLocalVariableJS - const dummyParent = document.createElement('div'); - return dummyParent; - } else if (newContent.generatedByIdiomorph) { - // the template tag created by idiomorph parsing can serve as a dummy parent - return newContent; - } else if (newContent instanceof Node) { - // a single node is added as a child to a dummy parent - const dummyParent = document.createElement('div'); - dummyParent.append(newContent); - return dummyParent; - } else { - // all nodes in the array or HTMLElement collection are consolidated under - // a single dummy parent element - const dummyParent = document.createElement('div'); - for (const elt of [...newContent]) { - dummyParent.append(elt); - } - return dummyParent; - } - } - - function insertSiblings(previousSibling, morphedNode, nextSibling) { - let stack = []; - let added = []; - while (previousSibling != null) { - stack.push(previousSibling); - previousSibling = previousSibling.previousSibling; - } - while (stack.length > 0) { - let node = stack.pop(); - added.push(node); // push added preceding siblings on in order and insert - morphedNode.parentElement.insertBefore(node, morphedNode); - } - added.push(morphedNode); - while (nextSibling != null) { - stack.push(nextSibling); - added.push(nextSibling); // here we are going in order, so push on as we scan, rather than add - nextSibling = nextSibling.nextSibling; - } - while (stack.length > 0) { - morphedNode.parentElement.insertBefore(stack.pop(), morphedNode.nextSibling); - } - return added; - } - - function findBestNodeMatch(newContent, oldNode, ctx) { - let currentElement; - currentElement = newContent.firstChild; - let bestElement = currentElement; - let score = 0; - while (currentElement) { - let newScore = scoreElement(currentElement, oldNode, ctx); - if (newScore > score) { - bestElement = currentElement; - score = newScore; - } - currentElement = currentElement.nextSibling; - } - return bestElement; - } - - function scoreElement(node1, node2, ctx) { - if (isSoftMatch(node1, node2)) { - return .5 + getIdIntersectionCount(ctx, node1, node2); - } - return 0; - } - - function removeNode(tempNode, ctx) { - removeIdsFromConsideration(ctx, tempNode); - if (ctx.callbacks.beforeNodeRemoved(tempNode) === false) return; - - tempNode.remove(); - ctx.callbacks.afterNodeRemoved(tempNode); - } - - //============================================================================= - // ID Set Functions - //============================================================================= - - function isIdInConsideration(ctx, id) { - return !ctx.deadIds.has(id); - } - - function idIsWithinNode(ctx, id, targetNode) { - let idSet = ctx.idMap.get(targetNode) || EMPTY_SET; - return idSet.has(id); - } - - function removeIdsFromConsideration(ctx, node) { - let idSet = ctx.idMap.get(node) || EMPTY_SET; - for (const id of idSet) { - ctx.deadIds.add(id); - } - } - - function getIdIntersectionCount(ctx, node1, node2) { - let sourceSet = ctx.idMap.get(node1) || EMPTY_SET; - let matchCount = 0; - for (const id of sourceSet) { - // a potential match is an id in the source and potentialIdsSet, but - // that has not already been merged into the DOM - if (isIdInConsideration(ctx, id) && idIsWithinNode(ctx, id, node2)) { - ++matchCount; - } - } - return matchCount; - } - - /** - * A bottom up algorithm that finds all elements with ids inside of the node - * argument and populates id sets for those nodes and all their parents, generating - * a set of ids contained within all nodes for the entire hierarchy in the DOM - * - * @param node {Element} - * @param {Map>} idMap - */ - function populateIdMapForNode(node, idMap) { - let nodeParent = node.parentElement; - // find all elements with an id property - let idElements = node.querySelectorAll('[id]'); - for (const elt of idElements) { - let current = elt; - // walk up the parent hierarchy of that element, adding the id - // of element to the parent's id set - while (current !== nodeParent && current != null) { - let idSet = idMap.get(current); - // if the id set doesn't exist, create it and insert it in the map - if (idSet == null) { - idSet = new Set(); - idMap.set(current, idSet); - } - idSet.add(elt.id); - current = current.parentElement; - } - } - } - - /** - * This function computes a map of nodes to all ids contained within that node (inclusive of the - * node). This map can be used to ask if two nodes have intersecting sets of ids, which allows - * for a looser definition of "matching" than tradition id matching, and allows child nodes - * to contribute to a parent nodes matching. - * - * @param {Element} oldContent the old content that will be morphed - * @param {Element} newContent the new content to morph to - * @returns {Map>} a map of nodes to id sets for the - */ - function createIdMap(oldContent, newContent) { - let idMap = new Map(); - populateIdMapForNode(oldContent, idMap); - populateIdMapForNode(newContent, idMap); - return idMap; - } - - //============================================================================= - // This is what ends up becoming the Idiomorph global object - //============================================================================= - return { - morph, - defaults - } - })(); - - function morphElements(currentElement, newElement, { callbacks, ...options } = {}) { - Idiomorph.morph(currentElement, newElement, { - ...options, - callbacks: new DefaultIdiomorphCallbacks(callbacks) - }); - } - - function morphChildren(currentElement, newElement) { - morphElements(currentElement, newElement.children, { - morphStyle: "innerHTML" - }); - } - - class DefaultIdiomorphCallbacks { - #beforeNodeMorphed - - constructor({ beforeNodeMorphed } = {}) { - this.#beforeNodeMorphed = beforeNodeMorphed || (() => true); - } - - beforeNodeAdded = (node) => { - return !(node.id && node.hasAttribute("data-turbo-permanent") && document.getElementById(node.id)) - } - - beforeNodeMorphed = (currentElement, newElement) => { - if (currentElement instanceof Element) { - if (!currentElement.hasAttribute("data-turbo-permanent") && this.#beforeNodeMorphed(currentElement, newElement)) { - const event = dispatch("turbo:before-morph-element", { - cancelable: true, - target: currentElement, - detail: { currentElement, newElement } - }); - - return !event.defaultPrevented - } else { - return false - } - } - } - - beforeAttributeUpdated = (attributeName, target, mutationType) => { - const event = dispatch("turbo:before-morph-attribute", { - cancelable: true, - target, - detail: { attributeName, mutationType } - }); - - return !event.defaultPrevented - } - - beforeNodeRemoved = (node) => { - return this.beforeNodeMorphed(node) - } - - afterNodeMorphed = (currentElement, newElement) => { - if (currentElement instanceof Element) { - dispatch("turbo:morph-element", { - target: currentElement, - detail: { currentElement, newElement } - }); - } - } - } - - class MorphingFrameRenderer extends FrameRenderer { - static renderElement(currentElement, newElement) { - dispatch("turbo:before-frame-morph", { - target: currentElement, - detail: { currentElement, newElement } - }); - - morphChildren(currentElement, newElement); - } - } - class PageRenderer extends Renderer { static renderElement(currentElement, newElement) { if (document.body && newElement instanceof HTMLBodyElement) { @@ -4710,13 +5337,18 @@ Copyright © 2024 37signals LLC #setLanguage() { const { documentElement } = this.currentSnapshot; - const { lang } = this.newSnapshot; + const { dir, lang } = this.newSnapshot; if (lang) { documentElement.setAttribute("lang", lang); } else { documentElement.removeAttribute("lang"); } + if (dir) { + documentElement.setAttribute("dir", dir); + } else { + documentElement.removeAttribute("dir"); + } } async mergeHead() { @@ -4818,9 +5450,16 @@ Copyright © 2024 37signals LLC activateNewBody() { document.adoptNode(this.newElement); + this.removeNoscriptElements(); this.activateNewBodyScriptElements(); } + removeNoscriptElements() { + for (const noscriptElement of this.newElement.querySelectorAll("noscript")) { + noscriptElement.remove(); + } + } + activateNewBodyScriptElements() { for (const inertScriptElement of this.newBodyScriptElements) { const activatedScriptElement = activateScriptElement(inertScriptElement); @@ -4867,14 +5506,19 @@ Copyright © 2024 37signals LLC static renderElement(currentElement, newElement) { morphElements(currentElement, newElement, { callbacks: { - beforeNodeMorphed: element => !canRefreshFrame(element) + beforeNodeMorphed: (node, newNode) => { + if ( + shouldRefreshFrameWithMorphing(node, newNode) && + !closestFrameReloadableWithMorphing(node) + ) { + node.reload(); + return false + } + return true + } } }); - for (const frame of currentElement.querySelectorAll("turbo-frame")) { - if (canRefreshFrame(frame)) refreshFrame(frame); - } - dispatch("turbo:morph", { detail: { currentElement, newElement } }); } @@ -4891,73 +5535,13 @@ Copyright © 2024 37signals LLC } } - function canRefreshFrame(frame) { - return frame instanceof FrameElement && - frame.src && - frame.refresh === "morph" && - !frame.closest("[data-turbo-permanent]") - } - - function refreshFrame(frame) { - frame.addEventListener("turbo:before-frame-render", ({ detail }) => { - detail.render = MorphingFrameRenderer.renderElement; - }, { once: true }); - - frame.reload(); - } - - class SnapshotCache { - keys = [] - snapshots = {} - + class SnapshotCache extends LRUCache { constructor(size) { - this.size = size; + super(size, toCacheKey); } - has(location) { - return toCacheKey(location) in this.snapshots - } - - get(location) { - if (this.has(location)) { - const snapshot = this.read(location); - this.touch(location); - return snapshot - } - } - - put(location, snapshot) { - this.write(location, snapshot); - this.touch(location); - return snapshot - } - - clear() { - this.snapshots = {}; - } - - // Private - - read(location) { - return this.snapshots[toCacheKey(location)] - } - - write(location, snapshot) { - this.snapshots[toCacheKey(location)] = snapshot; - } - - touch(location) { - const key = toCacheKey(location); - const index = this.keys.indexOf(key); - if (index > -1) this.keys.splice(index, 1); - this.keys.unshift(key); - this.trim(); - } - - trim() { - for (const key of this.keys.splice(this.size)) { - delete this.snapshots[key]; - } + get snapshots() { + return this.entries } } @@ -4971,10 +5555,10 @@ Copyright © 2024 37signals LLC } renderPage(snapshot, isPreview = false, willRender = true, visit) { - const shouldMorphPage = this.isPageRefresh(visit) && this.snapshot.shouldMorphPage; + const shouldMorphPage = this.isPageRefresh(visit) && (visit?.refresh?.method || this.snapshot.refreshMethod) === "morph"; const rendererClass = shouldMorphPage ? MorphingPageRenderer : PageRenderer; - const renderer = new rendererClass(this.snapshot, snapshot, rendererClass.renderElement, isPreview, willRender); + const renderer = new rendererClass(this.snapshot, snapshot, isPreview, willRender); if (!renderer.shouldRender) { this.forceReloaded = true; @@ -4987,7 +5571,7 @@ Copyright © 2024 37signals LLC renderError(snapshot, visit) { visit?.changeHistory(); - const renderer = new ErrorRenderer(this.snapshot, snapshot, ErrorRenderer.renderElement, false); + const renderer = new ErrorRenderer(this.snapshot, snapshot, false); return this.render(renderer) } @@ -5015,7 +5599,7 @@ Copyright © 2024 37signals LLC } shouldPreserveScrollPosition(visit) { - return this.isPageRefresh(visit) && this.snapshot.shouldPreserveScrollPosition + return this.isPageRefresh(visit) && (visit?.refresh?.scroll || this.snapshot.refreshScroll) === "preserve" } get snapshot() { @@ -5138,11 +5722,8 @@ Copyright © 2024 37signals LLC streamMessageRenderer = new StreamMessageRenderer() cache = new Cache(this) - drive = true enabled = true - progressBarDelay = 500 started = false - formMode = "on" #pageRefreshDebouncePeriod = 150 constructor(recentRequests) { @@ -5208,10 +5789,14 @@ Copyright © 2024 37signals LLC } } - refresh(url, requestId) { + refresh(url, options = {}) { + options = typeof options === "string" ? { requestId: options } : options; + + const { method, requestId, scroll } = options; const isRecentRequest = requestId && this.recentRequests.has(requestId); - if (!isRecentRequest && !this.navigator.currentVisit) { - this.visit(url, { action: "replace", shouldCacheSnapshot: false }); + const isCurrentUrl = url === document.baseURI; + if (!isRecentRequest && !this.navigator.currentVisit && isCurrentUrl) { + this.visit(url, { action: "replace", shouldCacheSnapshot: false, refresh: { method, scroll } }); } } @@ -5232,11 +5817,35 @@ Copyright © 2024 37signals LLC } setProgressBarDelay(delay) { + console.warn( + "Please replace `session.setProgressBarDelay(delay)` with `session.progressBarDelay = delay`. The function is deprecated and will be removed in a future version of Turbo.`" + ); + this.progressBarDelay = delay; } - setFormMode(mode) { - this.formMode = mode; + set progressBarDelay(delay) { + config.drive.progressBarDelay = delay; + } + + get progressBarDelay() { + return config.drive.progressBarDelay + } + + set drive(value) { + config.drive.enabled = value; + } + + get drive() { + return config.drive.enabled + } + + set formMode(value) { + config.forms.mode = value; + } + + get formMode() { + return config.forms.mode } get location() { @@ -5291,6 +5900,12 @@ Copyright © 2024 37signals LLC } } + historyPoppedWithEmptyState(location) { + this.history.replace(location); + this.view.lastRenderedLocation = location; + this.view.cacheSnapshot(); + } + // Scroll observer delegate scrollPositionChanged(position) { @@ -5310,7 +5925,8 @@ Copyright © 2024 37signals LLC canPrefetchRequestToLocation(link, location) { return ( this.elementIsNavigatable(link) && - locationIsVisitable(location, this.snapshot.rootLocation) + locationIsVisitable(location, this.snapshot.rootLocation) && + this.navigator.linkPrefetchingIsEnabledForLocation(location) ) } @@ -5334,7 +5950,7 @@ Copyright © 2024 37signals LLC // Navigator delegate allowsVisitingLocationWithAction(location, action) { - return this.locationWithActionIsSamePage(location, action) || this.applicationAllowsVisitingLocation(location) + return this.applicationAllowsVisitingLocation(location) } visitProposedToLocation(location, options) { @@ -5350,9 +5966,7 @@ Copyright © 2024 37signals LLC this.view.markVisitDirection(visit.direction); } extendURLWithDeprecatedProperties(visit.location); - if (!visit.silent) { - this.notifyApplicationAfterVisitingLocation(visit.location, visit.action); - } + this.notifyApplicationAfterVisitingLocation(visit.location, visit.action); } visitCompleted(visit) { @@ -5361,14 +5975,6 @@ Copyright © 2024 37signals LLC this.notifyApplicationAfterPageLoad(visit.getTimingMetrics()); } - locationWithActionIsSamePage(location, action) { - return this.navigator.locationWithActionIsSamePage(location, action) - } - - visitScrolledToSamePageLocation(oldURL, newURL) { - this.notifyApplicationAfterVisitingSamePageLocation(oldURL, newURL); - } - // Form submit observer delegate willSubmitForm(form, submitter) { @@ -5408,9 +6014,7 @@ Copyright © 2024 37signals LLC // Page view delegate viewWillCacheSnapshot() { - if (!this.navigator.currentVisit?.silent) { - this.notifyApplicationBeforeCachingSnapshot(); - } + this.notifyApplicationBeforeCachingSnapshot(); } allowsImmediateRender({ element }, options) { @@ -5502,15 +6106,6 @@ Copyright © 2024 37signals LLC }) } - notifyApplicationAfterVisitingSamePageLocation(oldURL, newURL) { - dispatchEvent( - new HashChangeEvent("hashchange", { - oldURL: oldURL.toString(), - newURL: newURL.toString() - }) - ); - } - notifyApplicationAfterFrameLoad(frame) { return dispatch("turbo:frame-load", { target: frame }) } @@ -5526,12 +6121,12 @@ Copyright © 2024 37signals LLC // Helpers submissionIsNavigatable(form, submitter) { - if (this.formMode == "off") { + if (config.forms.mode == "off") { return false } else { const submitterIsNavigatable = submitter ? this.elementIsNavigatable(submitter) : true; - if (this.formMode == "optin") { + if (config.forms.mode == "optin") { return submitterIsNavigatable && form.closest('[data-turbo="true"]') != null } else { return submitterIsNavigatable && this.elementIsNavigatable(form) @@ -5544,7 +6139,7 @@ Copyright © 2024 37signals LLC const withinFrame = findClosestRecursively(element, "turbo-frame"); // Check if Drive is enabled on the session or we're within a Frame. - if (this.drive || withinFrame) { + if (config.drive.enabled || withinFrame) { // Element is navigatable by default, unless `data-turbo="false"`. if (container) { return container.getAttribute("data-turbo") != "false" @@ -5596,7 +6191,9 @@ Copyright © 2024 37signals LLC }; const session = new Session(recentRequests); - const { cache, navigator: navigator$1 } = session; + + // Rename `navigator` to avoid shadowing `window.navigator` + const { cache, navigator: sessionNavigator } = session; /** * Starts the main session. @@ -5662,19 +6259,6 @@ Copyright © 2024 37signals LLC session.renderStreamMessage(message); } - /** - * Removes all entries from the Turbo Drive page cache. - * Call this when state has changed on the server that may affect cached pages. - * - * @deprecated since version 7.2.0 in favor of `Turbo.cache.clear()` - */ - function clearCache() { - console.warn( - "Please replace `Turbo.clearCache()` with `Turbo.cache.clear()`. The top-level function is deprecated and will be removed in a future version of Turbo.`" - ); - session.clearCache(); - } - /** * Sets the delay after which the progress bar will appear during navigation. * @@ -5686,36 +6270,75 @@ Copyright © 2024 37signals LLC * @param delay Time to delay in milliseconds */ function setProgressBarDelay(delay) { - session.setProgressBarDelay(delay); + console.warn( + "Please replace `Turbo.setProgressBarDelay(delay)` with `Turbo.config.drive.progressBarDelay = delay`. The top-level function is deprecated and will be removed in a future version of Turbo.`" + ); + config.drive.progressBarDelay = delay; } function setConfirmMethod(confirmMethod) { - FormSubmission.confirmMethod = confirmMethod; + console.warn( + "Please replace `Turbo.setConfirmMethod(confirmMethod)` with `Turbo.config.forms.confirm = confirmMethod`. The top-level function is deprecated and will be removed in a future version of Turbo.`" + ); + config.forms.confirm = confirmMethod; } function setFormMode(mode) { - session.setFormMode(mode); + console.warn( + "Please replace `Turbo.setFormMode(mode)` with `Turbo.config.forms.mode = mode`. The top-level function is deprecated and will be removed in a future version of Turbo.`" + ); + config.forms.mode = mode; + } + + /** + * Morph the state of the currentBody based on the attributes and contents of + * the newBody. Morphing body elements may dispatch turbo:morph, + * turbo:before-morph-element, turbo:before-morph-attribute, and + * turbo:morph-element events. + * + * @param currentBody HTMLBodyElement destination of morphing changes + * @param newBody HTMLBodyElement source of morphing changes + */ + function morphBodyElements(currentBody, newBody) { + MorphingPageRenderer.renderElement(currentBody, newBody); + } + + /** + * Morph the child elements of the currentFrame based on the child elements of + * the newFrame. Morphing turbo-frame elements may dispatch turbo:before-frame-morph, + * turbo:before-morph-element, turbo:before-morph-attribute, and + * turbo:morph-element events. + * + * @param currentFrame FrameElement destination of morphing children changes + * @param newFrame FrameElement source of morphing children changes + */ + function morphTurboFrameElements(currentFrame, newFrame) { + MorphingFrameRenderer.renderElement(currentFrame, newFrame); } var Turbo = /*#__PURE__*/Object.freeze({ __proto__: null, - navigator: navigator$1, - session: session, - cache: cache, PageRenderer: PageRenderer, PageSnapshot: PageSnapshot, FrameRenderer: FrameRenderer, fetch: fetchWithTurboHeaders, + config: config, + session: session, + cache: cache, + navigator: sessionNavigator, start: start, registerAdapter: registerAdapter, visit: visit, connectStreamSource: connectStreamSource, disconnectStreamSource: disconnectStreamSource, renderStreamMessage: renderStreamMessage, - clearCache: clearCache, setProgressBarDelay: setProgressBarDelay, setConfirmMethod: setConfirmMethod, - setFormMode: setFormMode + setFormMode: setFormMode, + morphBodyElements: morphBodyElements, + morphTurboFrameElements: morphTurboFrameElements, + morphChildren: morphChildren, + morphElements: morphElements }); class TurboFrameMissingError extends Error {} @@ -5727,6 +6350,7 @@ Copyright © 2024 37signals LLC #connected = false #hasBeenLoaded = false #ignoredAttributes = new Set() + #shouldMorphFrame = false action = null constructor(element) { @@ -5762,11 +6386,17 @@ Copyright © 2024 37signals LLC this.formLinkClickObserver.stop(); this.linkInterceptor.stop(); this.formSubmitObserver.stop(); + + if (!this.element.hasAttribute("recurse")) { + this.#currentFetchRequest?.cancel(); + } } } disabledChanged() { - if (this.loadingStyle == FrameLoadingStyle.eager) { + if (this.disabled) { + this.#currentFetchRequest?.cancel(); + } else if (this.loadingStyle == FrameLoadingStyle.eager) { this.#loadSourceURL(); } } @@ -5774,6 +6404,10 @@ Copyright © 2024 37signals LLC sourceURLChanged() { if (this.#isIgnoringChangesTo("src")) return + if (!this.sourceURL) { + this.#currentFetchRequest?.cancel(); + } + if (this.element.isConnected) { this.complete = false; } @@ -5784,7 +6418,10 @@ Copyright © 2024 37signals LLC } sourceURLReloaded() { - const { src } = this.element; + const { refresh, src } = this.element; + + this.#shouldMorphFrame = src && refresh === "morph"; + this.element.removeAttribute("complete"); this.element.src = null; this.element.src = src; @@ -5827,6 +6464,7 @@ Copyright © 2024 37signals LLC } } } finally { + this.#shouldMorphFrame = false; this.fetchResponseLoaded = () => Promise.resolve(); } } @@ -5871,15 +6509,18 @@ Copyright © 2024 37signals LLC } this.formSubmission = new FormSubmission(this, element, submitter); + const { fetchRequest } = this.formSubmission; - this.prepareRequest(fetchRequest); + const frame = this.#findFrameElement(element, submitter); + + this.prepareRequest(fetchRequest, frame); this.formSubmission.start(); } // Fetch request delegate - prepareRequest(request) { - request.headers["Turbo-Frame"] = this.id; + prepareRequest(request, frame = this) { + request.headers["Turbo-Frame"] = frame.id; if (this.currentNavigationElement?.hasAttribute("data-turbo-stream")) { request.acceptResponseType(StreamMessage.contentType); @@ -5951,6 +6592,7 @@ Copyright © 2024 37signals LLC detail: { newFrame, ...options }, cancelable: true }); + const { defaultPrevented, detail: { render } @@ -5991,10 +6633,11 @@ Copyright © 2024 37signals LLC async #loadFrameResponse(fetchResponse, document) { const newFrameElement = await this.extractForeignFrameElement(document.body); + const rendererClass = this.#shouldMorphFrame ? MorphingFrameRenderer : FrameRenderer; if (newFrameElement) { const snapshot = new Snapshot(newFrameElement); - const renderer = new FrameRenderer(this, this.view.snapshot, snapshot, FrameRenderer.renderElement, false, false); + const renderer = new rendererClass(this, this.view.snapshot, snapshot, false, false); if (this.view.renderPromise) await this.view.renderPromise; this.changeHistory(); @@ -6119,7 +6762,9 @@ Copyright © 2024 37signals LLC #findFrameElement(element, submitter) { const id = getAttribute("data-turbo-frame", submitter, element) || this.element.getAttribute("target"); - return getFrameElementById(id) ?? this.element + const target = this.#getFrameElementById(id); + + return target instanceof FrameElement ? target : this.element } async extractForeignFrameElement(container) { @@ -6163,9 +6808,11 @@ Copyright © 2024 37signals LLC } if (id) { - const frameElement = getFrameElementById(id); + const frameElement = this.#getFrameElementById(id); if (frameElement) { return !frameElement.disabled + } else if (id == "_parent") { + return false } } @@ -6186,8 +6833,12 @@ Copyright © 2024 37signals LLC return this.element.id } + get disabled() { + return this.element.disabled + } + get enabled() { - return !this.element.disabled + return !this.disabled } get sourceURL() { @@ -6247,13 +6898,15 @@ Copyright © 2024 37signals LLC callback(); delete this.currentNavigationElement; } - } - function getFrameElementById(id) { - if (id != null) { - const element = document.getElementById(id); - if (element instanceof FrameElement) { - return element + #getFrameElementById(id) { + if (id != null) { + const element = id === "_parent" ? + this.element.parentElement.closest("turbo-frame") : + document.getElementById(id); + if (element instanceof FrameElement) { + return element + } } } } @@ -6278,6 +6931,7 @@ Copyright © 2024 37signals LLC const StreamActions = { after() { + this.removeDuplicateTargetSiblings(); this.targetElements.forEach((e) => e.parentElement?.insertBefore(this.templateContent, e.nextSibling)); }, @@ -6287,6 +6941,7 @@ Copyright © 2024 37signals LLC }, before() { + this.removeDuplicateTargetSiblings(); this.targetElements.forEach((e) => e.parentElement?.insertBefore(this.templateContent, e)); }, @@ -6325,7 +6980,11 @@ Copyright © 2024 37signals LLC }, refresh() { - session.refresh(this.baseURI, this.requestId); + const method = this.getAttribute("method"); + const requestId = this.requestId; + const scroll = this.getAttribute("scroll"); + + session.refresh(this.baseURI, { method, requestId, scroll }); } }; @@ -6397,7 +7056,24 @@ Copyright © 2024 37signals LLC * Gets the list of duplicate children (i.e. those with the same ID) */ get duplicateChildren() { - const existingChildren = this.targetElements.flatMap((e) => [...e.children]).filter((c) => !!c.id); + const existingChildren = this.targetElements.flatMap((e) => [...e.children]).filter((c) => !!c.getAttribute("id")); + const newChildrenIds = [...(this.templateContent?.children || [])].filter((c) => !!c.getAttribute("id")).map((c) => c.getAttribute("id")); + + return existingChildren.filter((c) => newChildrenIds.includes(c.getAttribute("id"))) + } + + /** + * Removes duplicate siblings (by ID) + */ + removeDuplicateTargetSiblings() { + this.duplicateSiblings.forEach((c) => c.remove()); + } + + /** + * Gets the list of duplicate siblings (i.e. those with the same ID) + */ + get duplicateSiblings() { + const existingChildren = this.targetElements.flatMap((e) => [...e.parentElement.children]).filter((c) => !!c.id); const newChildrenIds = [...(this.templateContent?.children || [])].filter((c) => !!c.id).map((c) => c.id); return existingChildren.filter((c) => newChildrenIds.includes(c.id)) @@ -6554,11 +7230,11 @@ Copyright © 2024 37signals LLC } (() => { - let element = document.currentScript; - if (!element) return - if (element.hasAttribute("data-turbo-suppress-warning")) return + const scriptElement = document.currentScript; + if (!scriptElement) return + if (scriptElement.hasAttribute("data-turbo-suppress-warning")) return - element = element.parentElement; + let element = scriptElement.parentElement; while (element) { if (element == document.body) { return console.warn( @@ -6572,7 +7248,7 @@ Copyright © 2024 37signals LLC —— Suppress this warning by adding a "data-turbo-suppress-warning" attribute to: %s `, - element.outerHTML + scriptElement.outerHTML ) } @@ -6596,14 +7272,18 @@ Copyright © 2024 37signals LLC exports.StreamElement = StreamElement; exports.StreamSourceElement = StreamSourceElement; exports.cache = cache; - exports.clearCache = clearCache; + exports.config = config; exports.connectStreamSource = connectStreamSource; exports.disconnectStreamSource = disconnectStreamSource; exports.fetch = fetchWithTurboHeaders; exports.fetchEnctypeFromString = fetchEnctypeFromString; exports.fetchMethodFromString = fetchMethodFromString; exports.isSafe = isSafe; - exports.navigator = navigator$1; + exports.morphBodyElements = morphBodyElements; + exports.morphChildren = morphChildren; + exports.morphElements = morphElements; + exports.morphTurboFrameElements = morphTurboFrameElements; + exports.navigator = sessionNavigator; exports.registerAdapter = registerAdapter; exports.renderStreamMessage = renderStreamMessage; exports.session = session; diff --git a/node_modules/@hotwired/turbo/package.json b/node_modules/@hotwired/turbo/package.json index 28ef82bfff..f588760764 100644 --- a/node_modules/@hotwired/turbo/package.json +++ b/node_modules/@hotwired/turbo/package.json @@ -1,6 +1,6 @@ { "name": "@hotwired/turbo", - "version": "8.0.5", + "version": "8.0.23", "description": "The speed of a single-page web application without having to write any JavaScript", "module": "dist/turbo.es2017-esm.js", "main": "dist/turbo.es2017-umd.js", @@ -34,18 +34,17 @@ }, "devDependencies": { "@open-wc/testing": "^3.1.7", - "@playwright/test": "^1.28.0", + "@playwright/test": "~1.51.1", "@rollup/plugin-node-resolve": "13.1.3", "@web/dev-server-esbuild": "^0.3.3", "@web/test-runner": "^0.15.0", "@web/test-runner-playwright": "^0.9.0", "arg": "^5.0.1", "body-parser": "^1.20.1", - "chai": "~4.3.4", "eslint": "^8.13.0", "express": "^4.18.2", - "idiomorph": "https://github.com/bigskysoftware/idiomorph.git", - "multer": "^1.4.2", + "idiomorph": "~0.7.4", + "multer": "^2.0.2", "rollup": "^2.35.1" }, "scripts": { @@ -59,10 +58,10 @@ "test:browser": "playwright test", "test:unit": "NODE_OPTIONS=--inspect web-test-runner", "test:unit:win": "SET NODE_OPTIONS=--inspect & web-test-runner", - "release": "yarn build && npm publish", + "release": "yarn build && yarn publish", "lint": "eslint . --ext .js" }, "engines": { - "node": ">= 14" + "node": ">= 18" } } diff --git a/package-lock.json b/package-lock.json index 4831f6e001..9f75a49938 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "dependencies": { "@cityssm/fa5-power-transforms-css": "github:cityssm/fa5-power-transforms-css", "@fontsource/raleway": "^4.5.0", - "@hotwired/turbo": "^8.0.5", + "@hotwired/turbo": "^8.0.23", "@popperjs/core": "^2.11.8", "@ungap/custom-elements": "^1.3.0", "ace-builds": "^1.32.7", @@ -51,11 +51,12 @@ "integrity": "sha512-Rzj90wbZQnNzazqzoiu5HzMEMdqMJLUVFOo699sinTXrZRm1aB5iX2HTiK2VlPnH4M6u8yYnJ7CebOyamfWlqw==" }, "node_modules/@hotwired/turbo": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@hotwired/turbo/-/turbo-8.0.5.tgz", - "integrity": "sha512-TdZDA7fxVQ2ZycygvpnzjGPmFq4sO/E2QVg+2em/sJ3YTSsIWVEis8HmWlumz+c9DjWcUkcCuB+muF08TInpAQ==", + "version": "8.0.23", + "resolved": "https://registry.npmjs.org/@hotwired/turbo/-/turbo-8.0.23.tgz", + "integrity": "sha512-GZ7cijxEZ6Ig71u7rD6LHaRv/wcE/hNsc+nEfiWOkLNqUgLOwo5MNGWOy5ZV9ZUDSiQx1no7YxjTNnT4O6//cQ==", + "license": "MIT", "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@orchidjs/sifter": { @@ -362,9 +363,9 @@ "integrity": "sha512-Rzj90wbZQnNzazqzoiu5HzMEMdqMJLUVFOo699sinTXrZRm1aB5iX2HTiK2VlPnH4M6u8yYnJ7CebOyamfWlqw==" }, "@hotwired/turbo": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@hotwired/turbo/-/turbo-8.0.5.tgz", - "integrity": "sha512-TdZDA7fxVQ2ZycygvpnzjGPmFq4sO/E2QVg+2em/sJ3YTSsIWVEis8HmWlumz+c9DjWcUkcCuB+muF08TInpAQ==" + "version": "8.0.23", + "resolved": "https://registry.npmjs.org/@hotwired/turbo/-/turbo-8.0.23.tgz", + "integrity": "sha512-GZ7cijxEZ6Ig71u7rD6LHaRv/wcE/hNsc+nEfiWOkLNqUgLOwo5MNGWOy5ZV9ZUDSiQx1no7YxjTNnT4O6//cQ==" }, "@orchidjs/sifter": { "version": "1.1.0", diff --git a/package.json b/package.json index e596d79a67..93f48cafb4 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "dependencies": { "@cityssm/fa5-power-transforms-css": "github:cityssm/fa5-power-transforms-css", "@fontsource/raleway": "^4.5.0", - "@hotwired/turbo": "^8.0.5", + "@hotwired/turbo": "^8.0.23", "@popperjs/core": "^2.11.8", "@ungap/custom-elements": "^1.3.0", "ace-builds": "^1.32.7", diff --git a/setup/backup.class.inc.php b/setup/backup.class.inc.php index b4a511ed91..f2abb661f3 100644 --- a/setup/backup.class.inc.php +++ b/setup/backup.class.inc.php @@ -511,7 +511,7 @@ EOF; { $bDbTlsEnabled = $oConfig->Get('db_tls.enabled'); if (!$bDbTlsEnabled) { - return CMDBSource::IsSslModeDBVersion() ? ' --skip-ssl' : ''; + return ''; } $sTlsOptions = ''; // Mysql 5.7.11 and upper deprecated --ssl and uses --ssl-mode instead diff --git a/setup/licenses/community-licenses.xml b/setup/licenses/community-licenses.xml index ddae8319c0..398ce73208 100644 --- a/setup/licenses/community-licenses.xml +++ b/setup/licenses/community-licenses.xml @@ -2643,6 +2643,58 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + ]]> + + + doctrine/lexer + Guilherme Blanco - Roman Borschel - Johannes Schmitt + MIT + + + + egulias/email-validator + Eduardo Gulias Davis + MIT + @@ -2778,204 +2830,6 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ]]> - - - laminas/laminas-loader - - BSD-3-Clause - - - - laminas/laminas-mail - - BSD-3-Clause - - - - laminas/laminas-mime - - BSD-3-Clause - - - - laminas/laminas-servicemanager - - BSD-3-Clause - - - - laminas/laminas-stdlib - - BSD-3-Clause - - - - laminas/laminas-validator - - BSD-3-Clause - @@ -2985,7 +2839,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2013-2023 Alex Bilbie Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -3032,79 +2886,6 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ]]> - - - masterminds/html5 - Matt Butcher - Matt Farina - Asmir Mustafic - MIT - @@ -3141,34 +2922,6 @@ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ]]> - - - paragonie/random_compat - Paragon Initiative Enterprises - MIT - @@ -3499,7 +3252,7 @@ SOFTWARE. sabberworm/php-css-parser - Raphael Schweikert + Raphael Schweikert - Oliver Klee - Jake Hotson MIT + + + soundasleep/html2text + Jevon Wright + MIT + @@ -3985,6 +3766,58 @@ to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + ]]> + + + symfony/mailer + Fabien Potencier - Symfony Community + MIT + + + + symfony/mime + Fabien Potencier - Symfony Community + MIT + - - - symfony/polyfill-php72 - Nicolas Grekas - Symfony Community - MIT - - - - symfony/polyfill-php80 - Ion Bazan - Nicolas Grekas - Symfony Community - MIT - - - - webmozart/assert - Bernhard Schussek - MIT - diff --git a/setup/setuputils.class.inc.php b/setup/setuputils.class.inc.php index c9457ba32b..d04ceb525f 100644 --- a/setup/setuputils.class.inc.php +++ b/setup/setuputils.class.inc.php @@ -104,7 +104,7 @@ class CheckResult class SetupUtils { // -- Minimum versions (requirements : forbids installation if not met) - public const PHP_MIN_VERSION = '8.1.0'; + public const PHP_MIN_VERSION = '8.2.0'; public const MYSQL_MIN_VERSION = '5.7.0'; // 5.6 is no longer supported public const MYSQL_NOT_VALIDATED_VERSION = ''; // MySQL 8 is now OK (N°2010 in 2.7.0) but has no query cache so mind the perf on large volumes ! diff --git a/sources/Core/Email/EmailSymfony.php b/sources/Core/Email/EmailSymfony.php index ba10234ee8..e397345c4d 100644 --- a/sources/Core/Email/EmailSymfony.php +++ b/sources/Core/Email/EmailSymfony.php @@ -389,8 +389,28 @@ class EMailSymfony extends Email */ public function SetBody($sBody, $sMimeType = 'text/html', $sCustomStyles = null) { + // Some mime types can have options, let's retrieve the different parts so we can extract the primary mime type + $aMimeTypeParts = array_map('trim', explode(';', $sMimeType)); + $sPrimaryMimeType = strtolower(array_shift($aMimeTypeParts)); + + $aMimeTypeParams = []; + foreach ($aMimeTypeParts as $sPart) { + // Parse key=value parameters (eg method=REQUEST, charset=UTF-8) after the semicolon. + // Stored in $aMimeTypeParams so they can be added to the Content-Type header. + if ($sPart === '') { + continue; + } + $aPair = explode('=', $sPart, 2); + $sKey = strtolower(trim($aPair[0])); + // Normalize and unquote the parameter value for Content-Type (eg charset=UTF-8). + $sValue = isset($aPair[1]) ? trim($aPair[1], " \t\n\r\0\x0B\"") : ''; + if ($sKey !== '') { + $aMimeTypeParams[$sKey] = $sValue; + } + } + // Inline CSS if needed - if ($sMimeType === 'text/html') { + if ($sPrimaryMimeType === 'text/html') { $sBody = static::InlineCssIntoBodyContent($sBody, $sCustomStyles); } @@ -399,7 +419,7 @@ class EMailSymfony extends Email $oTextPart = new TextPart(strip_tags($sBody), 'utf-8', 'plain', 'base64'); // Embed inline images and store them in attachments (so BuildSymfonyMessageFromInternal can pick them) - if ($sMimeType === 'text/html') { + if ($sPrimaryMimeType === 'text/html') { $aAdditionalParts = $this->EmbedInlineImages($sBody); $oHtmlPart = new TextPart($sBody, 'utf-8', 'html', 'base64'); $oAlternativePart = new AlternativePart($oHtmlPart, $oTextPart); @@ -411,8 +431,20 @@ class EMailSymfony extends Email $oRootPart = new RelatedPart(...$aRelatedParts); } } else { - // Default root part is the text body - $oRootPart = $oTextPart; + // Default root part is a TextPart with the right mimetype + $sSubtype = 'plain'; + // Extract subtype for text/* content; default to plain otherwise. + if (strpos($sPrimaryMimeType, '/') !== false) { + list($sType, $sSubtype) = explode('/', $sPrimaryMimeType, 2); + if ($sType !== 'text') { + $sSubtype = 'plain'; + } + } + $oRootPart = new TextPart($sBody, 'utf-8', $sSubtype, 'base64'); + // Add parsed Content-Type parameters like method/charset if provided. + if (!empty($aMimeTypeParams)) { + $oRootPart->getHeaders()->addParameterizedHeader('Content-Type', $sPrimaryMimeType, $aMimeTypeParams); + } } $this->m_oMessage->setBody($oRootPart); @@ -432,9 +464,13 @@ class EMailSymfony extends Email /** * Add a new part to the existing body + * + * @deprecated 3.2.3 3.3.0 N°9549 This worked with the previous mail lib (Laminas) but it no longer works with SymfonyMailer and needs to be split in specific methods */ public function AddPart($sText, $sMimeType = 'text/html') { + \DeprecatedCallsLog::NotifyDeprecatedPhpMethod('No generic alternative yet, if you want to add an attachment use `self::AddAttachment()`'); + $sMimeSubtype = $this->GetMimeSubtype($sMimeType); if (!array_key_exists('parts', $this->m_aData)) { diff --git a/templates/base/components/title/layout.html.twig b/templates/base/components/title/layout.html.twig index 288662831b..8b67bdf46e 100644 --- a/templates/base/components/title/layout.html.twig +++ b/templates/base/components/title/layout.html.twig @@ -2,7 +2,9 @@
{% if oUIBlock.HasIcon() %}
-
+
{% endif %}
diff --git a/tests/manual-visual-tests/Backoffice/RenderAllUiBlocks.php b/tests/manual-visual-tests/Backoffice/RenderAllUiBlocks.php index b77b7898e0..2aac9ef2f0 100644 --- a/tests/manual-visual-tests/Backoffice/RenderAllUiBlocks.php +++ b/tests/manual-visual-tests/Backoffice/RenderAllUiBlocks.php @@ -22,6 +22,7 @@ namespace Combodo\iTop\Test\VisualTest\Backoffice; +use Combodo\iTop\Application\Branding; use Combodo\iTop\Application\UI\Base\Component\Alert\AlertUIBlockFactory; use Combodo\iTop\Application\UI\Base\Component\Badge\Badge; use Combodo\iTop\Application\UI\Base\Component\Badge\BadgeUIBlockFactory; @@ -411,7 +412,8 @@ $oPage->AddUiBlock(TitleUIBlockFactory::MakeNeutral('Title example 1', 1)); $oPage->AddUiBlock(TitleUIBlockFactory::MakeNeutral('Title example 2', 2)); $oPage->AddUiBlock(TitleUIBlockFactory::MakeNeutral('Title example 3', 3)); $oPage->AddUiBlock(TitleUIBlockFactory::MakeNeutral('Title example 4', 4)); -$oPage->AddUiBlock(TitleUIBlockFactory::MakeNeutral('Title example 5', 5)); +$oPage->AddUiBlock(TitleUIBlockFactory::MakeForPageWithIcon('Title example 5', MetaModel::GetClassIcon('Organization', false))); +$oPage->AddUiBlock(TitleUIBlockFactory::MakeForPageWithIcon('Title example 6', Branding::GetFullMainLogoAbsoluteUrl())); ///////// // DataTable diff --git a/tests/php-unit-tests/unitary-tests/setup/DBBackupTest.php b/tests/php-unit-tests/unitary-tests/setup/DBBackupTest.php index a047556852..5b75d79f8f 100644 --- a/tests/php-unit-tests/unitary-tests/setup/DBBackupTest.php +++ b/tests/php-unit-tests/unitary-tests/setup/DBBackupTest.php @@ -45,11 +45,7 @@ class DBBackupTest extends ItopTestCase $oConfigToTest->Set('db_tls.enabled', false); $sCliArgsNoTls = DBBackup::GetMysqlCliTlsOptions($oConfigToTest); - if (CMDBSource::IsSslModeDBVersion()) { - $this->assertEquals(' --skip-ssl', $sCliArgsNoTls); - } else { - $this->assertEmpty($sCliArgsNoTls); - } + $this->assertEmpty($sCliArgsNoTls); } /** diff --git a/webservices/export.php b/webservices/export.php deleted file mode 100644 index e69de29bb2..0000000000