services:
    _defaults:
        autoconfigure: true

    _instanceof:
        Contao\CoreBundle\Framework\FrameworkAwareInterface:
            calls:
                - [setFramework, ['@contao.framework']]

    contao.altcha:
        class: Contao\CoreBundle\Altcha\Altcha
        public: true
        arguments:
            - '@contao.repository.altcha'
            - '@doctrine.orm.entity_manager'
            - '%kernel.secret%'
            - SHA-256
            - 100000
            - 86400

    contao.assets.assets_context:
        class: Contao\CoreBundle\Asset\ContaoContext
        public: true
        arguments:
            - '@request_stack'
            - staticPlugins
            - '%kernel.debug%'

    contao.assets.files_context:
        class: Contao\CoreBundle\Asset\ContaoContext
        public: true
        arguments:
            - '@request_stack'
            - staticFiles
            - '%kernel.debug%'

    contao.cache.clearer:
        class: Contao\CoreBundle\Cache\ContaoCacheClearer
        public: true
        arguments:
            - '@filesystem'

    contao.cache.entity_tags:
        class: Contao\CoreBundle\Cache\EntityCacheTags
        public: true
        arguments:
            - '@contao.cache.tag_manager'
        deprecated:
            package: contao/core-bundle
            version: 5.5

    contao.cache.tag_manager:
        class: Contao\CoreBundle\Cache\CacheTagManager
        public: true
        arguments:
            - '@doctrine.orm.default_entity_manager'
            - '@event_dispatcher'
            - '@?fos_http_cache.http.symfony_response_tagger'
            - '@?fos_http_cache.cache_manager'

    contao.cache.warmer:
        class: Contao\CoreBundle\Cache\ContaoCacheWarmer
        public: true
        arguments:
            - '@filesystem'
            - '@contao.resource_finder'
            - '@contao.resource_locator'
            - '%kernel.project_dir%'
            - '@database_connection'
            - '@contao.framework'
            - '@translator'
            - '@contao.intl.locales'

    contao.controller_resolver:
        class: Contao\CoreBundle\HttpKernel\ControllerResolver
        decorates: controller_resolver
        arguments:
            - '@contao.controller_resolver.inner'
            - '@contao.fragment.registry'

    contao.cors.website_roots_config_provider:
        class: Contao\CoreBundle\Cors\WebsiteRootsConfigProvider
        arguments:
            - '@database_connection'
        tags:
            - nelmio_cors.options_provider

    contao.crawl.escargot.broken_link_checker_subscriber:
        class: Contao\CoreBundle\Crawl\Escargot\Subscriber\BrokenLinkCheckerSubscriber
        arguments:
            - '@translator'

    contao.crawl.escargot.factory:
        class: Contao\CoreBundle\Crawl\Escargot\Factory
        public: true
        arguments:
            - '@database_connection'
            - '@contao.framework'
            - '@contao.routing.content_url_generator'
            - '@request_stack'

    contao.crawl.escargot.search_index_subscriber:
        class: Contao\CoreBundle\Crawl\Escargot\Subscriber\SearchIndexSubscriber
        arguments:
            - '@contao.search.indexer'
            - '@translator'

    contao.cron:
        class: Contao\CoreBundle\Cron\Cron
        public: true
        arguments:
            - !service_closure '@contao.repository.cron_job'
            - !service_closure '@doctrine.orm.entity_manager'
            - '@cache.app'
            - '@?logger'

    contao.cron.purge_expired_altcha_challenges:
        class: Contao\CoreBundle\Cron\PurgeExpiredAltchaChallengesCron
        arguments:
            - '@contao.repository.altcha'

    contao.cron.purge_expired_data:
        class: Contao\CoreBundle\Cron\PurgeExpiredDataCron
        arguments:
            - '@contao.framework'
            - '@database_connection'

    contao.cron.purge_opt_in_tokens:
        class: Contao\CoreBundle\Cron\PurgeOptInTokensCron
        arguments:
            - '@contao.opt_in'
            - '@?monolog.logger.contao.cron'

    contao.cron.purge_preview_links:
        class: Contao\CoreBundle\Cron\PurgePreviewLinksCron
        arguments:
            - '@database_connection'

    contao.cron.purge_registrations:
        class: Contao\CoreBundle\Cron\PurgeRegistrationsCron
        arguments:
            - '@contao.framework'
            - '@?monolog.logger.contao.cron'

    contao.cron.purge_temp_folder:
        class: Contao\CoreBundle\Cron\PurgeTempFolderCron
        arguments:
            - '@filesystem'
            - '%kernel.project_dir%'
            - '@monolog.logger.contao.cron'

    contao.cron.supervise_workers:
        class: Contao\CoreBundle\Cron\SuperviseWorkersCron
        arguments:
            - '@contao.process_util'

    contao.csp.parser:
        class: Contao\CoreBundle\Csp\CspParser
        arguments:
            - '@contao.csp.policy_manager'

    contao.csp.policy_manager:
        class: Nelmio\SecurityBundle\ContentSecurityPolicy\PolicyManager

    contao.csp.wysiwyg_style_processor:
        class: Contao\CoreBundle\Csp\WysiwygStyleProcessor
        public: true
        arguments:
            - []

    contao.csrf.token_manager:
        class: Contao\CoreBundle\Csrf\ContaoCsrfTokenManager
        public: true
        arguments:
            - '@request_stack'
            - '%contao.csrf_cookie_prefix%'
            - '@security.csrf.token_generator'
            - '@contao.csrf.token_storage'
            - ~
            - '%contao.csrf_token_name%'

    contao.csrf.token_storage:
        class: Contao\CoreBundle\Csrf\MemoryTokenStorage

    contao.data_collector:
        class: Contao\CoreBundle\DataCollector\ContaoDataCollector
        arguments:
            - '@contao.security.token_checker'
            - '@request_stack'
            - '@contao.image.imagine'
            - '@router'
            - '@contao.routing.page_finder'
        tags:
            - { name: data_collector, template: '@Contao/web_debug_toolbar/contao_collector.html.twig', id: contao }

    contao.data_container.buttons_builder:
        class: Contao\CoreBundle\DataContainer\ButtonsBuilder
        public: true
        arguments:
            - '@twig'

    contao.data_container.clipboard_manager:
        class: Contao\CoreBundle\DataContainer\ClipboardManager
        public: true
        arguments:
            - '@contao.framework'
            - '@request_stack'

    contao.data_container.dca_request_switcher:
        class: Contao\CoreBundle\DataContainer\DcaRequestSwitcher
        public: true
        arguments:
            - '@contao.framework'
            - '@request_stack'

    contao.data_container.dca_url_analyzer:
        class: Contao\CoreBundle\DataContainer\DcaUrlAnalyzer
        public: true
        arguments:
            - '@contao.framework'
            - '@security.helper'
            - '@router'
            - '@contao.translation.translator'
            - '@contao.data_container.record_labeler'
            - '@contao.data_container.dca_request_switcher'

    contao.data_container.global_operations_builder:
        class: Contao\CoreBundle\DataContainer\DataContainerGlobalOperationsBuilder
        public: true
        arguments:
            - '@contao.framework'
            - '@twig'
            - '@router'
            - '@translator'

    contao.data_container.operations_builder:
        class: Contao\CoreBundle\DataContainer\DataContainerOperationsBuilder
        public: true
        arguments:
            - '@contao.framework'
            - '@twig'
            - '@security.helper'
            - '@router'

    contao.data_container.palette_builder:
        class: Contao\CoreBundle\DataContainer\PaletteBuilder
        public: true
        arguments:
            - '@contao.framework'
            - '@request_stack'
            - '@security.helper'
            - '@database_connection'

    contao.data_container.record_labeler:
        class: Contao\CoreBundle\DataContainer\RecordLabeler
        public: true
        arguments:
            - '@event_dispatcher'

    contao.doctrine.backup.dumper:
        class: Contao\CoreBundle\Doctrine\Backup\Dumper

    contao.doctrine.backup.retention_policy:
        class: Contao\CoreBundle\Doctrine\Backup\RetentionPolicy
        arguments:
            - 0

    contao.doctrine.backup_manager:
        class: Contao\CoreBundle\Doctrine\Backup\BackupManager
        arguments:
            - '@database_connection'
            - '@contao.doctrine.backup.dumper'
            - '@contao.filesystem.virtual.backups'
            - []
            - '@contao.doctrine.backup.retention_policy'

    contao.doctrine.dca_schema_provider:
        class: Contao\CoreBundle\Doctrine\Schema\DcaSchemaProvider
        arguments:
            - '@contao.framework'
            - '@doctrine'

    contao.doctrine.orm.fail_tolerant_proxy_cache_warmer:
        class: Contao\CoreBundle\Doctrine\ORM\FailTolerantProxyCacheWarmer
        decorates: doctrine.orm.proxy_cache_warmer
        arguments:
            - '@contao.doctrine.orm.fail_tolerant_proxy_cache_warmer.inner'
            - '@database_connection'

    contao.doctrine.schema.mysql_innodb_row_size_calculator:
        class: Contao\CoreBundle\Doctrine\Schema\MysqlInnodbRowSizeCalculator
        arguments:
            - '@database_connection'

    contao.doctrine.schema_provider:
        class: Contao\CoreBundle\Doctrine\Schema\SchemaProvider
        public: true
        arguments:
            - '@doctrine.orm.default_entity_manager'

    contao.feed.feedio:
        class: FeedIo\FeedIo
        arguments:
            - '@contao.feed.http_adapter'

    contao.feed.http_adapter:
        class: FeedIo\Adapter\Http\Client
        arguments:
            - '@psr18.http_client'

    contao.filesystem.dbafs_factory:
        class: Contao\CoreBundle\Filesystem\Dbafs\DbafsFactory
        arguments:
            - '@database_connection'
            - '@event_dispatcher'

    contao.filesystem.dbafs_manager:
        class: Contao\CoreBundle\Filesystem\Dbafs\DbafsManager
        public: true
        arguments:
            - '@event_dispatcher'

    contao.filesystem.file_download_helper:
        class: Contao\CoreBundle\Filesystem\FileDownloadHelper
        arguments:
            - '@uri_signer'

    contao.filesystem.mount_manager:
        class: Contao\CoreBundle\Filesystem\MountManager
        arguments:
            - !tagged_iterator contao.public_file_uri_provider

    contao.filesystem.public_uri.flysystem_default_provider:
        class: Contao\CoreBundle\Filesystem\PublicUri\FlysystemDefaultProvider
        tags:
            - { name: contao.public_file_uri_provider }

    contao.filesystem.public_uri.symlinked_local_files_provider:
        class: Contao\CoreBundle\Filesystem\PublicUri\SymlinkedLocalFilesProvider
        arguments:
            - '@contao.filesystem.adapter.files'
            - '%contao.upload_path%'
            - '@request_stack'
        tags:
            - { name: contao.public_file_uri_provider }

    contao.filesystem.virtual_factory:
        class: Contao\CoreBundle\Filesystem\VirtualFilesystemFactory
        arguments:
            - '@contao.filesystem.mount_manager'
            - '@contao.filesystem.dbafs_manager'

    contao.fragment.compositor:
        class: Contao\CoreBundle\Fragment\FragmentCompositor
        public: true

    contao.fragment.forward_renderer:
        class: Contao\CoreBundle\Fragment\ForwardFragmentRenderer
        arguments:
            - '@http_kernel'
            - '@event_dispatcher'
        calls:
            - [setFragmentPath, ['%fragment.path%']]
        tags:
            - { name: kernel.fragment_renderer, alias: forward }

    contao.fragment.handler:
        class: Contao\CoreBundle\Fragment\FragmentHandler
        decorates: fragment.handler
        arguments:
            - !tagged_locator { tag: kernel.fragment_renderer, index_by: alias }
            - '@contao.fragment.handler.inner'
            - '@request_stack'
            - '@contao.fragment.registry'
            - '@contao.fragment.pre_handlers'
            - '@contao.routing.page_finder'
            - '%kernel.debug%'

    contao.fragment.pre_handlers:
        class: Symfony\Component\DependencyInjection\ServiceLocator
        arguments:
            - []

    contao.fragment.registry:
        class: Contao\CoreBundle\Fragment\FragmentRegistry
        public: true

    contao.framework:
        class: Contao\CoreBundle\Framework\ContaoFramework
        public: true
        arguments:
            - '@request_stack'
            - '%kernel.project_dir%'
            - '%contao.error_level%'
        calls:
            - [setContainer, ['@service_container']]

    contao.image.deferred_image_storage:
        class: Contao\Image\DeferredImageStorageFilesystem
        arguments:
            - '%kernel.project_dir%/var/deferred-images'
            - '@?filesystem'

    contao.image.factory:
        class: Contao\CoreBundle\Image\ImageFactory
        public: true
        arguments:
            - '@contao.image.resizer'
            - '@contao.image.imagine'
            - '@contao.image.imagine_svg'
            - '@filesystem'
            - '@contao.framework'
            - '%contao.image.bypass_cache%'
            - '%contao.image.imagine_options%'
            - '%contao.image.valid_extensions%'
            - '%kernel.project_dir%/%contao.upload_path%'
        tags:
            - { name: monolog.logger, channel: contao.error }

    contao.image.fallback_preview_provider:
        class: Contao\CoreBundle\Image\Preview\FallbackPreviewProvider
        tags:
            - { name: contao.preview_provider, priority: -1024 }

    contao.image.imagine.gd:
        class: Imagine\Gd\Imagine

    contao.image.imagine.gmagick:
        class: Imagine\Gmagick\Imagine

    contao.image.imagine.imagick:
        class: Imagine\Imagick\Imagine

    contao.image.imagine_preview_provider:
        class: Contao\CoreBundle\Image\Preview\ImaginePreviewProvider
        arguments:
            - '@contao.image.imagine'
        tags:
            - { name: contao.preview_provider, priority: 0 }

    contao.image.imagine_svg:
        class: Contao\ImagineSvg\Imagine
        public: true

    contao.image.metadata:
        class: Contao\Image\Metadata\MetadataReaderWriter
        public: true
        arguments:
            - !tagged_iterator contao.image.metadata_format
            - !tagged_iterator contao.image.metadata_container

    contao.image.picture_factory:
        class: Contao\CoreBundle\Image\PictureFactory
        public: true
        arguments:
            - '@contao.image.picture_generator'
            - '@contao.image.factory'
            - '@contao.framework'
            - '%contao.image.bypass_cache%'
            - '%contao.image.imagine_options%'

    contao.image.picture_generator:
        class: Contao\Image\PictureGenerator
        public: true
        arguments:
            - '@contao.image.resizer'
            - '@?contao.image.resize_calculator'

    contao.image.preview_factory:
        class: Contao\CoreBundle\Image\Preview\PreviewFactory
        public: true
        arguments:
            - !tagged_iterator contao.preview_provider
            - '@contao.image.factory'
            - '@contao.image.picture_factory'
            - '@contao.image.studio'
            - '@contao.framework'
            - '%kernel.secret%'
            - '%contao.image.preview.target_dir%'
            - '%contao.image.valid_extensions%'
            - '%contao.image.preview.default_size%'
            - '%contao.image.preview.max_size%'

    contao.image.resizer:
        class: Contao\CoreBundle\Image\Resizer
        public: true
        arguments:
            - '%contao.image.target_dir%'
            - '%kernel.secret%'
            - '@contao.image.resize_calculator'
            - '@filesystem'
            - '@contao.image.deferred_image_storage'
            - '@contao.image.metadata'

    contao.image.resize_calculator:
        class: Contao\Image\ResizeCalculator

    contao.image.sizes:
        class: Contao\CoreBundle\Image\ImageSizes
        public: true
        arguments:
            - '@database_connection'
            - '@event_dispatcher'
            - '@contao.translation.translator'

    contao.image.studio:
        class: Contao\CoreBundle\Image\Studio\Studio
        public: true
        arguments:
            - !service_locator
              contao.image.studio: '@contao.image.studio'
              contao.image.picture_factory: '@contao.image.picture_factory'
              contao.image.factory: '@contao.image.factory'
              contao.image.resizer: '@contao.image.resizer'
              contao.assets.files_context: '@contao.assets.files_context'
              contao.routing.page_finder: '@contao.routing.page_finder'
              contao.framework: '@contao.framework'
              contao.filesystem.virtual.files: '@contao.filesystem.virtual.files'
              contao.insert_tag.parser: '@contao.insert_tag.parser'
              event_dispatcher: '@event_dispatcher'
            - '%kernel.project_dir%'
            - '%contao.upload_path%'
            - '%contao.web_dir%'
            - '%contao.image.valid_extensions%'

    contao.image.studio.figure_renderer:
        class: Contao\CoreBundle\Image\Studio\FigureRenderer
        public: true
        arguments:
            - '@contao.image.studio'
            - '@twig'

    contao.insert_tag.format_flag:
        class: Contao\CoreBundle\InsertTag\Flag\FormatFlag

    contao.insert_tag.parser:
        class: Contao\CoreBundle\InsertTag\InsertTagParser
        public: true
        arguments:
            - '@contao.framework'
            - '@monolog.logger.contao.error'
            - '@fragment.handler'
            - ~
            - '%contao.insert_tags.allowed_tags%'
            - '@?fos_http_cache.http.symfony_response_tagger'
            - '@contao.listener.subrequest_cache'

    contao.insert_tag.php_function_flag:
        class: Contao\CoreBundle\InsertTag\Flag\PhpFunctionFlag

    contao.insert_tag.resolver.asset:
        class: Contao\CoreBundle\InsertTag\Resolver\AssetInsertTag
        arguments:
            - '@assets.packages'

    contao.insert_tag.resolver.date:
        class: Contao\CoreBundle\InsertTag\Resolver\DateInsertTag
        arguments:
            - '@contao.framework'

    contao.insert_tag.resolver.empty:
        class: Contao\CoreBundle\InsertTag\Resolver\EmptyInsertTag

    contao.insert_tag.resolver.form:
        class: Contao\CoreBundle\InsertTag\Resolver\FormInsertTag
        arguments:
            - '@request_stack'

    contao.insert_tag.resolver.format_date:
        class: Contao\CoreBundle\InsertTag\Resolver\FormatDateInsertTag
        arguments:
            - '@contao.framework'
            - '@request_stack'

    contao.insert_tag.resolver.fragment:
        class: Contao\CoreBundle\InsertTag\Resolver\FragmentInsertTag
        arguments:
            - '@request_stack'
            - '@fragment.handler'
            - '@contao.routing.page_finder'

    contao.insert_tag.resolver.if_language:
        class: Contao\CoreBundle\InsertTag\Resolver\IfLanguageInsertTag
        arguments:
            - '@translator'

    contao.insert_tag.resolver.legacy:
        class: Contao\CoreBundle\InsertTag\Resolver\LegacyInsertTag
        arguments:
            - '@service_container'

    contao.insert_tag.resolver.link:
        class: Contao\CoreBundle\InsertTag\Resolver\LinkInsertTag
        arguments:
            - '@contao.framework'
            - '@contao.security.token_checker'
            - '@contao.routing.content_url_generator'

    contao.insert_tag.resolver.translation:
        class: Contao\CoreBundle\InsertTag\Resolver\TranslationInsertTag
        arguments:
            - '@translator'

    contao.insert_tag.string_util_flag:
        class: Contao\CoreBundle\InsertTag\Flag\StringUtilFlag

    contao.intl.countries:
        class: Contao\CoreBundle\Intl\Countries
        public: true
        arguments:
            - '@translator'
            - []
            - '%contao.intl.countries%'

    contao.intl.locales:
        class: Contao\CoreBundle\Intl\Locales
        public: true
        arguments:
            - '@translator'
            - []
            - []
            - '%contao.intl.locales%'
            - '%contao.intl.enabled_locales%'
            - '%kernel.default_locale%'

    contao.job.jobs:
        class: Contao\CoreBundle\Job\Jobs
        public: true
        arguments:
            - '@database_connection'
            - '@security.helper'

    contao.mailer:
        class: Contao\CoreBundle\Mailer\ContaoMailer
        decorates: mailer.mailer
        arguments:
            - '@contao.mailer.inner'
            - '@contao.mailer.available_transports'
            - '@request_stack'

    contao.mailer.available_transports:
        class: Contao\CoreBundle\Mailer\AvailableTransports
        public: true
        arguments:
            - '@?translator'

    contao.menu.backend_builder:
        class: Contao\CoreBundle\Menu\BackendMenuBuilder
        public: true
        arguments:
            - '@knp_menu.factory'
            - '@event_dispatcher'
        tags:
            - { name: knp_menu.menu_builder, method: buildMainMenu, alias: be_menu }
            - { name: knp_menu.menu_builder, method: buildHeaderMenu, alias: be_header_menu }
            - { name: knp_menu.menu_builder, method: buildLoginMenu, alias: be_login_menu }

    contao.menu.matcher:
        class: Knp\Menu\Matcher\Matcher

    contao.menu.renderer:
        class: Knp\Menu\Renderer\ListRenderer
        public: true
        arguments:
            - '@contao.menu.matcher'

    contao.messenger.search_index_message_handler:
        class: Contao\CoreBundle\Messenger\MessageHandler\SearchIndexMessageHandler
        arguments:
            - '@?contao.search.indexer'

    contao.messenger.web_worker:
        class: Contao\CoreBundle\Messenger\WebWorker
        arguments:
            - '@cache.app'
            - '@console.command.messenger_consume_messages'

    contao.model_argument_resolver:
        class: Contao\CoreBundle\HttpKernel\ModelArgumentResolver
        arguments:
            - '@contao.framework'
            - '@contao.routing.scope_matcher'
        tags:
            # The priority must be higher than the one of the request attribute value resolver (defaults to 100)
            - { name: controller.argument_value_resolver, priority: 101 }

    contao.monolog.handler:
        class: Contao\CoreBundle\Monolog\ContaoTableHandler
        arguments:
            - !service_closure '@database_connection'
        tags:
            - { name: monolog.logger, channel: contao }

    contao.monolog.processor:
        class: Contao\CoreBundle\Monolog\ContaoTableProcessor
        arguments:
            - '@request_stack'
            - '@security.token_storage'
            - '@contao.routing.scope_matcher'

    contao.opt_in:
        class: Contao\CoreBundle\OptIn\OptIn
        public: true
        arguments:
            - '@contao.framework'

    contao.picker.article_provider:
        class: Contao\CoreBundle\Picker\ArticlePickerProvider
        arguments:
            - '@knp_menu.factory'
            - '@router'
            - '@?translator'
            - '@security.helper'

    contao.picker.builder:
        class: Contao\CoreBundle\Picker\PickerBuilder
        public: true
        arguments:
            - '@knp_menu.factory'
            - '@router'

    contao.picker.file_provider:
        class: Contao\CoreBundle\Picker\FilePickerProvider
        arguments:
            - '@knp_menu.factory'
            - '@router'
            - '@translator'
            - '@security.helper'
            - '%contao.upload_path%'

    contao.picker.page_provider:
        class: Contao\CoreBundle\Picker\PagePickerProvider
        arguments:
            - '@knp_menu.factory'
            - '@router'
            - '@?translator'
            - '@security.helper'

    contao.picker.table_provider:
        class: Contao\CoreBundle\Picker\TablePickerProvider
        arguments:
            - '@contao.framework'
            - '@knp_menu.factory'
            - '@router'
            - '@translator'
            - '@database_connection'

    contao.process_util:
        class: Contao\CoreBundle\Util\ProcessUtil
        arguments:
            - '%contao.console_path%'

    contao.rate_limit.member_password_factory:
        class: Symfony\Component\RateLimiter\RateLimiterFactory
        public: true
        arguments:
            - { id: contao.member_password_reset, policy: fixed_window, limit: 3, interval: 15 minutes }
            - '@contao.rate_limit.member_password_storage'
            - '@?lock_factory'

    contao.rate_limit.member_password_storage:
        class: Symfony\Component\RateLimiter\Storage\CacheStorage
        arguments:
            - '@cache.rate_limiter'

    contao.repository.altcha:
        class: Contao\CoreBundle\Repository\AltchaRepository
        arguments:
            - '@doctrine'

    contao.repository.cron_job:
        class: Contao\CoreBundle\Repository\CronJobRepository
        arguments:
            - '@doctrine'

    contao.repository.job:
        class: Contao\CoreBundle\Repository\JobRepository
        arguments:
            - '@doctrine'

    contao.repository.webauthn_credential:
        class: Contao\CoreBundle\Repository\WebauthnCredentialRepository
        public: true
        arguments:
            - '@doctrine'
            - '@security.token_storage'

    contao.repository.webauthn_user_entity:
        class: Contao\CoreBundle\Repository\WebauthnUserEntityRepository
        arguments:
            - '@contao.security.backend_user_provider'
            - '@contao.security.frontend_user_provider'
            - '@contao.routing.scope_matcher'

    contao.resource_finder:
        class: Contao\CoreBundle\Config\ResourceFinder
        public: true
        arguments:
            - '%contao.resources_paths%'

    contao.resource_locator:
        class: Symfony\Component\Config\FileLocator
        public: true
        arguments:
            - '%contao.resources_paths%'

    contao.routing.backend_matcher:
        class: Contao\CoreBundle\Routing\Matcher\BackendMatcher

    contao.routing.content.article_resolver:
        class: Contao\CoreBundle\Routing\Content\ArticleResolver
        arguments:
            - '@contao.framework'

    contao.routing.content.page_resolver:
        class: Contao\CoreBundle\Routing\Content\PageResolver
        arguments:
            - '@contao.framework'

    contao.routing.content.string_resolver:
        class: Contao\CoreBundle\Routing\Content\StringResolver
        arguments:
            - '@contao.insert_tag.parser'
            - '@url_helper'
            - '@request_stack'
            - '@router.request_context'

    contao.routing.content_url_generator:
        class: Contao\CoreBundle\Routing\ContentUrlGenerator
        public: true
        arguments:
            - '@router'
            - '@contao.routing.page_registry'
            - '@doctrine.orm.entity_manager'
            - !tagged_iterator contao.content_url_resolver

    contao.routing.frontend_matcher:
        class: Contao\CoreBundle\Routing\Matcher\FrontendMatcher

    contao.routing.images_loader:
        class: Contao\CoreBundle\Routing\ImagesLoader
        arguments:
            - '%kernel.project_dir%'
            - '%contao.image.target_dir%'
        tags:
            - routing.loader

    contao.routing.input_enhancer:
        class: Contao\CoreBundle\Routing\Enhancer\InputEnhancer
        arguments:
            - '@contao.framework'
            - '@request_stack'
        tags:
            - contao.page_router_enhancer

    contao.routing.locale_candidates:
        class: Contao\CoreBundle\Routing\Candidates\LocaleCandidates
        arguments:
            - '@contao.routing.page_registry'

    contao.routing.matcher.domain_filter:
        class: Contao\CoreBundle\Routing\Matcher\DomainFilter

    contao.routing.matcher.language_filter:
        class: Contao\CoreBundle\Routing\Matcher\LanguageFilter

    contao.routing.matcher.published_filter:
        class: Contao\CoreBundle\Routing\Matcher\PublishedFilter
        arguments:
            - '@contao.security.token_checker'

    contao.routing.nested_404_matcher:
        class: Symfony\Cmf\Component\Routing\NestedMatcher\NestedMatcher
        public: true
        arguments:
            - '@contao.routing.route_404_provider'
            - '@contao.routing.url_matcher'
        calls:
            - [addRouteFilter, ['@contao.routing.matcher.domain_filter']]
            - [addRouteFilter, ['@contao.routing.matcher.published_filter']]

    contao.routing.nested_matcher:
        class: Symfony\Cmf\Component\Routing\NestedMatcher\NestedMatcher
        public: true
        arguments:
            - '@contao.routing.route_provider'
            - '@contao.routing.url_matcher'
        calls:
            - [addRouteFilter, ['@contao.routing.matcher.domain_filter']]
            - [addRouteFilter, ['@contao.routing.matcher.published_filter']]
            - [addRouteFilter, ['@contao.routing.matcher.language_filter']]

    contao.routing.page_404_router:
        class: Symfony\Cmf\Component\Routing\DynamicRouter
        arguments:
            - '@router.request_context'
            - '@contao.routing.nested_404_matcher'
            - '@contao.routing.page_url_generator'
            - ''
            - '@event_dispatcher'
            - '@contao.routing.route_404_provider'
        tags:
            - { name: router, priority: -200 }

    contao.routing.page_candidates:
        class: Contao\CoreBundle\Routing\Candidates\PageCandidates
        arguments:
            - '@database_connection'
            - '@contao.routing.page_registry'

    contao.routing.page_finder:
        class: Contao\CoreBundle\Routing\PageFinder
        public: true
        arguments:
            - '@contao.framework'
            - '@router'
            - '@request_stack'

    contao.routing.page_registry:
        class: Contao\CoreBundle\Routing\Page\PageRegistry
        public: true
        arguments:
            - '@database_connection'

    contao.routing.page_router:
        class: Symfony\Cmf\Component\Routing\DynamicRouter
        arguments:
            - '@router.request_context'
            - '@contao.routing.nested_matcher'
            - '@contao.routing.page_url_generator'
            - ''
            - '@event_dispatcher'
            - '@contao.routing.route_provider'
        tags:
            - { name: router, priority: 20 }

    contao.routing.page_url_generator:
        class: Contao\CoreBundle\Routing\PageUrlGenerator
        arguments:
            - '@contao.routing.route_provider'
            - '@contao.routing.page_registry'
            - '@?logger'

    contao.routing.response_context.csp_handler_factory:
        class: Contao\CoreBundle\Routing\ResponseContext\Csp\CspHandlerFactory
        arguments:
            - '@contao.csp.parser'
            - 3072
            - '@?logger'
        tags:
            - { name: monolog.logger, channel: contao.error }

    contao.routing.response_context_accessor:
        class: Contao\CoreBundle\Routing\ResponseContext\ResponseContextAccessor
        public: true
        arguments:
            - '@request_stack'

    contao.routing.response_context_factory:
        class: Contao\CoreBundle\Routing\ResponseContext\CoreResponseContextFactory
        public: true
        arguments:
            - '@contao.routing.response_context_accessor'
            - '@event_dispatcher'
            - '@contao.security.token_checker'
            - '@contao.string.html_decoder'
            - '@request_stack'
            - '@contao.insert_tag.parser'
            - '@contao.routing.response_context.csp_handler_factory'
            - '@router'
            - '@security.helper'

    contao.routing.route_404_provider:
        class: Contao\CoreBundle\Routing\Route404Provider
        arguments:
            - '@contao.framework'
            - '@contao.routing.locale_candidates'
            - '@contao.routing.page_registry'

    contao.routing.route_provider:
        class: Contao\CoreBundle\Routing\RouteProvider
        arguments:
            - '@contao.framework'
            - '@contao.routing.page_candidates'
            - '@contao.routing.page_registry'

    contao.routing.scope_matcher:
        class: Contao\CoreBundle\Routing\ScopeMatcher
        public: true
        arguments:
            - '@contao.routing.backend_matcher'
            - '@contao.routing.frontend_matcher'
            - '@request_stack'

    contao.routing.url_matcher:
        class: Contao\CoreBundle\Routing\Matcher\UrlMatcher

    contao.search.default_indexer:
        class: Contao\CoreBundle\Search\Indexer\DefaultIndexer
        arguments:
            - '@contao.framework'
            - '@database_connection'

    contao.search.delegating_indexer:
        class: Contao\CoreBundle\Search\Indexer\DelegatingIndexer

    contao.security.access_denied_handler:
        class: Contao\CoreBundle\Security\Authentication\AccessDeniedHandler
        arguments:
            - '@contao.routing.page_finder'
            - '@contao.routing.page_registry'
            - '@http_kernel'

    contao.security.authentication_failure_handler:
        class: Contao\CoreBundle\Security\Authentication\AuthenticationFailureHandler
        arguments:
            - '@?logger'
        tags:
            - { name: monolog.logger, channel: security }

    contao.security.authentication_success_handler:
        class: Contao\CoreBundle\Security\Authentication\AuthenticationSuccessHandler
        arguments:
            - '@contao.framework'
            - '@contao.security.two_factor.trusted_device_manager'
            - '@security.firewall.map'
            - '@contao.routing.content_url_generator'
            - '@uri_signer'
            - '@security.token_storage'
            - '@?logger'

    contao.security.backend_access_voter:
        class: Contao\CoreBundle\Security\Voter\BackendAccessVoter
        arguments:
            - '@contao.framework'

    contao.security.backend_user_provider:
        class: Contao\CoreBundle\Security\User\ContaoUserProvider
        arguments:
            - '@contao.framework'
            - Contao\BackendUser

    contao.security.data_container.article_content_voter:
        class: Contao\CoreBundle\Security\Voter\DataContainer\ArticleContentVoter
        arguments:
            - '@security.access.decision_manager'
            - '@database_connection'

    contao.security.data_container.content_alias_delete_voter:
        class: Contao\CoreBundle\Security\Voter\DataContainer\ContentAliasDeleteVoter
        arguments:
            - '@database_connection'

    contao.security.data_container.content_composition_voter:
        class: Contao\CoreBundle\Security\Voter\DataContainer\ContentCompositionVoter
        arguments:
            - '@contao.framework'
            - '@contao.routing.page_registry'

    contao.security.data_container.content_element_nesting_voter:
        class: Contao\CoreBundle\Security\Voter\DataContainer\ContentElementNestingVoter
        arguments:
            - '@database_connection'
            - '@contao.fragment.compositor'

    contao.security.data_container.content_element_type_voter:
        class: Contao\CoreBundle\Security\Voter\DataContainer\ContentElementTypeVoter
        arguments:
            - '@security.access.decision_manager'

    contao.security.data_container.favorites_voter:
        class: Contao\CoreBundle\Security\Voter\DataContainer\FavoritesVoter

    contao.security.data_container.form_access_voter:
        class: Contao\CoreBundle\Security\Voter\DataContainer\FormAccessVoter
        arguments:
            - '@security.access.decision_manager'

    contao.security.data_container.form_field_access_voter:
        class: Contao\CoreBundle\Security\Voter\DataContainer\FormFieldAccessVoter
        arguments:
            - '@security.access.decision_manager'

    contao.security.data_container.frontend_module_voter:
        class: Contao\CoreBundle\Security\Voter\DataContainer\FrontendModuleVoter
        arguments:
            - '@security.access.decision_manager'

    contao.security.data_container.image_size_access_voter:
        class: Contao\CoreBundle\Security\Voter\DataContainer\ImageSizeAccessVoter
        arguments:
            - '@security.access.decision_manager'

    contao.security.data_container.image_size_item_access_voter:
        class: Contao\CoreBundle\Security\Voter\DataContainer\ImageSizeItemAccessVoter
        arguments:
            - '@security.access.decision_manager'

    contao.security.data_container.layout_access_voter:
        class: Contao\CoreBundle\Security\Voter\DataContainer\LayoutAccessVoter
        arguments:
            - '@security.access.decision_manager'

    contao.security.data_container.legacy_templates_voter:
        class: Contao\CoreBundle\Security\Voter\DataContainer\LegacyTemplatesVoter

    contao.security.data_container.page_permission_voter:
        class: Contao\CoreBundle\Security\Voter\DataContainer\PagePermissionVoter
        arguments:
            - '@contao.framework'
            - '@security.access.decision_manager'
            - '@database_connection'

    contao.security.data_container.page_type_access_voter:
        class: Contao\CoreBundle\Security\Voter\DataContainer\PageTypeAccessVoter
        arguments:
            - '@security.access.decision_manager'
            - '@database_connection'

    contao.security.data_container.table_access_voter:
        class: Contao\CoreBundle\Security\Voter\DataContainer\TableAccessVoter
        arguments:
            - '@security.access.decision_manager'
        tags:
            - { name: security.voter, priority: 100 }

    contao.security.data_container.undo_voter:
        class: Contao\CoreBundle\Security\Voter\DataContainer\UndoVoter
        arguments:
            - '@security.access.decision_manager'

    contao.security.data_container.user_access_voter:
        class: Contao\CoreBundle\Security\Voter\DataContainer\UserAccessVoter
        arguments:
            - '@security.access.decision_manager'
            - '@database_connection'

    contao.security.default_data_container_voter:
        class: Contao\CoreBundle\Security\Voter\DataContainer\DefaultDataContainerVoter
        tags:
            - { name: security.voter, priority: -1024 } # Should always come last

    contao.security.frontend_preview_authenticator:
        class: Contao\CoreBundle\Security\Authentication\FrontendPreviewAuthenticator
        public: true
        arguments:
            - '@security.helper'
            - '@security.token_storage'
            - '@contao.security.token_checker'
            - '@request_stack'
            - '@contao.security.frontend_user_provider'
            - '@?logger'

    contao.security.frontend_user_provider:
        class: Contao\CoreBundle\Security\User\ContaoUserProvider
        arguments:
            - '@contao.framework'
            - Contao\FrontendUser

    contao.security.login_authenticator:
        class: Contao\CoreBundle\Security\Authenticator\ContaoLoginAuthenticator
        arguments:
            - !abstract set by ContaoLoginFactory::createAuthenticator()
            - !abstract set by ContaoLoginFactory::createAuthenticator()
            - !abstract set by ContaoLoginFactory::createAuthenticator()
            - '@contao.routing.scope_matcher'
            - '@router.default'
            - '@uri_signer'
            - '@contao.routing.page_finder'
            - '@security.token_storage'
            - '@contao.routing.page_registry'
            - '@http_kernel'
            - '@request_stack'
            - !abstract set by ContaoLoginFactory::createAuthenticator()
            - !abstract set by ContaoLoginFactory::createAuthenticator()
            - '@twig'

    contao.security.member_group_voter:
        class: Contao\CoreBundle\Security\Voter\MemberGroupVoter

    contao.security.token_checker:
        class: Contao\CoreBundle\Security\Authentication\Token\TokenChecker
        public: true
        arguments:
            - '@request_stack'
            - '@security.firewall.map'
            - '@security.token_storage'
            - '@security.authentication.trust_resolver'
            - '@security.access.simple_role_voter'
            - '@database_connection'

    contao.security.two_factor.authenticator:
        class: Contao\CoreBundle\Security\TwoFactor\Authenticator
        public: true
        arguments:
            - '@clock'

    contao.security.two_factor.backup_code_manager:
        class: Contao\CoreBundle\Security\TwoFactor\BackupCodeManager
        public: true

    contao.security.two_factor.provider:
        class: Contao\CoreBundle\Security\TwoFactor\Provider
        arguments:
            - '@contao.security.two_factor.authenticator'
        tags:
            - { name: scheb_two_factor.provider, alias: contao }

    contao.security.two_factor.trusted_device_manager:
        class: Contao\CoreBundle\Security\TwoFactor\TrustedDeviceManager
        public: true
        arguments:
            - '@request_stack'
            - '@scheb_two_factor.trusted_token_storage'
            - '@doctrine.orm.entity_manager'

    contao.security.user_checker:
        class: Contao\CoreBundle\Security\User\UserChecker
        arguments:
            - '@contao.framework'

    contao.security.webauthn_credential_voter:
        class: Contao\CoreBundle\Security\Voter\WebauthnCredentialVoter

    contao.session.factory:
        class: Contao\CoreBundle\Session\SessionFactory
        decorates: session.factory
        arguments:
            - '@contao.session.factory.inner'
            - '@request_stack'
            - '@contao.routing.scope_matcher'

    contao.slug:
        class: Contao\CoreBundle\Slug\Slug
        public: true
        arguments:
            - '@contao.slug.generator'
            - '@contao.framework'

    contao.slug.generator:
        class: Ausi\SlugGenerator\SlugGenerator
        public: true
        arguments:
            - { validChars: 0-9a-z }

    contao.slug.valid_characters:
        class: Contao\CoreBundle\Slug\ValidCharacters
        public: true
        arguments:
            - '@event_dispatcher'
            - '@translator'

    contao.string.html_decoder:
        class: Contao\CoreBundle\String\HtmlDecoder
        public: true
        arguments:
            - '@contao.insert_tag.parser'

    contao.string.simple_token_expression_language:
        class: Contao\CoreBundle\String\SimpleTokenExpressionLanguage
        arguments:
            - ~
            - !tagged_iterator contao.simple_token_extension

    contao.string.simple_token_parser:
        class: Contao\CoreBundle\String\SimpleTokenParser
        public: true
        arguments:
            - '@contao.string.simple_token_expression_language'

    contao.token_generator:
        class: Symfony\Component\Security\Csrf\TokenGenerator\UriSafeTokenGenerator
        arguments:
            - 48

    contao.translation.data_collector_translator:
        class: Contao\CoreBundle\Translation\DataCollectorTranslator
        autoconfigure: false
        arguments:
            - '@contao.translation.data_collector_translator.inner'
        tags:
            - { name: kernel.reset, method: reset }

    contao.translation.legacy_locale_switcher:
        class: Contao\CoreBundle\Translation\LegacyLocaleSwitcher
        arguments:
            - '@contao.framework'
            - '@translator'

    contao.translation.translator:
        class: Contao\CoreBundle\Translation\Translator
        decorates: translator
        arguments:
            - '@contao.translation.translator.inner'
            - '@contao.framework'
            - '@contao.resource_finder'

    contao.twig.backend_helper_runtime:
        class: Contao\CoreBundle\Twig\Runtime\BackendHelperRuntime
        arguments:
            - '@contao.framework'

    contao.twig.content_url_runtime:
        class: Contao\CoreBundle\Twig\Runtime\ContentUrlRuntime
        arguments:
            - '@contao.routing.content_url_generator'

    contao.twig.csp_runtime:
        class: Contao\CoreBundle\Twig\Runtime\CspRuntime
        arguments:
            - '@contao.routing.response_context_accessor'
            - '@contao.csp.wysiwyg_style_processor'
            - '@?nelmio_security.csp.runtime'

    contao.twig.defer.renderer:
        class: Contao\CoreBundle\Twig\Defer\Renderer
        arguments:
            - '@twig'

    contao.twig.extension:
        class: Contao\CoreBundle\Twig\Extension\ContaoExtension
        public: true
        arguments:
            - '@twig'
            - '@contao.twig.filesystem_loader'
            - '@contao.csrf.token_manager'
            - '@contao.twig.global.variable'
            - '@contao.twig.inspector_node_visitor'

    contao.twig.fail_tolerant_filesystem_loader:
        class: Contao\CoreBundle\Twig\Loader\FailTolerantFilesystemLoader
        arguments:
            - []
            - '%kernel.project_dir%'
        tags:
            - { name: twig.loader, priority: 1 }

    contao.twig.figure_runtime:
        class: Contao\CoreBundle\Twig\Runtime\FigureRuntime
        arguments:
            - '@contao.image.studio.figure_renderer'

    contao.twig.filesystem_loader:
        class: Contao\CoreBundle\Twig\Loader\ContaoFilesystemLoader
        public: true
        arguments:
            - '@cache.app'
            - '@contao.twig.loader.template_locator'
            - '@contao.twig.loader.theme_namespace'
            - '@contao.framework'
            - '@contao.routing.page_finder'
            - '%kernel.project_dir%'
        tags:
            - { name: twig.loader, priority: 2 }

    contao.twig.filesystem_loader_warmer:
        class: Contao\CoreBundle\Twig\Loader\ContaoFilesystemLoaderWarmer
        arguments:
            - '@contao.twig.filesystem_loader'
            - '%kernel.cache_dir%'
            - '%kernel.environment%'

    contao.twig.finder_factory:
        class: Contao\CoreBundle\Twig\Finder\FinderFactory
        arguments:
            - '@contao.twig.filesystem_loader'
            - '@contao.twig.loader.theme_namespace'
            - '@translator'

    contao.twig.formatter_runtime:
        class: Contao\CoreBundle\Twig\Runtime\FormatterRuntime
        arguments:
            - '@contao.framework'

    contao.twig.fragment_runtime:
        class: Contao\CoreBundle\Twig\Runtime\FragmentRuntime
        arguments:
            - '@contao.framework'

    contao.twig.global.variable:
        class: Contao\CoreBundle\Twig\Global\ContaoVariable
        arguments:
            - '@request_stack'
            - '@contao.security.token_checker'
            - '@contao.csrf.token_manager'
            - '@contao.framework'

    contao.twig.highlighter_runtime:
        class: Contao\CoreBundle\Twig\Runtime\HighlighterRuntime

    contao.twig.insert_tag_runtime:
        class: Contao\CoreBundle\Twig\Runtime\InsertTagRuntime
        arguments:
            - '@contao.insert_tag.parser'

    contao.twig.inspector:
        class: Contao\CoreBundle\Twig\Inspector\Inspector
        public: true
        arguments:
            - '@twig'
            - '@contao.twig.inspector.storage'
            - '@contao.twig.filesystem_loader'

    contao.twig.inspector.storage:
        class: Contao\CoreBundle\Twig\Inspector\Storage
        arguments:
            - '@cache.app'

    contao.twig.inspector_node_visitor:
        class: Contao\CoreBundle\Twig\Inspector\InspectorNodeVisitor
        arguments:
            - '@contao.twig.inspector.storage'
            - '@twig'

    contao.twig.interop.context_factory:
        class: Contao\CoreBundle\Twig\Interop\ContextFactory
        public: true

    contao.twig.legacy_template_functions_runtime:
        class: Contao\CoreBundle\Twig\Runtime\LegacyTemplateFunctionsRuntime
        arguments:
            - '@contao.framework'

    contao.twig.loader.template_locator:
        class: Contao\CoreBundle\Twig\Loader\TemplateLocator
        arguments:
            - '%kernel.project_dir%'
            - '@contao.resource_finder'
            - '@contao.twig.loader.theme_namespace'
            - '@database_connection'

    contao.twig.loader.theme_namespace:
        class: Contao\CoreBundle\Twig\Loader\ThemeNamespace

    contao.twig.picture_configuration_runtime:
        class: Contao\CoreBundle\Twig\Runtime\PictureConfigurationRuntime

    contao.twig.sanitizer_runtime:
        class: Contao\CoreBundle\Twig\Runtime\SanitizerRuntime
        arguments:
            - '@twig'

    contao.twig.schema_org_runtime:
        class: Contao\CoreBundle\Twig\Runtime\SchemaOrgRuntime
        arguments:
            - '@contao.routing.response_context_accessor'

    contao.twig.string_runtime:
        class: Contao\CoreBundle\Twig\Runtime\StringRuntime
        arguments:
            - '@contao.framework'

    contao.twig.url_runtime:
        class: Contao\CoreBundle\Twig\Runtime\UrlRuntime
        arguments:
            - '@request_stack'

    contao.webauthn.user_entity_guesser:
        class: Webauthn\Bundle\Security\Guesser\CurrentUserEntityGuesser
        arguments:
            - '@security.token_storage'
            - '@contao.repository.webauthn_user_entity'

    # Autowiring aliases
    Contao\CoreBundle\Cache\EntityCacheTags: '@contao.cache.entity_tags'
    Contao\CoreBundle\Cache\CacheTagManager: '@contao.cache.tag_manager'
    Contao\CoreBundle\Config\ResourceFinderInterface: '@contao.resource_finder'
    Contao\CoreBundle\Csp\WysiwygStyleProcessor: '@contao.csp.wysiwyg_style_processor'
    Contao\CoreBundle\Csrf\ContaoCsrfTokenManager: '@contao.csrf.token_manager'
    Contao\CoreBundle\DataContainer\DcaUrlAnalyzer: '@contao.data_container.dca_url_analyzer'
    Contao\CoreBundle\Doctrine\Backup\DumperInterface: '@contao.doctrine.backup.dumper'
    Contao\CoreBundle\Filesystem\FileDownloadHelper: '@contao.filesystem.file_download_helper'
    Contao\CoreBundle\Framework\ContaoFramework: '@contao.framework'
    Contao\CoreBundle\Image\ImageFactoryInterface: '@contao.image.factory'
    Contao\CoreBundle\Image\ImageSizes: '@contao.image.sizes'
    Contao\CoreBundle\Image\PictureFactoryInterface: '@contao.image.picture_factory'
    Contao\CoreBundle\Image\Preview\PreviewFactory: '@contao.image.preview_factory'
    Contao\CoreBundle\Image\Studio\Studio: '@contao.image.studio'
    Contao\CoreBundle\InsertTag\InsertTagParser: '@contao.insert_tag.parser'
    Contao\CoreBundle\Intl\Countries: '@contao.intl.countries'
    Contao\CoreBundle\Intl\Locales: '@contao.intl.locales'
    Contao\CoreBundle\Mailer\AvailableTransports: '@contao.mailer.available_transports'
    Contao\CoreBundle\OptIn\OptIn: '@contao.opt_in'
    Contao\CoreBundle\Picker\PickerBuilderInterface: '@contao.picker.builder'
    Contao\CoreBundle\Routing\ContentUrlGenerator: '@contao.routing.content_url_generator'
    Contao\CoreBundle\Routing\PageFinder: '@contao.routing.page_finder'
    Contao\CoreBundle\Routing\Page\PageRegistry: '@contao.routing.page_registry'
    Contao\CoreBundle\Routing\ResponseContext\CoreResponseContextFactory: '@contao.routing.response_context_factory'
    Contao\CoreBundle\Routing\ResponseContext\ResponseContextAccessor: '@contao.routing.response_context_accessor'
    Contao\CoreBundle\Routing\ScopeMatcher: '@contao.routing.scope_matcher'
    Contao\CoreBundle\Security\Authentication\Token\TokenChecker: '@contao.security.token_checker'
    Contao\CoreBundle\Security\TwoFactor\Authenticator: '@contao.security.two_factor.authenticator'
    Contao\CoreBundle\Security\TwoFactor\BackupCodeManager: '@contao.security.two_factor.backup_code_manager'
    Contao\CoreBundle\Security\TwoFactor\TrustedDeviceManager: '@contao.security.two_factor.trusted_device_manager'
    Contao\CoreBundle\Slug\Slug: '@contao.slug'
    Contao\CoreBundle\String\HtmlDecoder: '@contao.string.html_decoder'
    Contao\CoreBundle\String\SimpleTokenParser: '@contao.string.simple_token_parser'
    Contao\CoreBundle\Twig\Finder\FinderFactory: '@contao.twig.finder_factory'
    Contao\CoreBundle\Twig\Interop\ContextFactory: '@contao.twig.interop.context_factory'
    Contao\CoreBundle\Twig\Loader\ContaoFilesystemLoader: '@contao.twig.filesystem_loader'
    Contao\CoreBundle\Util\ProcessUtil: '@contao.process_util'
