services:
  _defaults:
    autowire: true
    autoconfigure: true
    public: false

  TYPO3\CMS\Backend\:
    resource: '../Classes/*'

  backend.middlewares:
    class: ArrayObject
    factory: ['@TYPO3\CMS\Core\Http\MiddlewareStackResolver', 'resolve']
    arguments: ['backend']
    public: true

  TYPO3\CMS\Backend\Clipboard\Clipboard:
    shared: false
    public: true

  TYPO3\CMS\Backend\ContextMenu\ItemProviders\ItemProvidersRegistry:
    arguments:
      - !tagged_iterator backend.contextmenu.itemprovider

  # ModuleTemplate instantiated using factory.
  TYPO3\CMS\Backend\Template\ModuleTemplate: ~

  # Not a service, not injectable
  TYPO3\CMS\Backend\Module\ModuleInterface: ~

  # Breadcrumb component with providers
  TYPO3\CMS\Backend\Template\Components\Breadcrumb:
    arguments:
      $providers: !tagged_iterator backend.breadcrumb.provider

  # Auto-tag breadcrumb providers
  _instanceof:
    TYPO3\CMS\Backend\Breadcrumb\BreadcrumbProviderInterface:
      tags: ['backend.breadcrumb.provider']

  TYPO3\CMS\Backend\Search\LiveSearch\SearchProviderRegistry:
    arguments:
      - !tagged_iterator livesearch.provider

  TYPO3\CMS\Backend\Search\LiveSearch\DatabaseRecordProvider:
    tags:
      - { name: 'livesearch.provider', priority: 50 }

  TYPO3\CMS\Backend\Search\LiveSearch\PageRecordProvider:
    tags:
      - { name: 'livesearch.provider', priority: 60 }

  # Localization handler registry
  TYPO3\CMS\Backend\Localization\LocalizationHandlerRegistry:
    arguments:
      - !tagged_iterator backend.localization.handler

  TYPO3\CMS\Backend\ElementBrowser\DatabaseBrowser:
    shared: false

  TYPO3\CMS\Backend\ElementBrowser\ElementBrowserRegistry:
    arguments:
      - !tagged_iterator recordlist.elementbrowser

  # Toolbar registry
  TYPO3\CMS\Backend\Toolbar\ToolbarItemsRegistry:
    arguments:
      - !tagged_iterator backend.toolbar.item

  backendPasswordRecovery.rateLimiterFactory:
    class: Symfony\Component\RateLimiter\RateLimiterFactory
    arguments:
      $config:
        id: 'backend-password-recovery'
        policy: 'sliding_window'
        limit: 3
        interval: '30 minutes'
      $storage: '@TYPO3\CMS\Core\RateLimiter\Storage\CachingFrameworkStorage'

  TYPO3\CMS\Backend\Authentication\PasswordReset:
    arguments:
      $rateLimiterFactory: '@backendPasswordRecovery.rateLimiterFactory'
