]> BookStack Code Mirror - bookstack/commitdiff
Merge branch 'openid' of https://github.com/jasperweyne/BookStack into jasperweyne...
authorDan Brown <redacted>
Wed, 6 Oct 2021 12:17:30 +0000 (13:17 +0100)
committerDan Brown <redacted>
Wed, 6 Oct 2021 12:18:21 +0000 (13:18 +0100)
19 files changed:
1  2 
.env.example.complete
app/Auth/Access/ExternalAuthService.php
app/Auth/Access/LoginService.php
app/Auth/Access/Saml2Service.php
app/Config/auth.php
app/Http/Controllers/UserController.php
app/Http/Middleware/VerifyCsrfToken.php
app/Providers/AuthServiceProvider.php
composer.json
composer.lock
resources/lang/en/errors.php
resources/views/auth/parts/login-form-openid.blade.php
resources/views/common/header.blade.php
resources/views/settings/index.blade.php
resources/views/settings/roles/form.blade.php
resources/views/settings/roles/parts/form.blade.php
resources/views/users/parts/form.blade.php
routes/web.php
tests/Auth/AuthTest.php

diff --combined .env.example.complete
index 5eb65c27f09f346fa806d48253ab3e2a26c87337,b211ad939cacb96acfcbf87c6469dd5a95b3cb1e..5a586d1d1426b4b914506d156a12e4f8e9a9e6a1
@@@ -42,14 -42,6 +42,14 @@@ APP_TIMEZONE=UT
  # overrides can be made. Defaults to disabled.
  APP_THEME=false
  
 +# Trusted Proxies
 +# Used to indicate trust of systems that proxy to the application so
 +# certain header values (Such as "X-Forwarded-For") can be used from the
 +# incoming proxy request to provide origin detail.
 +# Set to an IP address, or multiple comma seperated IP addresses.
 +# Can alternatively be set to "*" to trust all proxy addresses.
 +APP_PROXIES=null
 +
  # Database details
  # Host can contain a port (localhost:3306) or a separate DB_PORT option can be used.
  DB_HOST=localhost
@@@ -59,7 -51,7 +59,7 @@@ DB_USERNAME=database_usernam
  DB_PASSWORD=database_user_password
  
  # Mail system to use
 -# Can be 'smtp', 'mail' or 'sendmail'
 +# Can be 'smtp' or 'sendmail'
  MAIL_DRIVER=smtp
  
  # Mail sending options
@@@ -203,12 -195,10 +203,12 @@@ LDAP_DN=fals
  LDAP_PASS=false
  LDAP_USER_FILTER=false
  LDAP_VERSION=false
 +LDAP_START_TLS=false
  LDAP_TLS_INSECURE=false
  LDAP_ID_ATTRIBUTE=uid
  LDAP_EMAIL_ATTRIBUTE=mail
  LDAP_DISPLAY_NAME_ATTRIBUTE=cn
 +LDAP_THUMBNAIL_ATTRIBUTE=null
  LDAP_FOLLOW_REFERRALS=true
  LDAP_DUMP_USER_DETAILS=false
  
@@@ -231,7 -221,6 +231,7 @@@ SAML2_IDP_x509=nul
  SAML2_ONELOGIN_OVERRIDES=null
  SAML2_DUMP_USER_DETAILS=false
  SAML2_AUTOLOAD_METADATA=false
 +SAML2_IDP_AUTHNCONTEXT=true
  
  # SAML group sync configuration
  # Refer to https://www.bookstackapp.com/docs/admin/saml2-auth/
@@@ -239,6 -228,14 +239,14 @@@ SAML2_USER_TO_GROUPS=fals
  SAML2_GROUP_ATTRIBUTE=group
  SAML2_REMOVE_FROM_GROUPS=false
  
+ # OpenID Connect authentication configuration
+ OPENID_CLIENT_ID=null
+ OPENID_CLIENT_SECRET=null
+ OPENID_ISSUER=https://example.com
+ OPENID_PUBLIC_KEY=file:///my/public.key
+ OPENID_URL_AUTHORIZE=https://example.com/authorize
+ OPENID_URL_TOKEN=https://example.com/token
  # Disable default third-party services such as Gravatar and Draw.IO
  # Service-specific options will override this option
  DISABLE_EXTERNAL_SERVICES=false
  # Example: AVATAR_URL=https://seccdn.libravatar.org/avatar/${hash}?s=${size}&d=identicon
  AVATAR_URL=
  
 -# Enable draw.io integration
 +# Enable diagrams.net integration
  # Can simply be true/false to enable/disable the integration.
 -# Alternatively, It can be URL to the draw.io instance you want to use.
 +# Alternatively, It can be URL to the diagrams.net instance you want to use.
  # For URLs, The following URL parameters should be included: embed=1&proto=json&spin=1
  DRAWIO=true
  
  # Default item listing view
 -# Used for public visitors and user's without a preference
 -# Can be 'list' or 'grid'
 +# Used for public visitors and user's without a preference.
 +# Can be 'list' or 'grid'.
  APP_VIEWS_BOOKS=list
  APP_VIEWS_BOOKSHELVES=grid
 +APP_VIEWS_BOOKSHELF=grid
 +
 +# Use dark mode by default
 +# Will be overriden by any user/session preference.
 +APP_DEFAULT_DARK_MODE=false
  
  # Page revision limit
  # Number of page revisions to keep in the system before deleting old revisions.
  # If set to 'false' a limit will not be enforced.
  REVISION_LIMIT=50
  
 +# Recycle Bin Lifetime
 +# The number of days that content will remain in the recycle bin before
 +# being considered for auto-removal. It is not a guarantee that content will
 +# be removed after this time.
 +# Set to 0 for no recycle bin functionality.
 +# Set to -1 for unlimited recycle bin lifetime.
 +RECYCLE_BIN_LIFETIME=30
 +
  # Allow <script> tags in page content
  # Note, if set to 'true' the page editor may still escape scripts.
  ALLOW_CONTENT_SCRIPTS=false
  # Contents of the robots.txt file can be overridden, making this option obsolete.
  ALLOW_ROBOTS=null
  
 +# Allow server-side fetches to be performed to potentially unknown
 +# and user-provided locations. Primarily used in exports when loading
 +# in externally referenced assets.
 +# Can be 'true' or 'false'.
 +ALLOW_UNTRUSTED_SERVER_FETCHING=false
 +
 +# A list of hosts that BookStack can be iframed within.
 +# Space separated if multiple. BookStack host domain is auto-inferred.
 +# For Example: ALLOWED_IFRAME_HOSTS="https://example.com https://a.example.com"
 +# Setting this option will also auto-adjust cookies to be SameSite=None.
 +ALLOWED_IFRAME_HOSTS=null
 +
  # The default and maximum item-counts for listing API requests.
  API_DEFAULT_ITEM_COUNT=100
  API_MAX_ITEM_COUNT=500
  
  # The number of API requests that can be made per minute by a single user.
 -API_REQUESTS_PER_MIN=180
 +API_REQUESTS_PER_MIN=180
 +
 +# Enable the logging of failed email+password logins with the given message.
 +# The default log channel below uses the php 'error_log' function which commonly
 +# results in messages being output to the webserver error logs.
 +# The message can contain a %u parameter which will be replaced with the login
 +# user identifier (Username or email).
 +LOG_FAILED_LOGIN_MESSAGE=false
 +LOG_FAILED_LOGIN_CHANNEL=errorlog_plain_webserver
index 7bd3679ac0653829989a090778ed7e0062bc2c4e,7f15307aea4f54ba97f3432356d345b9478f24ad..b0c9e8e7b7cda5a730181d871d410ca907750488
@@@ -1,13 -1,48 +1,51 @@@
 -<?php namespace BookStack\Auth\Access;
 +<?php
 +
 +namespace BookStack\Auth\Access;
  
  use BookStack\Auth\Role;
  use BookStack\Auth\User;
 +use Illuminate\Support\Collection;
+ use Illuminate\Database\Eloquent\Builder;
+ use Illuminate\Support\Str;
  
  class ExternalAuthService
  {
 -        $user = $this->user->newQuery()
+     protected $registrationService;
+     protected $user;
+     /**
+      * ExternalAuthService base constructor.
+      */
+     public function __construct(RegistrationService $registrationService, User $user)
+     {
+         $this->registrationService = $registrationService;
+         $this->user = $user;
+     }
+     
+     /**
+      * Get the user from the database for the specified details.
+      * @throws UserRegistrationException
+      */
+     protected function getOrRegisterUser(array $userDetails): ?User
+     {
 -                'name' => $userDetails['name'],
 -                'email' => $userDetails['email'],
 -                'password' => Str::random(32),
++        $user = User::query()
+           ->where('external_auth_id', '=', $userDetails['external_id'])
+           ->first();
+         if (is_null($user)) {
+             $userData = [
++                'name'             => $userDetails['name'],
++                'email'            => $userDetails['email'],
++                'password'         => Str::random(32),
+                 'external_auth_id' => $userDetails['external_id'],
+             ];
+             $user = $this->registrationService->registerUser($userData, null, false);
+         }
+         return $user;
+     }
      /**
       * Check a role against an array of group names to see if it matches.
       * Checked against role 'external_auth_id' if set otherwise the name of the role.
@@@ -19,7 -54,6 +57,7 @@@
          }
  
          $roleName = str_replace(' ', '-', trim(strtolower($role->display_name)));
 +
          return in_array($roleName, $groupNames);
      }
  
      /**
       * Match an array of group names to BookStack system roles.
       * Formats group names to be lower-case and hyphenated.
 -     * @param array $groupNames
 -     * @return \Illuminate\Support\Collection
       */
 -    protected function matchGroupsToSystemsRoles(array $groupNames)
 +    protected function matchGroupsToSystemsRoles(array $groupNames): Collection
      {
          foreach ($groupNames as $i => $groupName) {
              $groupNames[$i] = str_replace(' ', '-', trim(strtolower($groupName)));
          }
  
 -        $roles = Role::query()->where(function (Builder $query) use ($groupNames) {
 -            $query->whereIn('name', $groupNames);
 -            foreach ($groupNames as $groupName) {
 -                $query->orWhere('external_auth_id', 'LIKE', '%' . $groupName . '%');
 -            }
 -        })->get();
 -
 +        $roles = Role::query()->get(['id', 'external_auth_id', 'display_name']);
          $matchedRoles = $roles->filter(function (Role $role) use ($groupNames) {
              return $this->roleMatchesGroupNames($role, $groupNames);
          });
      }
  
      /**
 -     * Sync the groups to the user roles for the current user
 +     * Sync the groups to the user roles for the current user.
       */
      public function syncWithGroups(User $user, array $userGroups): void
      {
index e02296b37309fa731f6d916a9ae416b22da8685f,0000000000000000000000000000000000000000..b36adb5220f7de11ecf7c1ee706b41dd32251124
mode 100644,000000..100644
--- /dev/null
@@@ -1,164 -1,0 +1,164 @@@
-             $guards = ['standard', 'ldap', 'saml2'];
 +<?php
 +
 +namespace BookStack\Auth\Access;
 +
 +use BookStack\Actions\ActivityType;
 +use BookStack\Auth\Access\Mfa\MfaSession;
 +use BookStack\Auth\User;
 +use BookStack\Exceptions\StoppedAuthenticationException;
 +use BookStack\Facades\Activity;
 +use BookStack\Facades\Theme;
 +use BookStack\Theming\ThemeEvents;
 +use Exception;
 +
 +class LoginService
 +{
 +    protected const LAST_LOGIN_ATTEMPTED_SESSION_KEY = 'auth-login-last-attempted';
 +
 +    protected $mfaSession;
 +    protected $emailConfirmationService;
 +
 +    public function __construct(MfaSession $mfaSession, EmailConfirmationService $emailConfirmationService)
 +    {
 +        $this->mfaSession = $mfaSession;
 +        $this->emailConfirmationService = $emailConfirmationService;
 +    }
 +
 +    /**
 +     * Log the given user into the system.
 +     * Will start a login of the given user but will prevent if there's
 +     * a reason to (MFA or Unconfirmed Email).
 +     * Returns a boolean to indicate the current login result.
 +     *
 +     * @throws StoppedAuthenticationException
 +     */
 +    public function login(User $user, string $method, bool $remember = false): void
 +    {
 +        if ($this->awaitingEmailConfirmation($user) || $this->needsMfaVerification($user)) {
 +            $this->setLastLoginAttemptedForUser($user, $method, $remember);
 +
 +            throw new StoppedAuthenticationException($user, $this);
 +        }
 +
 +        $this->clearLastLoginAttempted();
 +        auth()->login($user, $remember);
 +        Activity::add(ActivityType::AUTH_LOGIN, "{$method}; {$user->logDescriptor()}");
 +        Theme::dispatch(ThemeEvents::AUTH_LOGIN, $method, $user);
 +
 +        // Authenticate on all session guards if a likely admin
 +        if ($user->can('users-manage') && $user->can('user-roles-manage')) {
++            $guards = ['standard', 'ldap', 'saml2', 'openid'];
 +            foreach ($guards as $guard) {
 +                auth($guard)->login($user);
 +            }
 +        }
 +    }
 +
 +    /**
 +     * Reattempt a system login after a previous stopped attempt.
 +     *
 +     * @throws Exception
 +     */
 +    public function reattemptLoginFor(User $user)
 +    {
 +        if ($user->id !== ($this->getLastLoginAttemptUser()->id ?? null)) {
 +            throw new Exception('Login reattempt user does align with current session state');
 +        }
 +
 +        $lastLoginDetails = $this->getLastLoginAttemptDetails();
 +        $this->login($user, $lastLoginDetails['method'], $lastLoginDetails['remember'] ?? false);
 +    }
 +
 +    /**
 +     * Get the last user that was attempted to be logged in.
 +     * Only exists if the last login attempt had correct credentials
 +     * but had been prevented by a secondary factor.
 +     */
 +    public function getLastLoginAttemptUser(): ?User
 +    {
 +        $id = $this->getLastLoginAttemptDetails()['user_id'];
 +
 +        return User::query()->where('id', '=', $id)->first();
 +    }
 +
 +    /**
 +     * Get the details of the last login attempt.
 +     * Checks upon a ttl of about 1 hour since that last attempted login.
 +     *
 +     * @return array{user_id: ?string, method: ?string, remember: bool}
 +     */
 +    protected function getLastLoginAttemptDetails(): array
 +    {
 +        $value = session()->get(self::LAST_LOGIN_ATTEMPTED_SESSION_KEY);
 +        if (!$value) {
 +            return ['user_id' => null, 'method' => null];
 +        }
 +
 +        [$id, $method, $remember, $time] = explode(':', $value);
 +        $hourAgo = time() - (60 * 60);
 +        if ($time < $hourAgo) {
 +            $this->clearLastLoginAttempted();
 +
 +            return ['user_id' => null, 'method' => null];
 +        }
 +
 +        return ['user_id' => $id, 'method' => $method, 'remember' => boolval($remember)];
 +    }
 +
 +    /**
 +     * Set the last login attempted user.
 +     * Must be only used when credentials are correct and a login could be
 +     * achieved but a secondary factor has stopped the login.
 +     */
 +    protected function setLastLoginAttemptedForUser(User $user, string $method, bool $remember)
 +    {
 +        session()->put(
 +            self::LAST_LOGIN_ATTEMPTED_SESSION_KEY,
 +            implode(':', [$user->id, $method, $remember, time()])
 +        );
 +    }
 +
 +    /**
 +     * Clear the last login attempted session value.
 +     */
 +    protected function clearLastLoginAttempted(): void
 +    {
 +        session()->remove(self::LAST_LOGIN_ATTEMPTED_SESSION_KEY);
 +    }
 +
 +    /**
 +     * Check if MFA verification is needed.
 +     */
 +    public function needsMfaVerification(User $user): bool
 +    {
 +        return !$this->mfaSession->isVerifiedForUser($user) && $this->mfaSession->isRequiredForUser($user);
 +    }
 +
 +    /**
 +     * Check if the given user is awaiting email confirmation.
 +     */
 +    public function awaitingEmailConfirmation(User $user): bool
 +    {
 +        return $this->emailConfirmationService->confirmationRequired() && !$user->email_confirmed;
 +    }
 +
 +    /**
 +     * Attempt the login of a user using the given credentials.
 +     * Meant to mirror Laravel's default guard 'attempt' method
 +     * but in a manner that always routes through our login system.
 +     * May interrupt the flow if extra authentication requirements are imposed.
 +     *
 +     * @throws StoppedAuthenticationException
 +     */
 +    public function attempt(array $credentials, string $method, bool $remember = false): bool
 +    {
 +        $result = auth()->attempt($credentials, $remember);
 +        if ($result) {
 +            $user = auth()->user();
 +            auth()->logout();
 +            $this->login($user, $method, $remember);
 +        }
 +
 +        return $result;
 +    }
 +}
index 6cbfdac0b2808a646ea284fab404aa01dbc2fa21,4c1fce8643184b476ae5646d0b9855894f3a911a..74e8c7726e4280e58f89af532fe9b8a29dbacdc3
@@@ -1,14 -1,10 +1,13 @@@
 -<?php namespace BookStack\Auth\Access;
 +<?php
 +
 +namespace BookStack\Auth\Access;
  
  use BookStack\Auth\User;
  use BookStack\Exceptions\JsonDebugException;
  use BookStack\Exceptions\SamlException;
 +use BookStack\Exceptions\StoppedAuthenticationException;
  use BookStack\Exceptions\UserRegistrationException;
  use Exception;
- use Illuminate\Support\Str;
  use OneLogin\Saml2\Auth;
  use OneLogin\Saml2\Error;
  use OneLogin\Saml2\IdPMetadataParser;
@@@ -21,38 -17,33 +20,40 @@@ use OneLogin\Saml2\ValidationError
  class Saml2Service extends ExternalAuthService
  {
      protected $config;
 +    protected $registrationService;
 +    protected $loginService;
  
      /**
       * Saml2Service constructor.
       */
-     public function __construct(RegistrationService $registrationService, LoginService $loginService)
 -    public function __construct(RegistrationService $registrationService, User $user)
++    public function __construct(RegistrationService $registrationService, LoginService $loginService, User $user),
      {
+         parent::__construct($registrationService, $user);
+         
          $this->config = config('saml2');
 +        $this->registrationService = $registrationService;
 +        $this->loginService = $loginService;
      }
  
      /**
       * Initiate a login flow.
 +     *
       * @throws Error
       */
      public function login(): array
      {
          $toolKit = $this->getToolkit();
          $returnRoute = url('/saml2/acs');
 +
          return [
              'url' => $toolKit->login($returnRoute, [], false, false, true),
 -            'id' => $toolKit->getLastRequestID(),
 +            'id'  => $toolKit->getLastRequestID(),
          ];
      }
  
      /**
       * Initiate a logout flow.
 +     *
       * @throws Error
       */
      public function logout(): array
@@@ -80,7 -71,6 +81,7 @@@
       * Process the ACS response from the idp and return the
       * matching, or new if registration active, user matched to the idp.
       * Returns null if not authenticated.
 +     *
       * @throws Error
       * @throws SamlException
       * @throws ValidationError
@@@ -95,7 -85,7 +96,7 @@@
  
          if (!empty($errors)) {
              throw new Error(
 -                'Invalid ACS Response: '.implode(', ', $errors)
 +                'Invalid ACS Response: ' . implode(', ', $errors)
              );
          }
  
  
      /**
       * Process a response for the single logout service.
 +     *
       * @throws Error
       */
      public function processSlsResponse(?string $requestId): ?string
  
          if (!empty($errors)) {
              throw new Error(
 -                'Invalid SLS Response: '.implode(', ', $errors)
 +                'Invalid SLS Response: ' . implode(', ', $errors)
              );
          }
  
          $this->actionLogout();
 +
          return $redirect;
      }
  
  
      /**
       * Get the metadata for this service provider.
 +     *
       * @throws Error
       */
      public function metadata(): string
  
          if (!empty($errors)) {
              throw new Error(
 -                'Invalid SP metadata: '.implode(', ', $errors),
 +                'Invalid SP metadata: ' . implode(', ', $errors),
                  Error::METADATA_SP_INVALID
              );
          }
  
      /**
       * Load the underlying Onelogin SAML2 toolkit.
 +     *
       * @throws Error
       * @throws Exception
       */
  
          $spSettings = $this->loadOneloginServiceProviderDetails();
          $settings = array_replace_recursive($settings, $spSettings, $metaDataSettings, $overrides);
 +
          return new Auth($settings);
      }
  
      protected function loadOneloginServiceProviderDetails(): array
      {
          $spDetails = [
 -            'entityId' => url('/saml2/metadata'),
 +            'entityId'                 => url('/saml2/metadata'),
              'assertionConsumerService' => [
                  'url' => url('/saml2/acs'),
              ],
              'singleLogoutService' => [
 -                'url' => url('/saml2/sls')
 +                'url' => url('/saml2/sls'),
              ],
          ];
  
          return [
              'baseurl' => url('/saml2'),
 -            'sp' => $spDetails
 +            'sp'      => $spDetails,
          ];
      }
  
      }
  
      /**
 -     * Calculate the display name
 +     * Calculate the display name.
       */
      protected function getUserDisplayName(array $samlAttributes, string $defaultValue): string
      {
  
          return [
              'external_id' => $externalId,
 -            'name' => $this->getUserDisplayName($samlAttributes, $externalId),
 -            'email' => $email,
 -            'saml_id' => $samlID,
 +            'name'        => $this->getUserDisplayName($samlAttributes, $externalId),
 +            'email'       => $email,
 +            'saml_id'     => $samlID,
          ];
      }
  
                  $data = $data[0];
                  break;
          }
 +
          return $data;
      }
  
          return $defaultValue;
      }
  
-     /**
-      * Get the user from the database for the specified details.
-      *
-      * @throws UserRegistrationException
-      */
-     protected function getOrRegisterUser(array $userDetails): ?User
-     {
-         $user = User::query()
-           ->where('external_auth_id', '=', $userDetails['external_id'])
-           ->first();
-         if (is_null($user)) {
-             $userData = [
-                 'name'             => $userDetails['name'],
-                 'email'            => $userDetails['email'],
-                 'password'         => Str::random(32),
-                 'external_auth_id' => $userDetails['external_id'],
-             ];
-             $user = $this->registrationService->registerUser($userData, null, false);
-         }
-         return $user;
-     }
      /**
       * Process the SAML response for a user. Login the user when
       * they exist, optionally registering them automatically.
 +     *
       * @throws SamlException
       * @throws JsonDebugException
       * @throws UserRegistrationException
 +     * @throws StoppedAuthenticationException
       */
      public function processLoginCallback(string $samlID, array $samlAttributes): User
      {
  
          if ($this->config['dump_user_details']) {
              throw new JsonDebugException([
 -                'id_from_idp' => $samlID,
 -                'attrs_from_idp' => $samlAttributes,
 +                'id_from_idp'         => $samlID,
 +                'attrs_from_idp'      => $samlAttributes,
                  'attrs_after_parsing' => $userDetails,
              ]);
          }
              $this->syncWithGroups($user, $groups);
          }
  
 -        auth()->login($user);
 +        $this->loginService->login($user, 'saml2');
 +
          return $user;
      }
  }
diff --combined app/Config/auth.php
index 404b5352dcc2b45537d4407a634171cee7a6c69e,a1824bc78292858468b54cb090b775538c3d2ef7..5b39bafed051d4aba1fe682ae7fbd4590b2408f8
@@@ -18,7 -18,7 +18,7 @@@ return 
      // This option controls the default authentication "guard" and password
      // reset options for your application.
      'defaults' => [
 -        'guard' => env('AUTH_METHOD', 'standard'),
 +        'guard'     => env('AUTH_METHOD', 'standard'),
          'passwords' => 'users',
      ],
  
      // Supported drivers: "session", "api-token", "ldap-session"
      'guards' => [
          'standard' => [
 -            'driver' => 'session',
 +            'driver'   => 'session',
              'provider' => 'users',
          ],
          'ldap' => [
 -            'driver' => 'ldap-session',
 +            'driver'   => 'ldap-session',
              'provider' => 'external',
          ],
          'saml2' => [
 -            'driver' => 'saml2-session',
 +            'driver'   => 'saml2-session',
              'provider' => 'external',
          ],
+         'openid' => [
+             'driver' => 'openid-session',
+             'provider' => 'external',
+         ],
          'api' => [
              'driver' => 'api-token',
          ],
      'providers' => [
          'users' => [
              'driver' => 'eloquent',
 -            'model' => \BookStack\Auth\User::class,
 +            'model'  => \BookStack\Auth\User::class,
          ],
          'external' => [
              'driver' => 'external-users',
 -            'model' => \BookStack\Auth\User::class,
 +            'model'  => \BookStack\Auth\User::class,
          ],
      ],
  
@@@ -67,9 -71,9 +71,9 @@@
      'passwords' => [
          'users' => [
              'provider' => 'users',
 -            'email' => 'emails.password',
 -            'table' => 'password_resets',
 -            'expire' => 60,
 +            'email'    => 'emails.password',
 +            'table'    => 'password_resets',
 +            'expire'   => 60,
          ],
      ],
  
index a0da220ee55f9735884bc5befe09677718732bf7,5db3c59bd0f3b55220f815942e2d7189222d3138..2ee303f3fee46b2ea6be11810612e11593fe0698
@@@ -1,22 -1,17 +1,22 @@@
 -<?php namespace BookStack\Http\Controllers;
 +<?php
  
 +namespace BookStack\Http\Controllers;
 +
 +use BookStack\Actions\ActivityType;
  use BookStack\Auth\Access\SocialAuthService;
  use BookStack\Auth\Access\UserInviteService;
  use BookStack\Auth\User;
  use BookStack\Auth\UserRepo;
 +use BookStack\Exceptions\ImageUploadException;
  use BookStack\Exceptions\UserUpdateException;
  use BookStack\Uploads\ImageRepo;
 +use Exception;
  use Illuminate\Http\Request;
  use Illuminate\Support\Str;
 +use Illuminate\Validation\ValidationException;
  
  class UserController extends Controller
  {
 -
      protected $user;
      protected $userRepo;
      protected $inviteService;
@@@ -31,6 -26,7 +31,6 @@@
          $this->userRepo = $userRepo;
          $this->inviteService = $inviteService;
          $this->imageRepo = $imageRepo;
 -        parent::__construct();
      }
  
      /**
      {
          $this->checkPermission('users-manage');
          $listDetails = [
 -            'order' => $request->get('order', 'asc'),
 +            'order'  => $request->get('order', 'asc'),
              'search' => $request->get('search', ''),
 -            'sort' => $request->get('sort', 'name'),
 +            'sort'   => $request->get('sort', 'name'),
          ];
          $users = $this->userRepo->getAllUsersPaginatedAndSorted(20, $listDetails);
 +
          $this->setPageTitle(trans('settings.users'));
          $users->appends($listDetails);
 +
          return view('users.index', ['users' => $users, 'listDetails' => $listDetails]);
      }
  
          $this->checkPermission('users-manage');
          $authMethod = config('auth.method');
          $roles = $this->userRepo->getAllRoles();
 +
          return view('users.create', ['authMethod' => $authMethod, 'roles' => $roles]);
      }
  
      /**
       * Store a newly created user in storage.
 +     *
       * @throws UserUpdateException
 -     * @throws \Illuminate\Validation\ValidationException
 +     * @throws ValidationException
       */
      public function store(Request $request)
      {
          $this->checkPermission('users-manage');
          $validationRules = [
 -            'name'             => 'required',
 -            'email'            => 'required|email|unique:users,email'
 +            'name'  => 'required',
 +            'email' => 'required|email|unique:users,email',
          ];
  
          $authMethod = config('auth.method');
@@@ -84,7 -76,7 +84,7 @@@
          if ($authMethod === 'standard' && !$sendInvite) {
              $validationRules['password'] = 'required|min:6';
              $validationRules['password-confirm'] = 'required|same:password';
-         } elseif ($authMethod === 'ldap' || $authMethod === 'saml2') {
+         } elseif ($authMethod === 'ldap' || $authMethod === 'saml2' || $authMethod === 'openid') {
              $validationRules['external_auth_id'] = 'required';
          }
          $this->validate($request, $validationRules);
  
          if ($authMethod === 'standard') {
              $user->password = bcrypt($request->get('password', Str::random(32)));
-         } elseif ($authMethod === 'ldap' || $authMethod === 'saml2') {
+         } elseif ($authMethod === 'ldap' || $authMethod === 'saml2' || $authMethod === 'openid') {
              $user->external_auth_id = $request->get('external_auth_id');
          }
  
 +        $user->refreshSlug();
          $user->save();
  
          if ($sendInvite) {
  
          $this->userRepo->downloadAndAssignUserAvatar($user);
  
 +        $this->logActivity(ActivityType::USER_CREATE, $user);
 +
          return redirect('/settings/users');
      }
  
      {
          $this->checkPermissionOrCurrentUser('users-manage', $id);
  
 -        $user = $this->user->newQuery()->with(['apiTokens'])->findOrFail($id);
 +        /** @var User $user */
 +        $user = $this->user->newQuery()->with(['apiTokens', 'mfaValues'])->findOrFail($id);
  
          $authMethod = ($user->system_name) ? 'system' : config('auth.method');
  
          $activeSocialDrivers = $socialAuthService->getActiveDrivers();
 +        $mfaMethods = $user->mfaValues->groupBy('method');
          $this->setPageTitle(trans('settings.user_profile'));
          $roles = $this->userRepo->getAllRoles();
 +
          return view('users.edit', [
 -            'user' => $user,
 +            'user'                => $user,
              'activeSocialDrivers' => $activeSocialDrivers,
 -            'authMethod' => $authMethod,
 -            'roles' => $roles
 +            'mfaMethods'          => $mfaMethods,
 +            'authMethod'          => $authMethod,
 +            'roles'               => $roles,
          ]);
      }
  
      /**
       * Update the specified user in storage.
 +     *
       * @throws UserUpdateException
 -     * @throws \BookStack\Exceptions\ImageUploadException
 -     * @throws \Illuminate\Validation\ValidationException
 +     * @throws ImageUploadException
 +     * @throws ValidationException
       */
      public function update(Request $request, int $id)
      {
              $user->email = $request->get('email');
          }
  
 +        // Refresh the slug if the user's name has changed
 +        if ($user->isDirty('name')) {
 +            $user->refreshSlug();
 +        }
 +
          // Role updates
          if (userCan('users-manage') && $request->filled('roles')) {
              $roles = $request->get('roles');
              $user->image_id = $image->id;
          }
  
 -        // Delete the profile image if set to
 +        // Delete the profile image if reset option is in request
          if ($request->has('profile_image_reset')) {
              $this->imageRepo->destroyImage($user->avatar);
          }
  
          $user->save();
          $this->showSuccessNotification(trans('settings.users_edit_success'));
 +        $this->logActivity(ActivityType::USER_UPDATE, $user);
  
          $redirectUrl = userCan('users-manage') ? '/settings/users' : ('/settings/users/' . $user->id);
 +
          return redirect($redirectUrl);
      }
  
  
          $user = $this->userRepo->getById($id);
          $this->setPageTitle(trans('settings.users_delete_named', ['userName' => $user->name]));
 +
          return view('users.delete', ['user' => $user]);
      }
  
      /**
       * Remove the specified user from storage.
 -     * @throws \Exception
 +     *
 +     * @throws Exception
       */
 -    public function destroy(int $id)
 +    public function destroy(Request $request, int $id)
      {
          $this->preventAccessInDemoMode();
          $this->checkPermissionOrCurrentUser('users-manage', $id);
  
          $user = $this->userRepo->getById($id);
 +        $newOwnerId = $request->get('new_owner_id', null);
  
          if ($this->userRepo->isOnlyAdmin($user)) {
              $this->showErrorNotification(trans('errors.users_cannot_delete_only_admin'));
 +
              return redirect($user->getEditUrl());
          }
  
          if ($user->system_name === 'public') {
              $this->showErrorNotification(trans('errors.users_cannot_delete_guest'));
 +
              return redirect($user->getEditUrl());
          }
  
 -        $this->userRepo->destroy($user);
 +        $this->userRepo->destroy($user, $newOwnerId);
          $this->showSuccessNotification(trans('settings.users_delete_success'));
 +        $this->logActivity(ActivityType::USER_DELETE, $user);
  
          return redirect('/settings/users');
      }
  
 -    /**
 -     * Show the user profile page
 -     */
 -    public function showProfilePage($id)
 -    {
 -        $user = $this->userRepo->getById($id);
 -
 -        $userActivity = $this->userRepo->getActivity($user);
 -        $recentlyCreated = $this->userRepo->getRecentlyCreated($user, 5);
 -        $assetCounts = $this->userRepo->getAssetCounts($user);
 -
 -        return view('users.profile', [
 -            'user' => $user,
 -            'activity' => $userActivity,
 -            'recentlyCreated' => $recentlyCreated,
 -            'assetCounts' => $assetCounts
 -        ]);
 -    }
 -
      /**
       * Update the user's preferred book-list display setting.
       */
       */
      public function changeSort(Request $request, string $id, string $type)
      {
 -        $validSortTypes = ['books', 'bookshelves'];
 +        $validSortTypes = ['books', 'bookshelves', 'shelf_books'];
          if (!in_array($type, $validSortTypes)) {
              return redirect()->back(500);
          }
 +
          return $this->changeListSort($id, $request, $type);
      }
  
      {
          $enabled = setting()->getForCurrentUser('dark-mode-enabled', false);
          setting()->putUser(user(), 'dark-mode-enabled', $enabled ? 'false' : 'true');
 +
          return redirect()->back();
      }
  
          $this->checkPermissionOrCurrentUser('users-manage', $id);
          $keyWhitelist = ['home-details'];
          if (!in_array($key, $keyWhitelist)) {
 -            return response("Invalid key", 500);
 +            return response('Invalid key', 500);
          }
  
          $newState = $request->get('expand', 'false');
  
          $user = $this->user->findOrFail($id);
          setting()->putUser($user, 'section_expansion#' . $key, $newState);
 -        return response("", 204);
 +
 +        return response('', 204);
      }
  
      /**
          $this->checkPermissionOrCurrentUser('users-manage', $userId);
  
          $sort = $request->get('sort');
 -        if (!in_array($sort, ['name', 'created_at', 'updated_at'])) {
 +        if (!in_array($sort, ['name', 'created_at', 'updated_at', 'default'])) {
              $sort = 'name';
          }
  
index 804a22bc09a3e35acbe26833940eb215e45a81d7,007564eb3ada1826e38e25a1ca62ff1a04e855ba..a2e7f1dc117c8325432b563313779d9c819e81df
@@@ -20,5 -20,6 +20,6 @@@ class VerifyCsrfToken extends Middlewar
       */
      protected $except = [
          'saml2/*',
 -        'openid/*'
++        'openid/*',
      ];
  }
index 37b0e83b9ac9b6a6e4b390aa4e30d5f0c7d906b5,653a292488995564036761e609b15a81f999a5c4..cd90cc849a895f5a2fa8d38c049eb8e45f993917
@@@ -2,14 -2,16 +2,16 @@@
  
  namespace BookStack\Providers;
  
 -use Auth;
  use BookStack\Api\ApiTokenGuard;
  use BookStack\Auth\Access\ExternalBaseUserProvider;
  use BookStack\Auth\Access\Guards\LdapSessionGuard;
  use BookStack\Auth\Access\Guards\Saml2SessionGuard;
+ use BookStack\Auth\Access\Guards\OpenIdSessionGuard;
  use BookStack\Auth\Access\LdapService;
 +use BookStack\Auth\Access\LoginService;
+ use BookStack\Auth\Access\OpenIdService;
  use BookStack\Auth\Access\RegistrationService;
 -use BookStack\Auth\UserRepo;
 +use Illuminate\Support\Facades\Auth;
  use Illuminate\Support\ServiceProvider;
  
  class AuthServiceProvider extends ServiceProvider
      public function boot()
      {
          Auth::extend('api-token', function ($app, $name, array $config) {
 -            return new ApiTokenGuard($app['request']);
 +            return new ApiTokenGuard($app['request'], $app->make(LoginService::class));
          });
  
          Auth::extend('ldap-session', function ($app, $name, array $config) {
              $provider = Auth::createUserProvider($config['provider']);
 +
              return new LdapSessionGuard(
                  $name,
                  $provider,
 -                $this->app['session.store'],
 +                $app['session.store'],
                  $app[LdapService::class],
                  $app[RegistrationService::class]
              );
  
          Auth::extend('saml2-session', function ($app, $name, array $config) {
              $provider = Auth::createUserProvider($config['provider']);
 +
              return new Saml2SessionGuard(
                  $name,
                  $provider,
 -                $this->app['session.store'],
 +                $app['session.store'],
                  $app[RegistrationService::class]
              );
          });
+         Auth::extend('openid-session', function ($app, $name, array $config) {
+             $provider = Auth::createUserProvider($config['provider']);
+             return new OpenIdSessionGuard(
+                 $name,
+                 $provider,
+                 $this->app['session.store'],
+                 $app[OpenIdService::class],
+                 $app[RegistrationService::class]
+             );
+         });
      }
  
      /**
diff --combined composer.json
index 31ecbef84d54c2a3c9900daea88bf12a1bd28cbb,7b1a3d5928973b53dd7f675648972f77b3fc9f2c..288f559913efdb55b1d287f132ef0821978f8575
@@@ -5,45 -5,45 +5,46 @@@
      "license": "MIT",
      "type": "project",
      "require": {
 -        "php": "^7.2",
 +        "php": "^7.3|^8.0",
          "ext-curl": "*",
          "ext-dom": "*",
 +        "ext-fileinfo": "*",
          "ext-gd": "*",
          "ext-json": "*",
          "ext-mbstring": "*",
 -        "ext-tidy": "*",
          "ext-xml": "*",
 -        "barryvdh/laravel-dompdf": "^0.8.6",
 -        "barryvdh/laravel-snappy": "^0.4.7",
 -        "doctrine/dbal": "^2.9",
 -        "facade/ignition": "^1.4",
 -        "fideloper/proxy": "^4.0",
 -        "gathercontent/htmldiff": "^0.2.1",
 -        "intervention/image": "^2.5",
 -        "laravel/framework": "^6.18",
 -        "laravel/socialite": "^4.3.2",
 -        "league/commonmark": "^1.4",
 -        "league/flysystem-aws-s3-v3": "^1.0",
 -        "nunomaduro/collision": "^3.0",
 -        "onelogin/php-saml": "^3.3",
 -        "predis/predis": "^1.1",
 -        "socialiteproviders/discord": "^2.0",
 -        "socialiteproviders/gitlab": "^3.0",
 -        "socialiteproviders/microsoft-azure": "^3.0",
 -        "socialiteproviders/okta": "^1.0",
 -        "socialiteproviders/slack": "^3.0",
 -        "socialiteproviders/twitch": "^5.0",
 +        "bacon/bacon-qr-code": "^2.0",
 +        "barryvdh/laravel-dompdf": "^0.9.0",
 +        "barryvdh/laravel-snappy": "^0.4.8",
 +        "doctrine/dbal": "^2.12.1",
 +        "facade/ignition": "^1.16.4",
 +        "fideloper/proxy": "^4.4.1",
 +        "intervention/image": "^2.5.1",
 +        "laravel/framework": "^6.20.33",
 +        "laravel/socialite": "^5.1",
 +        "league/commonmark": "^1.5",
 +        "league/flysystem-aws-s3-v3": "^1.0.29",
 +        "league/html-to-markdown": "^5.0.0",
 +        "nunomaduro/collision": "^3.1",
 +        "onelogin/php-saml": "^4.0",
 +        "pragmarx/google2fa": "^8.0",
 +        "predis/predis": "^1.1.6",
 +        "socialiteproviders/discord": "^4.1",
 +        "socialiteproviders/gitlab": "^4.1",
 +        "socialiteproviders/microsoft-azure": "^4.1",
 +        "socialiteproviders/okta": "^4.1",
 +        "socialiteproviders/slack": "^4.1",
 +        "socialiteproviders/twitch": "^5.3",
-         "ssddanbrown/htmldiff": "^v1.0.1"
++        "ssddanbrown/htmldiff": "^v1.0.1",
+         "steverhoades/oauth2-openid-connect-client": "^0.3.0"
      },
      "require-dev": {
 -        "barryvdh/laravel-debugbar": "^3.2.8",
 -        "barryvdh/laravel-ide-helper": "^2.6.4",
 -        "fzaninotto/faker": "^1.4",
 -        "laravel/browser-kit-testing": "^5.1",
 -        "mockery/mockery": "^1.0",
 -        "phpunit/phpunit": "^8.0",
 -        "squizlabs/php_codesniffer": "^3.4",
 -        "wnx/laravel-stats": "^2.0"
 +        "barryvdh/laravel-debugbar": "^3.5.1",
 +        "barryvdh/laravel-ide-helper": "^2.8.2",
 +        "fakerphp/faker": "^1.13.0",
 +        "mockery/mockery": "^1.3.3",
 +        "phpunit/phpunit": "^9.5.3",
 +        "symfony/dom-crawler": "^5.3"
      },
      "autoload": {
          "classmap": [
          ],
          "psr-4": {
              "BookStack\\": "app/"
 -        }
 +        },
 +              "files": [
 +                      "app/helpers.php"
 +              ]
      },
      "autoload-dev": {
          "psr-4": {
          "post-create-project-cmd": [
              "@php artisan key:generate --ansi"
          ],
 -        "pre-update-cmd": [
 -            "@php -r \"!file_exists('bootstrap/cache/services.php') || @unlink('bootstrap/cache/services.php');\"",
 -            "@php -r \"!file_exists('bootstrap/cache/compiled.php') || @unlink('bootstrap/cache/compiled.php');\""
 -        ],
          "pre-install-cmd": [
 -            "@php -r \"!file_exists('bootstrap/cache/services.php') || @unlink('bootstrap/cache/services.php');\"",
 -            "@php -r \"!file_exists('bootstrap/cache/compiled.php') || @unlink('bootstrap/cache/compiled.php');\""
 +            "@php -r \"!file_exists('bootstrap/cache/services.php') || @unlink('bootstrap/cache/services.php');\""
          ],
          "post-install-cmd": [
              "@php artisan cache:clear",
@@@ -90,7 -92,7 +91,7 @@@
          "preferred-install": "dist",
          "sort-packages": true,
          "platform": {
 -            "php": "7.2.0"
 +            "php": "7.3.0"
          }
      },
      "extra": {
diff --combined composer.lock
index d267d13d65d6257988fdb0c4a6d51e28ad190299,0f5e29792e950d09396f9365a8f28cacc0bb5e40..a3cfe6e7e570d989d17d17e4e3aa47bceb0c22b6
@@@ -4,81 -4,30 +4,81 @@@
          "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
          "This file is @generated automatically"
      ],
 -    "content-hash": "f9d604c2456771f9b939f04492dde182",
 +    "content-hash": "10825887b8f66d1d412b92bcc0ca864f",
      "packages": [
 +        {
 +            "name": "aws/aws-crt-php",
 +            "version": "v1.0.2",
 +            "source": {
 +                "type": "git",
 +                "url": "https://github.com/awslabs/aws-crt-php.git",
 +                "reference": "3942776a8c99209908ee0b287746263725685732"
 +            },
 +            "dist": {
 +                "type": "zip",
 +                "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/3942776a8c99209908ee0b287746263725685732",
 +                "reference": "3942776a8c99209908ee0b287746263725685732",
 +                "shasum": ""
 +            },
 +            "require": {
 +                "php": ">=5.5"
 +            },
 +            "require-dev": {
 +                "phpunit/phpunit": "^4.8.35|^5.4.3"
 +            },
 +            "type": "library",
 +            "autoload": {
 +                "classmap": [
 +                    "src/"
 +                ]
 +            },
 +            "notification-url": "https://packagist.org/downloads/",
 +            "license": [
 +                "Apache-2.0"
 +            ],
 +            "authors": [
 +                {
 +                    "name": "AWS SDK Common Runtime Team",
 +                    "email": "[email protected]"
 +                }
 +            ],
 +            "description": "AWS Common Runtime for PHP",
 +            "homepage": "http://aws.amazon.com/sdkforphp",
 +            "keywords": [
 +                "amazon",
 +                "aws",
 +                "crt",
 +                "sdk"
 +            ],
 +            "support": {
 +                "issues": "https://github.com/awslabs/aws-crt-php/issues",
 +                "source": "https://github.com/awslabs/aws-crt-php/tree/v1.0.2"
 +            },
 +            "time": "2021-09-03T22:57:30+00:00"
 +        },
          {
              "name": "aws/aws-sdk-php",
 -            "version": "3.138.7",
 +            "version": "3.194.1",
              "source": {
                  "type": "git",
                  "url": "https://github.com/aws/aws-sdk-php.git",
 -                "reference": "6b9f3fcea4dfa6092c628c790ca6d369a75453b7"
 +                "reference": "67bdee05acef9e8ad60098090996690b49babd09"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/6b9f3fcea4dfa6092c628c790ca6d369a75453b7",
 -                "reference": "6b9f3fcea4dfa6092c628c790ca6d369a75453b7",
 +                "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/67bdee05acef9e8ad60098090996690b49babd09",
 +                "reference": "67bdee05acef9e8ad60098090996690b49babd09",
                  "shasum": ""
              },
              "require": {
 +                "aws/aws-crt-php": "^1.0.2",
                  "ext-json": "*",
                  "ext-pcre": "*",
                  "ext-simplexml": "*",
                  "guzzlehttp/guzzle": "^5.3.3|^6.2.1|^7.0",
 -                "guzzlehttp/promises": "^1.0",
 -                "guzzlehttp/psr7": "^1.4.1",
 -                "mtdowling/jmespath.php": "^2.5",
 +                "guzzlehttp/promises": "^1.4.0",
 +                "guzzlehttp/psr7": "^1.7.0",
 +                "mtdowling/jmespath.php": "^2.6",
                  "php": ">=5.5"
              },
              "require-dev": {
@@@ -91,7 -40,6 +91,7 @@@
                  "ext-pcntl": "*",
                  "ext-sockets": "*",
                  "nette/neon": "^2.3",
 +                "paragonie/random_compat": ">= 2",
                  "phpunit/phpunit": "^4.8.35|^5.4.3",
                  "psr/cache": "^1.0",
                  "psr/simple-cache": "^1.0",
                  "s3",
                  "sdk"
              ],
 -            "time": "2020-05-22T18:11:09+00:00"
 +            "support": {
 +                "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
 +                "issues": "https://github.com/aws/aws-sdk-php/issues",
 +                "source": "https://github.com/aws/aws-sdk-php/tree/3.194.1"
 +            },
 +            "time": "2021-09-17T18:15:42+00:00"
 +        },
 +        {
 +            "name": "bacon/bacon-qr-code",
 +            "version": "2.0.4",
 +            "source": {
 +                "type": "git",
 +                "url": "https://github.com/Bacon/BaconQrCode.git",
 +                "reference": "f73543ac4e1def05f1a70bcd1525c8a157a1ad09"
 +            },
 +            "dist": {
 +                "type": "zip",
 +                "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/f73543ac4e1def05f1a70bcd1525c8a157a1ad09",
 +                "reference": "f73543ac4e1def05f1a70bcd1525c8a157a1ad09",
 +                "shasum": ""
 +            },
 +            "require": {
 +                "dasprid/enum": "^1.0.3",
 +                "ext-iconv": "*",
 +                "php": "^7.1 || ^8.0"
 +            },
 +            "require-dev": {
 +                "phly/keep-a-changelog": "^1.4",
 +                "phpunit/phpunit": "^7 | ^8 | ^9",
 +                "squizlabs/php_codesniffer": "^3.4"
 +            },
 +            "suggest": {
 +                "ext-imagick": "to generate QR code images"
 +            },
 +            "type": "library",
 +            "autoload": {
 +                "psr-4": {
 +                    "BaconQrCode\\": "src/"
 +                }
 +            },
 +            "notification-url": "https://packagist.org/downloads/",
 +            "license": [
 +                "BSD-2-Clause"
 +            ],
 +            "authors": [
 +                {
 +                    "name": "Ben Scholzen 'DASPRiD'",
 +                    "email": "[email protected]",
 +                    "homepage": "https://dasprids.de/",
 +                    "role": "Developer"
 +                }
 +            ],
 +            "description": "BaconQrCode is a QR code generator for PHP.",
 +            "homepage": "https://github.com/Bacon/BaconQrCode",
 +            "support": {
 +                "issues": "https://github.com/Bacon/BaconQrCode/issues",
 +                "source": "https://github.com/Bacon/BaconQrCode/tree/2.0.4"
 +            },
 +            "time": "2021-06-18T13:26:35+00:00"
          },
          {
              "name": "barryvdh/laravel-dompdf",
 -            "version": "v0.8.6",
 +            "version": "v0.9.0",
              "source": {
                  "type": "git",
                  "url": "https://github.com/barryvdh/laravel-dompdf.git",
 -                "reference": "d7108f78cf5254a2d8c224542967f133e5a6d4e8"
 +                "reference": "5b99e1f94157d74e450f4c97e8444fcaffa2144b"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/barryvdh/laravel-dompdf/zipball/d7108f78cf5254a2d8c224542967f133e5a6d4e8",
 -                "reference": "d7108f78cf5254a2d8c224542967f133e5a6d4e8",
 +                "url": "https://api.github.com/repos/barryvdh/laravel-dompdf/zipball/5b99e1f94157d74e450f4c97e8444fcaffa2144b",
 +                "reference": "5b99e1f94157d74e450f4c97e8444fcaffa2144b",
                  "shasum": ""
              },
              "require": {
 -                "dompdf/dompdf": "^0.8",
 -                "illuminate/support": "^5.5|^6|^7",
 -                "php": ">=7"
 +                "dompdf/dompdf": "^1",
 +                "illuminate/support": "^5.5|^6|^7|^8",
 +                "php": "^7.1 || ^8.0"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "0.8-dev"
 +                    "dev-master": "0.9-dev"
                  },
                  "laravel": {
                      "providers": [
                  "laravel",
                  "pdf"
              ],
 -            "time": "2020-02-25T20:44:34+00:00"
 +            "support": {
 +                "issues": "https://github.com/barryvdh/laravel-dompdf/issues",
 +                "source": "https://github.com/barryvdh/laravel-dompdf/tree/v0.9.0"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/barryvdh",
 +                    "type": "github"
 +                }
 +            ],
 +            "time": "2020-12-27T12:05:53+00:00"
          },
          {
              "name": "barryvdh/laravel-snappy",
 -            "version": "v0.4.7",
 +            "version": "v0.4.8",
              "source": {
                  "type": "git",
                  "url": "https://github.com/barryvdh/laravel-snappy.git",
 -                "reference": "c412d0c8f40b1326ba0fb16e94957fd1e68374f0"
 +                "reference": "1903ab84171072b6bff8d98eb58d38b2c9aaf645"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/barryvdh/laravel-snappy/zipball/c412d0c8f40b1326ba0fb16e94957fd1e68374f0",
 -                "reference": "c412d0c8f40b1326ba0fb16e94957fd1e68374f0",
 +                "url": "https://api.github.com/repos/barryvdh/laravel-snappy/zipball/1903ab84171072b6bff8d98eb58d38b2c9aaf645",
 +                "reference": "1903ab84171072b6bff8d98eb58d38b2c9aaf645",
                  "shasum": ""
              },
              "require": {
 -                "illuminate/filesystem": "^5.5|^6|^7",
 -                "illuminate/support": "^5.5|^6|^7",
 +                "illuminate/filesystem": "^5.5|^6|^7|^8",
 +                "illuminate/support": "^5.5|^6|^7|^8",
                  "knplabs/knp-snappy": "^1",
                  "php": ">=7"
              },
                  "wkhtmltoimage",
                  "wkhtmltopdf"
              ],
 -            "time": "2020-02-25T20:52:15+00:00"
 +            "support": {
 +                "issues": "https://github.com/barryvdh/laravel-snappy/issues",
 +                "source": "https://github.com/barryvdh/laravel-snappy/tree/master"
 +            },
 +            "time": "2020-09-07T12:33:10+00:00"
          },
          {
 -            "name": "cogpowered/finediff",
 -            "version": "0.3.1",
 +            "name": "dasprid/enum",
 +            "version": "1.0.3",
              "source": {
                  "type": "git",
 -                "url": "https://github.com/cogpowered/FineDiff.git",
 -                "reference": "339ddc8c3afb656efed4f2f0a80e5c3d026f8ea8"
 +                "url": "https://github.com/DASPRiD/Enum.git",
 +                "reference": "5abf82f213618696dda8e3bf6f64dd042d8542b2"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/cogpowered/FineDiff/zipball/339ddc8c3afb656efed4f2f0a80e5c3d026f8ea8",
 -                "reference": "339ddc8c3afb656efed4f2f0a80e5c3d026f8ea8",
 +                "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/5abf82f213618696dda8e3bf6f64dd042d8542b2",
 +                "reference": "5abf82f213618696dda8e3bf6f64dd042d8542b2",
                  "shasum": ""
              },
 -            "require": {
 -                "php": ">=5.3.0"
 -            },
              "require-dev": {
 -                "mockery/mockery": "*",
 -                "phpunit/phpunit": "*"
 +                "phpunit/phpunit": "^7 | ^8 | ^9",
 +                "squizlabs/php_codesniffer": "^3.4"
              },
              "type": "library",
              "autoload": {
 -                "psr-0": {
 -                    "cogpowered\\FineDiff": "src/"
 +                "psr-4": {
 +                    "DASPRiD\\Enum\\": "src/"
                  }
              },
              "notification-url": "https://packagist.org/downloads/",
              "license": [
 -                "MIT"
 +                "BSD-2-Clause"
              ],
              "authors": [
                  {
 -                    "name": "Rob Crowe",
 -                    "email": "[email protected]"
 -                },
 -                {
 -                    "name": "Raymond Hill"
 +                    "name": "Ben Scholzen 'DASPRiD'",
 +                    "email": "[email protected]",
 +                    "homepage": "https://dasprids.de/",
 +                    "role": "Developer"
                  }
              ],
 -            "description": "PHP implementation of a Fine granularity Diff engine",
 -            "homepage": "https://github.com/cogpowered/FineDiff",
 +            "description": "PHP 7.1 enum implementation",
              "keywords": [
 -                "diff",
 -                "finediff",
 -                "opcode",
 -                "string",
 -                "text"
 +                "enum",
 +                "map"
              ],
 -            "time": "2014-05-19T10:25:02+00:00"
 +            "support": {
 +                "issues": "https://github.com/DASPRiD/Enum/issues",
 +                "source": "https://github.com/DASPRiD/Enum/tree/1.0.3"
 +            },
 +            "time": "2020-10-02T16:03:48+00:00"
          },
          {
              "name": "doctrine/cache",
 -            "version": "1.10.0",
 +            "version": "2.1.1",
              "source": {
                  "type": "git",
                  "url": "https://github.com/doctrine/cache.git",
 -                "reference": "382e7f4db9a12dc6c19431743a2b096041bcdd62"
 +                "reference": "331b4d5dbaeab3827976273e9356b3b453c300ce"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/doctrine/cache/zipball/382e7f4db9a12dc6c19431743a2b096041bcdd62",
 -                "reference": "382e7f4db9a12dc6c19431743a2b096041bcdd62",
 +                "url": "https://api.github.com/repos/doctrine/cache/zipball/331b4d5dbaeab3827976273e9356b3b453c300ce",
 +                "reference": "331b4d5dbaeab3827976273e9356b3b453c300ce",
                  "shasum": ""
              },
              "require": {
 -                "php": "~7.1"
 +                "php": "~7.1 || ^8.0"
              },
              "conflict": {
                  "doctrine/common": ">2.2,<2.4"
              },
              "require-dev": {
                  "alcaeus/mongo-php-adapter": "^1.1",
 -                "doctrine/coding-standard": "^6.0",
 +                "cache/integration-tests": "dev-master",
 +                "doctrine/coding-standard": "^8.0",
                  "mongodb/mongodb": "^1.1",
 -                "phpunit/phpunit": "^7.0",
 -                "predis/predis": "~1.0"
 +                "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0",
 +                "predis/predis": "~1.0",
 +                "psr/cache": "^1.0 || ^2.0 || ^3.0",
 +                "symfony/cache": "^4.4 || ^5.2 || ^6.0@dev",
 +                "symfony/var-exporter": "^4.4 || ^5.2 || ^6.0@dev"
              },
              "suggest": {
                  "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver"
              },
              "type": "library",
 -            "extra": {
 -                "branch-alias": {
 -                    "dev-master": "1.9.x-dev"
 -                }
 -            },
              "autoload": {
                  "psr-4": {
                      "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache"
                  "redis",
                  "xcache"
              ],
 -            "time": "2019-11-29T15:36:20+00:00"
 +            "support": {
 +                "issues": "https://github.com/doctrine/cache/issues",
 +                "source": "https://github.com/doctrine/cache/tree/2.1.1"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://www.doctrine-project.org/sponsorship.html",
 +                    "type": "custom"
 +                },
 +                {
 +                    "url": "https://www.patreon.com/phpdoctrine",
 +                    "type": "patreon"
 +                },
 +                {
 +                    "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache",
 +                    "type": "tidelift"
 +                }
 +            ],
 +            "time": "2021-07-17T14:49:29+00:00"
          },
          {
              "name": "doctrine/dbal",
 -            "version": "2.10.2",
 +            "version": "2.13.3",
              "source": {
                  "type": "git",
                  "url": "https://github.com/doctrine/dbal.git",
 -                "reference": "aab745e7b6b2de3b47019da81e7225e14dcfdac8"
 +                "reference": "0d7adf4cadfee6f70850e5b163e6cdd706417838"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/doctrine/dbal/zipball/aab745e7b6b2de3b47019da81e7225e14dcfdac8",
 -                "reference": "aab745e7b6b2de3b47019da81e7225e14dcfdac8",
 +                "url": "https://api.github.com/repos/doctrine/dbal/zipball/0d7adf4cadfee6f70850e5b163e6cdd706417838",
 +                "reference": "0d7adf4cadfee6f70850e5b163e6cdd706417838",
                  "shasum": ""
              },
              "require": {
 -                "doctrine/cache": "^1.0",
 +                "doctrine/cache": "^1.0|^2.0",
 +                "doctrine/deprecations": "^0.5.3",
                  "doctrine/event-manager": "^1.0",
                  "ext-pdo": "*",
 -                "php": "^7.2"
 +                "php": "^7.1 || ^8"
              },
              "require-dev": {
 -                "doctrine/coding-standard": "^6.0",
 -                "jetbrains/phpstorm-stubs": "^2019.1",
 -                "nikic/php-parser": "^4.4",
 -                "phpstan/phpstan": "^0.12",
 -                "phpunit/phpunit": "^8.4.1",
 +                "doctrine/coding-standard": "9.0.0",
 +                "jetbrains/phpstorm-stubs": "2021.1",
 +                "phpstan/phpstan": "0.12.96",
 +                "phpunit/phpunit": "^7.5.20|^8.5|9.5.5",
 +                "psalm/plugin-phpunit": "0.16.1",
 +                "squizlabs/php_codesniffer": "3.6.0",
 +                "symfony/cache": "^4.4",
                  "symfony/console": "^2.0.5|^3.0|^4.0|^5.0",
 -                "vimeo/psalm": "^3.11"
 +                "vimeo/psalm": "4.10.0"
              },
              "suggest": {
                  "symfony/console": "For helpful console commands such as SQL execution and import of files."
                  "bin/doctrine-dbal"
              ],
              "type": "library",
 -            "extra": {
 -                "branch-alias": {
 -                    "dev-master": "2.10.x-dev",
 -                    "dev-develop": "3.0.x-dev"
 -                }
 -            },
              "autoload": {
                  "psr-4": {
                      "Doctrine\\DBAL\\": "lib/Doctrine/DBAL"
                  "sqlserver",
                  "sqlsrv"
              ],
 +            "support": {
 +                "issues": "https://github.com/doctrine/dbal/issues",
 +                "source": "https://github.com/doctrine/dbal/tree/2.13.3"
 +            },
              "funding": [
                  {
                      "url": "https://www.doctrine-project.org/sponsorship.html",
                      "type": "tidelift"
                  }
              ],
 -            "time": "2020-04-20T17:19:26+00:00"
 +            "time": "2021-09-12T19:11:48+00:00"
 +        },
 +        {
 +            "name": "doctrine/deprecations",
 +            "version": "v0.5.3",
 +            "source": {
 +                "type": "git",
 +                "url": "https://github.com/doctrine/deprecations.git",
 +                "reference": "9504165960a1f83cc1480e2be1dd0a0478561314"
 +            },
 +            "dist": {
 +                "type": "zip",
 +                "url": "https://api.github.com/repos/doctrine/deprecations/zipball/9504165960a1f83cc1480e2be1dd0a0478561314",
 +                "reference": "9504165960a1f83cc1480e2be1dd0a0478561314",
 +                "shasum": ""
 +            },
 +            "require": {
 +                "php": "^7.1|^8.0"
 +            },
 +            "require-dev": {
 +                "doctrine/coding-standard": "^6.0|^7.0|^8.0",
 +                "phpunit/phpunit": "^7.0|^8.0|^9.0",
 +                "psr/log": "^1.0"
 +            },
 +            "suggest": {
 +                "psr/log": "Allows logging deprecations via PSR-3 logger implementation"
 +            },
 +            "type": "library",
 +            "autoload": {
 +                "psr-4": {
 +                    "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations"
 +                }
 +            },
 +            "notification-url": "https://packagist.org/downloads/",
 +            "license": [
 +                "MIT"
 +            ],
 +            "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.",
 +            "homepage": "https://www.doctrine-project.org/",
 +            "support": {
 +                "issues": "https://github.com/doctrine/deprecations/issues",
 +                "source": "https://github.com/doctrine/deprecations/tree/v0.5.3"
 +            },
 +            "time": "2021-03-21T12:59:47+00:00"
          },
          {
              "name": "doctrine/event-manager",
 -            "version": "1.1.0",
 +            "version": "1.1.1",
              "source": {
                  "type": "git",
                  "url": "https://github.com/doctrine/event-manager.git",
 -                "reference": "629572819973f13486371cb611386eb17851e85c"
 +                "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/doctrine/event-manager/zipball/629572819973f13486371cb611386eb17851e85c",
 -                "reference": "629572819973f13486371cb611386eb17851e85c",
 +                "url": "https://api.github.com/repos/doctrine/event-manager/zipball/41370af6a30faa9dc0368c4a6814d596e81aba7f",
 +                "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.1"
 +                "php": "^7.1 || ^8.0"
              },
              "conflict": {
                  "doctrine/common": "<2.9@dev"
                  "event system",
                  "events"
              ],
 -            "time": "2019-11-10T09:48:07+00:00"
 +            "support": {
 +                "issues": "https://github.com/doctrine/event-manager/issues",
 +                "source": "https://github.com/doctrine/event-manager/tree/1.1.x"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://www.doctrine-project.org/sponsorship.html",
 +                    "type": "custom"
 +                },
 +                {
 +                    "url": "https://www.patreon.com/phpdoctrine",
 +                    "type": "patreon"
 +                },
 +                {
 +                    "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager",
 +                    "type": "tidelift"
 +                }
 +            ],
 +            "time": "2020-05-29T18:28:51+00:00"
          },
          {
              "name": "doctrine/inflector",
 -            "version": "2.0.1",
 +            "version": "2.0.3",
              "source": {
                  "type": "git",
                  "url": "https://github.com/doctrine/inflector.git",
 -                "reference": "18b995743e7ec8b15fd6efc594f0fa3de4bfe6d7"
 +                "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/doctrine/inflector/zipball/18b995743e7ec8b15fd6efc594f0fa3de4bfe6d7",
 -                "reference": "18b995743e7ec8b15fd6efc594f0fa3de4bfe6d7",
 +                "url": "https://api.github.com/repos/doctrine/inflector/zipball/9cf661f4eb38f7c881cac67c75ea9b00bf97b210",
 +                "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.2"
 +                "php": "^7.2 || ^8.0"
              },
              "require-dev": {
                  "doctrine/coding-standard": "^7.0",
                  "uppercase",
                  "words"
              ],
 +            "support": {
 +                "issues": "https://github.com/doctrine/inflector/issues",
 +                "source": "https://github.com/doctrine/inflector/tree/2.0.x"
 +            },
              "funding": [
                  {
                      "url": "https://www.doctrine-project.org/sponsorship.html",
                      "type": "tidelift"
                  }
              ],
 -            "time": "2020-05-11T11:25:59+00:00"
 +            "time": "2020-05-29T15:13:26+00:00"
          },
          {
              "name": "doctrine/lexer",
 -            "version": "1.2.0",
 +            "version": "1.2.1",
              "source": {
                  "type": "git",
                  "url": "https://github.com/doctrine/lexer.git",
 -                "reference": "5242d66dbeb21a30dd8a3e66bf7a73b66e05e1f6"
 +                "reference": "e864bbf5904cb8f5bb334f99209b48018522f042"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/doctrine/lexer/zipball/5242d66dbeb21a30dd8a3e66bf7a73b66e05e1f6",
 -                "reference": "5242d66dbeb21a30dd8a3e66bf7a73b66e05e1f6",
 +                "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042",
 +                "reference": "e864bbf5904cb8f5bb334f99209b48018522f042",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.2"
 +                "php": "^7.2 || ^8.0"
              },
              "require-dev": {
                  "doctrine/coding-standard": "^6.0",
                  "parser",
                  "php"
              ],
 -            "time": "2019-10-30T14:39:59+00:00"
 +            "support": {
 +                "issues": "https://github.com/doctrine/lexer/issues",
 +                "source": "https://github.com/doctrine/lexer/tree/1.2.1"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://www.doctrine-project.org/sponsorship.html",
 +                    "type": "custom"
 +                },
 +                {
 +                    "url": "https://www.patreon.com/phpdoctrine",
 +                    "type": "patreon"
 +                },
 +                {
 +                    "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer",
 +                    "type": "tidelift"
 +                }
 +            ],
 +            "time": "2020-05-25T17:44:05+00:00"
          },
          {
              "name": "dompdf/dompdf",
 -            "version": "v0.8.5",
 +            "version": "v1.0.2",
              "source": {
                  "type": "git",
                  "url": "https://github.com/dompdf/dompdf.git",
 -                "reference": "6782abfc090b132134cd6cea0ec6d76f0fce2c56"
 +                "reference": "8768448244967a46d6e67b891d30878e0e15d25c"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/dompdf/dompdf/zipball/6782abfc090b132134cd6cea0ec6d76f0fce2c56",
 -                "reference": "6782abfc090b132134cd6cea0ec6d76f0fce2c56",
 +                "url": "https://api.github.com/repos/dompdf/dompdf/zipball/8768448244967a46d6e67b891d30878e0e15d25c",
 +                "reference": "8768448244967a46d6e67b891d30878e0e15d25c",
                  "shasum": ""
              },
              "require": {
                  "ext-dom": "*",
                  "ext-mbstring": "*",
 -                "phenx/php-font-lib": "^0.5.1",
 +                "phenx/php-font-lib": "^0.5.2",
                  "phenx/php-svg-lib": "^0.3.3",
 -                "php": "^7.1"
 +                "php": "^7.1 || ^8.0"
              },
              "require-dev": {
 -                "phpunit/phpunit": "^7.5",
 +                "mockery/mockery": "^1.3",
 +                "phpunit/phpunit": "^7.5 || ^8 || ^9",
                  "squizlabs/php_codesniffer": "^3.5"
              },
              "suggest": {
                  "ext-gd": "Needed to process images",
                  "ext-gmagick": "Improves image processing performance",
 -                "ext-imagick": "Improves image processing performance"
 +                "ext-imagick": "Improves image processing performance",
 +                "ext-zlib": "Needed for pdf stream compression"
              },
              "type": "library",
              "extra": {
              ],
              "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter",
              "homepage": "https://github.com/dompdf/dompdf",
 -            "time": "2020-02-20T03:52:51+00:00"
 +            "support": {
 +                "issues": "https://github.com/dompdf/dompdf/issues",
 +                "source": "https://github.com/dompdf/dompdf/tree/v1.0.2"
 +            },
 +            "time": "2021-01-08T14:18:52+00:00"
          },
          {
              "name": "dragonmantank/cron-expression",
 -            "version": "v2.3.0",
 +            "version": "v2.3.1",
              "source": {
                  "type": "git",
                  "url": "https://github.com/dragonmantank/cron-expression.git",
 -                "reference": "72b6fbf76adb3cf5bc0db68559b33d41219aba27"
 +                "reference": "65b2d8ee1f10915efb3b55597da3404f096acba2"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/72b6fbf76adb3cf5bc0db68559b33d41219aba27",
 -                "reference": "72b6fbf76adb3cf5bc0db68559b33d41219aba27",
 +                "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/65b2d8ee1f10915efb3b55597da3404f096acba2",
 +                "reference": "65b2d8ee1f10915efb3b55597da3404f096acba2",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.0"
 +                "php": "^7.0|^8.0"
              },
              "require-dev": {
 -                "phpunit/phpunit": "^6.4|^7.0"
 +                "phpunit/phpunit": "^6.4|^7.0|^8.0|^9.0"
              },
              "type": "library",
              "extra": {
                  "cron",
                  "schedule"
              ],
 -            "time": "2019-03-31T00:38:28+00:00"
 +            "support": {
 +                "issues": "https://github.com/dragonmantank/cron-expression/issues",
 +                "source": "https://github.com/dragonmantank/cron-expression/tree/v2.3.1"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/dragonmantank",
 +                    "type": "github"
 +                }
 +            ],
 +            "time": "2020-10-13T00:52:37+00:00"
          },
          {
              "name": "egulias/email-validator",
 -            "version": "2.1.17",
 +            "version": "2.1.25",
              "source": {
                  "type": "git",
                  "url": "https://github.com/egulias/EmailValidator.git",
 -                "reference": "ade6887fd9bd74177769645ab5c474824f8a418a"
 +                "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ade6887fd9bd74177769645ab5c474824f8a418a",
 -                "reference": "ade6887fd9bd74177769645ab5c474824f8a418a",
 +                "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/0dbf5d78455d4d6a41d186da50adc1122ec066f4",
 +                "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4",
                  "shasum": ""
              },
              "require": {
              },
              "autoload": {
                  "psr-4": {
 -                    "Egulias\\EmailValidator\\": "EmailValidator"
 +                    "Egulias\\EmailValidator\\": "src"
                  }
              },
              "notification-url": "https://packagist.org/downloads/",
                  "validation",
                  "validator"
              ],
 -            "time": "2020-02-13T22:36:52+00:00"
 +            "support": {
 +                "issues": "https://github.com/egulias/EmailValidator/issues",
 +                "source": "https://github.com/egulias/EmailValidator/tree/2.1.25"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/egulias",
 +                    "type": "github"
 +                }
 +            ],
 +            "time": "2020-12-29T14:50:06+00:00"
          },
          {
              "name": "facade/flare-client-php",
 -            "version": "1.3.2",
 +            "version": "1.9.1",
              "source": {
                  "type": "git",
                  "url": "https://github.com/facade/flare-client-php.git",
 -                "reference": "db1e03426e7f9472c9ecd1092aff00f56aa6c004"
 +                "reference": "b2adf1512755637d0cef4f7d1b54301325ac78ed"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/facade/flare-client-php/zipball/db1e03426e7f9472c9ecd1092aff00f56aa6c004",
 -                "reference": "db1e03426e7f9472c9ecd1092aff00f56aa6c004",
 +                "url": "https://api.github.com/repos/facade/flare-client-php/zipball/b2adf1512755637d0cef4f7d1b54301325ac78ed",
 +                "reference": "b2adf1512755637d0cef4f7d1b54301325ac78ed",
                  "shasum": ""
              },
              "require": {
                  "facade/ignition-contracts": "~1.0",
 -                "illuminate/pipeline": "^5.5|^6.0|^7.0",
 -                "php": "^7.1",
 +                "illuminate/pipeline": "^5.5|^6.0|^7.0|^8.0",
 +                "php": "^7.1|^8.0",
                  "symfony/http-foundation": "^3.3|^4.1|^5.0",
 +                "symfony/mime": "^3.4|^4.0|^5.1",
                  "symfony/var-dumper": "^3.4|^4.0|^5.0"
              },
              "require-dev": {
 -                "larapack/dd": "^1.1",
 +                "friendsofphp/php-cs-fixer": "^2.14",
                  "phpunit/phpunit": "^7.5.16",
                  "spatie/phpunit-snapshot-assertions": "^2.0"
              },
                  "flare",
                  "reporting"
              ],
 -            "time": "2020-03-02T15:52:04+00:00"
 +            "support": {
 +                "issues": "https://github.com/facade/flare-client-php/issues",
 +                "source": "https://github.com/facade/flare-client-php/tree/1.9.1"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/spatie",
 +                    "type": "github"
 +                }
 +            ],
 +            "time": "2021-09-13T12:16:46+00:00"
          },
          {
              "name": "facade/ignition",
 -            "version": "1.16.1",
 +            "version": "1.18.0",
              "source": {
                  "type": "git",
                  "url": "https://github.com/facade/ignition.git",
 -                "reference": "af05ac5ee8587395d7474ec0681c08776a2cb09d"
 +                "reference": "fca0cbe5f900f94773d821b481c16d4ea3503491"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/facade/ignition/zipball/af05ac5ee8587395d7474ec0681c08776a2cb09d",
 -                "reference": "af05ac5ee8587395d7474ec0681c08776a2cb09d",
 +                "url": "https://api.github.com/repos/facade/ignition/zipball/fca0cbe5f900f94773d821b481c16d4ea3503491",
 +                "reference": "fca0cbe5f900f94773d821b481c16d4ea3503491",
                  "shasum": ""
              },
              "require": {
                  "filp/whoops": "^2.4",
                  "illuminate/support": "~5.5.0 || ~5.6.0 || ~5.7.0 || ~5.8.0 || ^6.0",
                  "monolog/monolog": "^1.12 || ^2.0",
 -                "php": "^7.1",
 +                "php": "^7.1|^8.0",
                  "scrivo/highlight.php": "^9.15",
                  "symfony/console": "^3.4 || ^4.0",
                  "symfony/var-dumper": "^3.4 || ^4.0"
              },
              "require-dev": {
 -                "friendsofphp/php-cs-fixer": "^2.14",
 -                "mockery/mockery": "^1.2",
 +                "mockery/mockery": "~1.3.3|^1.4.2",
                  "orchestra/testbench": "^3.5 || ^3.6 || ^3.7 || ^3.8 || ^4.0"
              },
              "suggest": {
                  "laravel",
                  "page"
              ],
 -            "time": "2020-03-05T12:39:07+00:00"
 +            "support": {
 +                "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction",
 +                "forum": "https://twitter.com/flareappio",
 +                "issues": "https://github.com/facade/ignition/issues",
 +                "source": "https://github.com/facade/ignition"
 +            },
 +            "time": "2021-08-02T07:45:03+00:00"
          },
          {
              "name": "facade/ignition-contracts",
 -            "version": "1.0.0",
 +            "version": "1.0.2",
              "source": {
                  "type": "git",
                  "url": "https://github.com/facade/ignition-contracts.git",
 -                "reference": "f445db0fb86f48e205787b2592840dd9c80ded28"
 +                "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/facade/ignition-contracts/zipball/f445db0fb86f48e205787b2592840dd9c80ded28",
 -                "reference": "f445db0fb86f48e205787b2592840dd9c80ded28",
 +                "url": "https://api.github.com/repos/facade/ignition-contracts/zipball/3c921a1cdba35b68a7f0ccffc6dffc1995b18267",
 +                "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.1"
 +                "php": "^7.3|^8.0"
 +            },
 +            "require-dev": {
 +                "friendsofphp/php-cs-fixer": "^v2.15.8",
 +                "phpunit/phpunit": "^9.3.11",
 +                "vimeo/psalm": "^3.17.1"
              },
              "type": "library",
              "autoload": {
                  "flare",
                  "ignition"
              ],
 -            "time": "2019-08-30T14:06:08+00:00"
 +            "support": {
 +                "issues": "https://github.com/facade/ignition-contracts/issues",
 +                "source": "https://github.com/facade/ignition-contracts/tree/1.0.2"
 +            },
 +            "time": "2020-10-16T08:27:54+00:00"
          },
          {
              "name": "fideloper/proxy",
 -            "version": "4.3.0",
 +            "version": "4.4.1",
              "source": {
                  "type": "git",
                  "url": "https://github.com/fideloper/TrustedProxy.git",
 -                "reference": "ec38ad69ee378a1eec04fb0e417a97cfaf7ed11a"
 +                "reference": "c073b2bd04d1c90e04dc1b787662b558dd65ade0"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/ec38ad69ee378a1eec04fb0e417a97cfaf7ed11a",
 -                "reference": "ec38ad69ee378a1eec04fb0e417a97cfaf7ed11a",
 +                "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/c073b2bd04d1c90e04dc1b787662b558dd65ade0",
 +                "reference": "c073b2bd04d1c90e04dc1b787662b558dd65ade0",
                  "shasum": ""
              },
              "require": {
 -                "illuminate/contracts": "^5.0|^6.0|^7.0|^8.0",
 +                "illuminate/contracts": "^5.0|^6.0|^7.0|^8.0|^9.0",
                  "php": ">=5.4.0"
              },
              "require-dev": {
 -                "illuminate/http": "^5.0|^6.0|^7.0|^8.0",
 +                "illuminate/http": "^5.0|^6.0|^7.0|^8.0|^9.0",
                  "mockery/mockery": "^1.0",
                  "phpunit/phpunit": "^6.0"
              },
                  "proxy",
                  "trusted proxy"
              ],
 -            "time": "2020-02-22T01:51:47+00:00"
 +            "support": {
 +                "issues": "https://github.com/fideloper/TrustedProxy/issues",
 +                "source": "https://github.com/fideloper/TrustedProxy/tree/4.4.1"
 +            },
 +            "time": "2020-10-22T13:48:01+00:00"
          },
          {
              "name": "filp/whoops",
 -            "version": "2.7.2",
 +            "version": "2.14.1",
              "source": {
                  "type": "git",
                  "url": "https://github.com/filp/whoops.git",
 -                "reference": "17d0d3f266c8f925ebd035cd36f83cf802b47d4a"
 +                "reference": "15ead64e9828f0fc90932114429c4f7923570cb1"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/filp/whoops/zipball/17d0d3f266c8f925ebd035cd36f83cf802b47d4a",
 -                "reference": "17d0d3f266c8f925ebd035cd36f83cf802b47d4a",
 +                "url": "https://api.github.com/repos/filp/whoops/zipball/15ead64e9828f0fc90932114429c4f7923570cb1",
 +                "reference": "15ead64e9828f0fc90932114429c4f7923570cb1",
                  "shasum": ""
              },
              "require": {
 -                "php": "^5.5.9 || ^7.0",
 +                "php": "^5.5.9 || ^7.0 || ^8.0",
                  "psr/log": "^1.0.1"
              },
              "require-dev": {
                  "mockery/mockery": "^0.9 || ^1.0",
 -                "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0",
 +                "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3",
                  "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0"
              },
              "suggest": {
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "2.6-dev"
 +                    "dev-master": "2.7-dev"
                  }
              },
              "autoload": {
                  "throwable",
                  "whoops"
              ],
 -            "time": "2020-05-05T12:28:07+00:00"
 -        },
 -        {
 -            "name": "gathercontent/htmldiff",
 -            "version": "0.2.1",
 -            "source": {
 -                "type": "git",
 -                "url": "https://github.com/gathercontent/htmldiff.git",
 -                "reference": "24674a62315f64330134b4a4c5b01a7b59193c93"
 -            },
 -            "dist": {
 -                "type": "zip",
 -                "url": "https://api.github.com/repos/gathercontent/htmldiff/zipball/24674a62315f64330134b4a4c5b01a7b59193c93",
 -                "reference": "24674a62315f64330134b4a4c5b01a7b59193c93",
 -                "shasum": ""
 -            },
 -            "require": {
 -                "cogpowered/finediff": "0.3.1",
 -                "ext-tidy": "*"
 -            },
 -            "require-dev": {
 -                "phpunit/phpunit": "4.*",
 -                "squizlabs/php_codesniffer": "1.*"
 -            },
 -            "type": "library",
 -            "autoload": {
 -                "psr-0": {
 -                    "GatherContent\\Htmldiff": "src/"
 -                }
 +            "support": {
 +                "issues": "https://github.com/filp/whoops/issues",
 +                "source": "https://github.com/filp/whoops/tree/2.14.1"
              },
 -            "notification-url": "https://packagist.org/downloads/",
 -            "license": [
 -                "MIT"
 -            ],
 -            "authors": [
 -                {
 -                    "name": "Andrew Cairns",
 -                    "email": "[email protected]"
 -                },
 -                {
 -                    "name": "Mathew Chapman",
 -                    "email": "[email protected]"
 -                },
 +            "funding": [
                  {
 -                    "name": "Peter Legierski",
 -                    "email": "[email protected]"
 +                    "url": "https://github.com/denis-sokolov",
 +                    "type": "github"
                  }
              ],
 -            "description": "Compare two HTML strings",
 -            "time": "2015-04-15T15:39:46+00:00"
 +            "time": "2021-08-29T12:00:00+00:00"
          },
          {
              "name": "guzzlehttp/guzzle",
 -            "version": "6.5.3",
 +            "version": "7.3.0",
              "source": {
                  "type": "git",
                  "url": "https://github.com/guzzle/guzzle.git",
 -                "reference": "aab4ebd862aa7d04f01a4b51849d657db56d882e"
 +                "reference": "7008573787b430c1c1f650e3722d9bba59967628"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/guzzle/guzzle/zipball/aab4ebd862aa7d04f01a4b51849d657db56d882e",
 -                "reference": "aab4ebd862aa7d04f01a4b51849d657db56d882e",
 +                "url": "https://api.github.com/repos/guzzle/guzzle/zipball/7008573787b430c1c1f650e3722d9bba59967628",
 +                "reference": "7008573787b430c1c1f650e3722d9bba59967628",
                  "shasum": ""
              },
              "require": {
                  "ext-json": "*",
 -                "guzzlehttp/promises": "^1.0",
 -                "guzzlehttp/psr7": "^1.6.1",
 -                "php": ">=5.5",
 -                "symfony/polyfill-intl-idn": "^1.11"
 +                "guzzlehttp/promises": "^1.4",
 +                "guzzlehttp/psr7": "^1.7 || ^2.0",
 +                "php": "^7.2.5 || ^8.0",
 +                "psr/http-client": "^1.0"
 +            },
 +            "provide": {
 +                "psr/http-client-implementation": "1.0"
              },
              "require-dev": {
 +                "bamarni/composer-bin-plugin": "^1.4.1",
                  "ext-curl": "*",
 -                "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0",
 +                "php-http/client-integration-tests": "^3.0",
 +                "phpunit/phpunit": "^8.5.5 || ^9.3.5",
                  "psr/log": "^1.1"
              },
              "suggest": {
 +                "ext-curl": "Required for CURL handler support",
 +                "ext-intl": "Required for Internationalized Domain Name (IDN) support",
                  "psr/log": "Required for using the Log middleware"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "6.5-dev"
 +                    "dev-master": "7.3-dev"
                  }
              },
              "autoload": {
                      "name": "Michael Dowling",
                      "email": "[email protected]",
                      "homepage": "https://github.com/mtdowling"
 +                },
 +                {
 +                    "name": "Márk Sági-Kazár",
 +                    "email": "[email protected]",
 +                    "homepage": "https://sagikazarmark.hu"
                  }
              ],
              "description": "Guzzle is a PHP HTTP client library",
                  "framework",
                  "http",
                  "http client",
 +                "psr-18",
 +                "psr-7",
                  "rest",
                  "web service"
              ],
 -            "time": "2020-04-18T10:38:46+00:00"
 -        },
 -        {
 -            "name": "guzzlehttp/promises",
 -            "version": "v1.3.1",
 -            "source": {
 -                "type": "git",
 -                "url": "https://github.com/guzzle/promises.git",
 -                "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
 -            },
 -            "dist": {
 -                "type": "zip",
 -                "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646",
 -                "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
 -                "shasum": ""
 -            },
 -            "require": {
 -                "php": ">=5.5.0"
 -            },
 -            "require-dev": {
 -                "phpunit/phpunit": "^4.0"
 +            "support": {
 +                "issues": "https://github.com/guzzle/guzzle/issues",
 +                "source": "https://github.com/guzzle/guzzle/tree/7.3.0"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/GrahamCampbell",
 +                    "type": "github"
 +                },
 +                {
 +                    "url": "https://github.com/Nyholm",
 +                    "type": "github"
 +                },
 +                {
 +                    "url": "https://github.com/alexeyshockov",
 +                    "type": "github"
 +                },
 +                {
 +                    "url": "https://github.com/gmponos",
 +                    "type": "github"
 +                }
 +            ],
 +            "time": "2021-03-23T11:33:13+00:00"
 +        },
 +        {
 +            "name": "guzzlehttp/promises",
 +            "version": "1.4.1",
 +            "source": {
 +                "type": "git",
 +                "url": "https://github.com/guzzle/promises.git",
 +                "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d"
 +            },
 +            "dist": {
 +                "type": "zip",
 +                "url": "https://api.github.com/repos/guzzle/promises/zipball/8e7d04f1f6450fef59366c399cfad4b9383aa30d",
 +                "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d",
 +                "shasum": ""
 +            },
 +            "require": {
 +                "php": ">=5.5"
 +            },
 +            "require-dev": {
 +                "symfony/phpunit-bridge": "^4.4 || ^5.1"
              },
              "type": "library",
              "extra": {
              "keywords": [
                  "promise"
              ],
 -            "time": "2016-12-20T10:07:11+00:00"
 +            "support": {
 +                "issues": "https://github.com/guzzle/promises/issues",
 +                "source": "https://github.com/guzzle/promises/tree/1.4.1"
 +            },
 +            "time": "2021-03-07T09:25:29+00:00"
          },
          {
              "name": "guzzlehttp/psr7",
 -            "version": "1.6.1",
 +            "version": "1.8.2",
              "source": {
                  "type": "git",
                  "url": "https://github.com/guzzle/psr7.git",
 -                "reference": "239400de7a173fe9901b9ac7c06497751f00727a"
 +                "reference": "dc960a912984efb74d0a90222870c72c87f10c91"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a",
 -                "reference": "239400de7a173fe9901b9ac7c06497751f00727a",
 +                "url": "https://api.github.com/repos/guzzle/psr7/zipball/dc960a912984efb74d0a90222870c72c87f10c91",
 +                "reference": "dc960a912984efb74d0a90222870c72c87f10c91",
                  "shasum": ""
              },
              "require": {
              },
              "require-dev": {
                  "ext-zlib": "*",
 -                "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8"
 +                "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10"
              },
              "suggest": {
 -                "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses"
 +                "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "1.6-dev"
 +                    "dev-master": "1.7-dev"
                  }
              },
              "autoload": {
                  "uri",
                  "url"
              ],
 -            "time": "2019-07-01T23:21:34+00:00"
 +            "support": {
 +                "issues": "https://github.com/guzzle/psr7/issues",
 +                "source": "https://github.com/guzzle/psr7/tree/1.8.2"
 +            },
 +            "time": "2021-04-26T09:17:50+00:00"
          },
          {
              "name": "intervention/image",
 -            "version": "2.5.1",
 +            "version": "2.6.1",
              "source": {
                  "type": "git",
                  "url": "https://github.com/Intervention/image.git",
 -                "reference": "abbf18d5ab8367f96b3205ca3c89fb2fa598c69e"
 +                "reference": "0925f10b259679b5d8ca58f3a2add9255ffcda45"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/Intervention/image/zipball/abbf18d5ab8367f96b3205ca3c89fb2fa598c69e",
 -                "reference": "abbf18d5ab8367f96b3205ca3c89fb2fa598c69e",
 +                "url": "https://api.github.com/repos/Intervention/image/zipball/0925f10b259679b5d8ca58f3a2add9255ffcda45",
 +                "reference": "0925f10b259679b5d8ca58f3a2add9255ffcda45",
                  "shasum": ""
              },
              "require": {
                  "ext-fileinfo": "*",
 -                "guzzlehttp/psr7": "~1.1",
 +                "guzzlehttp/psr7": "~1.1 || ^2.0",
                  "php": ">=5.4.0"
              },
              "require-dev": {
                  "mockery/mockery": "~0.9.2",
 -                "phpunit/phpunit": "^4.8 || ^5.7"
 +                "phpunit/phpunit": "^4.8 || ^5.7 || ^7.5.15"
              },
              "suggest": {
                  "ext-gd": "to use GD library based image processing.",
                  "thumbnail",
                  "watermark"
              ],
 -            "time": "2019-11-02T09:15:47+00:00"
 -        },
 -        {
 -            "name": "jakub-onderka/php-console-color",
 -            "version": "v0.2",
 -            "source": {
 -                "type": "git",
 -                "url": "https://github.com/JakubOnderka/PHP-Console-Color.git",
 -                "reference": "d5deaecff52a0d61ccb613bb3804088da0307191"
 -            },
 -            "dist": {
 -                "type": "zip",
 -                "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Color/zipball/d5deaecff52a0d61ccb613bb3804088da0307191",
 -                "reference": "d5deaecff52a0d61ccb613bb3804088da0307191",
 -                "shasum": ""
 -            },
 -            "require": {
 -                "php": ">=5.4.0"
 -            },
 -            "require-dev": {
 -                "jakub-onderka/php-code-style": "1.0",
 -                "jakub-onderka/php-parallel-lint": "1.0",
 -                "jakub-onderka/php-var-dump-check": "0.*",
 -                "phpunit/phpunit": "~4.3",
 -                "squizlabs/php_codesniffer": "1.*"
 -            },
 -            "type": "library",
 -            "autoload": {
 -                "psr-4": {
 -                    "JakubOnderka\\PhpConsoleColor\\": "src/"
 -                }
 +            "support": {
 +                "issues": "https://github.com/Intervention/image/issues",
 +                "source": "https://github.com/Intervention/image/tree/2.6.1"
              },
 -            "notification-url": "https://packagist.org/downloads/",
 -            "license": [
 -                "BSD-2-Clause"
 -            ],
 -            "authors": [
 +            "funding": [
                  {
 -                    "name": "Jakub Onderka",
 -                    "email": "[email protected]"
 -                }
 -            ],
 -            "abandoned": "php-parallel-lint/php-console-color",
 -            "time": "2018-09-29T17:23:10+00:00"
 -        },
 -        {
 -            "name": "jakub-onderka/php-console-highlighter",
 -            "version": "v0.4",
 -            "source": {
 -                "type": "git",
 -                "url": "https://github.com/JakubOnderka/PHP-Console-Highlighter.git",
 -                "reference": "9f7a229a69d52506914b4bc61bfdb199d90c5547"
 -            },
 -            "dist": {
 -                "type": "zip",
 -                "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Highlighter/zipball/9f7a229a69d52506914b4bc61bfdb199d90c5547",
 -                "reference": "9f7a229a69d52506914b4bc61bfdb199d90c5547",
 -                "shasum": ""
 -            },
 -            "require": {
 -                "ext-tokenizer": "*",
 -                "jakub-onderka/php-console-color": "~0.2",
 -                "php": ">=5.4.0"
 -            },
 -            "require-dev": {
 -                "jakub-onderka/php-code-style": "~1.0",
 -                "jakub-onderka/php-parallel-lint": "~1.0",
 -                "jakub-onderka/php-var-dump-check": "~0.1",
 -                "phpunit/phpunit": "~4.0",
 -                "squizlabs/php_codesniffer": "~1.5"
 -            },
 -            "type": "library",
 -            "autoload": {
 -                "psr-4": {
 -                    "JakubOnderka\\PhpConsoleHighlighter\\": "src/"
 -                }
 -            },
 -            "notification-url": "https://packagist.org/downloads/",
 -            "license": [
 -                "MIT"
 -            ],
 -            "authors": [
 +                    "url": "https://www.paypal.me/interventionphp",
 +                    "type": "custom"
 +                },
                  {
 -                    "name": "Jakub Onderka",
 -                    "email": "[email protected]",
 -                    "homepage": "http://www.acci.cz/"
 +                    "url": "https://github.com/Intervention",
 +                    "type": "github"
                  }
              ],
 -            "description": "Highlight PHP code in terminal",
 -            "abandoned": "php-parallel-lint/php-console-highlighter",
 -            "time": "2018-09-29T18:48:56+00:00"
 +            "time": "2021-07-22T14:31:53+00:00"
          },
          {
              "name": "knplabs/knp-snappy",
                  "thumbnail",
                  "wkhtmltopdf"
              ],
 +            "support": {
 +                "issues": "https://github.com/KnpLabs/snappy/issues",
 +                "source": "https://github.com/KnpLabs/snappy/tree/master"
 +            },
              "time": "2020-01-20T08:30:30+00:00"
          },
          {
              "name": "laravel/framework",
 -            "version": "v6.18.15",
 +            "version": "v6.20.34",
              "source": {
                  "type": "git",
                  "url": "https://github.com/laravel/framework.git",
 -                "reference": "a1fa3ddc0bb5285cafa6844b443633f7627d75dc"
 +                "reference": "72a6da88c90cee793513b3fe49cf0fcb368eefa0"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/laravel/framework/zipball/a1fa3ddc0bb5285cafa6844b443633f7627d75dc",
 -                "reference": "a1fa3ddc0bb5285cafa6844b443633f7627d75dc",
 +                "url": "https://api.github.com/repos/laravel/framework/zipball/72a6da88c90cee793513b3fe49cf0fcb368eefa0",
 +                "reference": "72a6da88c90cee793513b3fe49cf0fcb368eefa0",
                  "shasum": ""
              },
              "require": {
                  "doctrine/inflector": "^1.4|^2.0",
 -                "dragonmantank/cron-expression": "^2.0",
 +                "dragonmantank/cron-expression": "^2.3.1",
                  "egulias/email-validator": "^2.1.10",
                  "ext-json": "*",
                  "ext-mbstring": "*",
                  "ext-openssl": "*",
                  "league/commonmark": "^1.3",
 -                "league/flysystem": "^1.0.8",
 +                "league/flysystem": "^1.1",
                  "monolog/monolog": "^1.12|^2.0",
 -                "nesbot/carbon": "^2.0",
 -                "opis/closure": "^3.1",
 -                "php": "^7.2",
 +                "nesbot/carbon": "^2.31",
 +                "opis/closure": "^3.6",
 +                "php": "^7.2.5|^8.0",
                  "psr/container": "^1.0",
                  "psr/simple-cache": "^1.0",
                  "ramsey/uuid": "^3.7",
                  "illuminate/view": "self.version"
              },
              "require-dev": {
 -                "aws/aws-sdk-php": "^3.0",
 +                "aws/aws-sdk-php": "^3.155",
                  "doctrine/dbal": "^2.6",
 -                "filp/whoops": "^2.4",
 -                "guzzlehttp/guzzle": "^6.3|^7.0",
 +                "filp/whoops": "^2.8",
 +                "guzzlehttp/guzzle": "^6.3.1|^7.0.1",
                  "league/flysystem-cached-adapter": "^1.0",
 -                "mockery/mockery": "^1.3.1",
 +                "mockery/mockery": "~1.3.3|^1.4.2",
                  "moontoast/math": "^1.1",
 -                "orchestra/testbench-core": "^4.0",
 +                "orchestra/testbench-core": "^4.8",
                  "pda/pheanstalk": "^4.0",
 -                "phpunit/phpunit": "^7.5.15|^8.4|^9.0",
 +                "phpunit/phpunit": "^7.5.15|^8.4|^9.3.3",
                  "predis/predis": "^1.1.1",
                  "symfony/cache": "^4.3.4"
              },
              "suggest": {
 -                "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage and SES mail driver (^3.0).",
 +                "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage and SES mail driver (^3.155).",
                  "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.6).",
 +                "ext-ftp": "Required to use the Flysystem FTP driver.",
                  "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().",
                  "ext-memcached": "Required to use the memcache cache driver.",
                  "ext-pcntl": "Required to use all features of the queue worker.",
                  "ext-posix": "Required to use all features of the queue worker.",
                  "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).",
 -                "filp/whoops": "Required for friendly error pages in development (^2.4).",
 -                "fzaninotto/faker": "Required to use the eloquent factory builder (^1.9.1).",
 -                "guzzlehttp/guzzle": "Required to use the Mailgun mail driver and the ping methods on schedules (^6.0|^7.0).",
 +                "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).",
 +                "filp/whoops": "Required for friendly error pages in development (^2.8).",
 +                "guzzlehttp/guzzle": "Required to use the Mailgun mail driver and the ping methods on schedules (^6.3.1|^7.0.1).",
                  "laravel/tinker": "Required to use the tinker console command (^2.0).",
                  "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).",
                  "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).",
                  "moontoast/math": "Required to use ordered UUIDs (^1.1).",
                  "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).",
                  "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).",
 +                "predis/predis": "Required to use the predis connector (^1.1.2).",
                  "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).",
                  "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^4.0).",
                  "symfony/cache": "Required to PSR-6 cache bridge (^4.3.4).",
                  "framework",
                  "laravel"
              ],
 -            "time": "2020-05-19T17:03:02+00:00"
 +            "support": {
 +                "issues": "https://github.com/laravel/framework/issues",
 +                "source": "https://github.com/laravel/framework"
 +            },
 +            "time": "2021-09-07T13:28:55+00:00"
          },
          {
              "name": "laravel/socialite",
 -            "version": "v4.3.2",
 +            "version": "v5.2.5",
              "source": {
                  "type": "git",
                  "url": "https://github.com/laravel/socialite.git",
 -                "reference": "4bd66ee416fea04398dee5b8c32d65719a075db4"
 +                "reference": "fd0f6a3dd963ca480b598649b54f92d81a43617f"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/laravel/socialite/zipball/4bd66ee416fea04398dee5b8c32d65719a075db4",
 -                "reference": "4bd66ee416fea04398dee5b8c32d65719a075db4",
 +                "url": "https://api.github.com/repos/laravel/socialite/zipball/fd0f6a3dd963ca480b598649b54f92d81a43617f",
 +                "reference": "fd0f6a3dd963ca480b598649b54f92d81a43617f",
                  "shasum": ""
              },
              "require": {
                  "ext-json": "*",
 -                "guzzlehttp/guzzle": "~6.0",
 -                "illuminate/http": "~5.7.0|~5.8.0|^6.0|^7.0",
 -                "illuminate/support": "~5.7.0|~5.8.0|^6.0|^7.0",
 -                "league/oauth1-client": "~1.0",
 -                "php": "^7.1.3"
 +                "guzzlehttp/guzzle": "^6.0|^7.0",
 +                "illuminate/http": "^6.0|^7.0|^8.0",
 +                "illuminate/support": "^6.0|^7.0|^8.0",
 +                "league/oauth1-client": "^1.0",
 +                "php": "^7.2|^8.0"
              },
              "require-dev": {
 -                "illuminate/contracts": "~5.7.0|~5.8.0|^6.0|^7.0",
 +                "illuminate/contracts": "^6.0|^7.0",
                  "mockery/mockery": "^1.0",
 -                "phpunit/phpunit": "^7.0|^8.0"
 +                "orchestra/testbench": "^4.0|^5.0|^6.0",
 +                "phpunit/phpunit": "^8.0|^9.3"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "4.x-dev"
 +                    "dev-master": "5.x-dev"
                  },
                  "laravel": {
                      "providers": [
                  "laravel",
                  "oauth"
              ],
 -            "time": "2020-02-04T15:30:01+00:00"
 +            "support": {
 +                "issues": "https://github.com/laravel/socialite/issues",
 +                "source": "https://github.com/laravel/socialite"
 +            },
 +            "time": "2021-08-31T15:16:26+00:00"
          },
+         {
+             "name": "lcobucci/jwt",
+             "version": "3.3.2",
+             "source": {
+                 "type": "git",
+                 "url": "https://github.com/lcobucci/jwt.git",
+                 "reference": "56f10808089e38623345e28af2f2d5e4eb579455"
+             },
+             "dist": {
+                 "type": "zip",
+                 "url": "https://api.github.com/repos/lcobucci/jwt/zipball/56f10808089e38623345e28af2f2d5e4eb579455",
+                 "reference": "56f10808089e38623345e28af2f2d5e4eb579455",
+                 "shasum": ""
+             },
+             "require": {
+                 "ext-mbstring": "*",
+                 "ext-openssl": "*",
+                 "php": "^5.6 || ^7.0"
+             },
+             "require-dev": {
+                 "mikey179/vfsstream": "~1.5",
+                 "phpmd/phpmd": "~2.2",
+                 "phpunit/php-invoker": "~1.1",
+                 "phpunit/phpunit": "^5.7 || ^7.3",
+                 "squizlabs/php_codesniffer": "~2.3"
+             },
+             "type": "library",
+             "extra": {
+                 "branch-alias": {
+                     "dev-master": "3.1-dev"
+                 }
+             },
+             "autoload": {
+                 "psr-4": {
+                     "Lcobucci\\JWT\\": "src"
+                 }
+             },
+             "notification-url": "https://packagist.org/downloads/",
+             "license": [
+                 "BSD-3-Clause"
+             ],
+             "authors": [
+                 {
+                     "name": "Luís Otávio Cobucci Oblonczyk",
+                     "email": "[email protected]",
+                     "role": "Developer"
+                 }
+             ],
+             "description": "A simple library to work with JSON Web Token and JSON Web Signature",
+             "keywords": [
+                 "JWS",
+                 "jwt"
+             ],
+             "funding": [
+                 {
+                     "url": "https://github.com/lcobucci",
+                     "type": "github"
+                 },
+                 {
+                     "url": "https://www.patreon.com/lcobucci",
+                     "type": "patreon"
+                 }
+             ],
+             "time": "2020-05-22T08:21:12+00:00"
+         },
          {
              "name": "league/commonmark",
 -            "version": "1.4.3",
 +            "version": "1.6.6",
              "source": {
                  "type": "git",
                  "url": "https://github.com/thephpleague/commonmark.git",
 -                "reference": "412639f7cfbc0b31ad2455b2fe965095f66ae505"
 +                "reference": "c4228d11e30d7493c6836d20872f9582d8ba6dcf"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/412639f7cfbc0b31ad2455b2fe965095f66ae505",
 -                "reference": "412639f7cfbc0b31ad2455b2fe965095f66ae505",
 +                "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/c4228d11e30d7493c6836d20872f9582d8ba6dcf",
 +                "reference": "c4228d11e30d7493c6836d20872f9582d8ba6dcf",
                  "shasum": ""
              },
              "require": {
                  "ext-mbstring": "*",
 -                "php": "^7.1"
 +                "php": "^7.1 || ^8.0"
              },
              "conflict": {
                  "scrutinizer/ocular": "1.7.*"
              },
              "require-dev": {
                  "cebe/markdown": "~1.0",
 -                "commonmark/commonmark.js": "0.29.1",
 +                "commonmark/commonmark.js": "0.29.2",
                  "erusev/parsedown": "~1.0",
                  "ext-json": "*",
                  "github/gfm": "0.29.0",
                  "michelf/php-markdown": "~1.4",
                  "mikehaertl/php-shellcommand": "^1.4",
 -                "phpstan/phpstan": "^0.12",
 -                "phpunit/phpunit": "^7.5",
 +                "phpstan/phpstan": "^0.12.90",
 +                "phpunit/phpunit": "^7.5 || ^8.5 || ^9.2",
                  "scrutinizer/ocular": "^1.5",
                  "symfony/finder": "^4.2"
              },
                  "bin/commonmark"
              ],
              "type": "library",
 -            "extra": {
 -                "branch-alias": {
 -                    "dev-master": "1.4-dev"
 -                }
 -            },
              "autoload": {
                  "psr-4": {
                      "League\\CommonMark\\": "src"
                  "md",
                  "parser"
              ],
 +            "support": {
 +                "docs": "https://commonmark.thephpleague.com/",
 +                "issues": "https://github.com/thephpleague/commonmark/issues",
 +                "rss": "https://github.com/thephpleague/commonmark/releases.atom",
 +                "source": "https://github.com/thephpleague/commonmark"
 +            },
              "funding": [
                  {
                      "url": "https://enjoy.gitstore.app/repositories/thephpleague/commonmark",
                      "type": "tidelift"
                  }
              ],
 -            "time": "2020-05-04T22:15:21+00:00"
 +            "time": "2021-07-17T17:13:23+00:00"
          },
          {
              "name": "league/flysystem",
 -            "version": "1.0.69",
 +            "version": "1.1.5",
              "source": {
                  "type": "git",
                  "url": "https://github.com/thephpleague/flysystem.git",
 -                "reference": "7106f78428a344bc4f643c233a94e48795f10967"
 +                "reference": "18634df356bfd4119fe3d6156bdb990c414c14ea"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/7106f78428a344bc4f643c233a94e48795f10967",
 -                "reference": "7106f78428a344bc4f643c233a94e48795f10967",
 +                "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/18634df356bfd4119fe3d6156bdb990c414c14ea",
 +                "reference": "18634df356bfd4119fe3d6156bdb990c414c14ea",
                  "shasum": ""
              },
              "require": {
                  "ext-fileinfo": "*",
 -                "php": ">=5.5.9"
 +                "league/mime-type-detection": "^1.3",
 +                "php": "^7.2.5 || ^8.0"
              },
              "conflict": {
                  "league/flysystem-sftp": "<1.0.6"
              },
              "require-dev": {
 -                "phpspec/phpspec": "^3.4",
 -                "phpunit/phpunit": "^5.7.26"
 +                "phpspec/prophecy": "^1.11.1",
 +                "phpunit/phpunit": "^8.5.8"
              },
              "suggest": {
 -                "ext-fileinfo": "Required for MimeType",
                  "ext-ftp": "Allows you to use FTP server storage",
                  "ext-openssl": "Allows you to use FTPS server storage",
                  "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2",
                  "sftp",
                  "storage"
              ],
 +            "support": {
 +                "issues": "https://github.com/thephpleague/flysystem/issues",
 +                "source": "https://github.com/thephpleague/flysystem/tree/1.1.5"
 +            },
              "funding": [
                  {
                      "url": "https://offset.earth/frankdejonge",
                      "type": "other"
                  }
              ],
 -            "time": "2020-05-18T15:13:39+00:00"
 +            "time": "2021-08-17T13:49:42+00:00"
          },
          {
              "name": "league/flysystem-aws-s3-v3",
 -            "version": "1.0.24",
 +            "version": "1.0.29",
              "source": {
                  "type": "git",
                  "url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git",
 -                "reference": "4382036bde5dc926f9b8b337e5bdb15e5ec7b570"
 +                "reference": "4e25cc0582a36a786c31115e419c6e40498f6972"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/4382036bde5dc926f9b8b337e5bdb15e5ec7b570",
 -                "reference": "4382036bde5dc926f9b8b337e5bdb15e5ec7b570",
 +                "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/4e25cc0582a36a786c31115e419c6e40498f6972",
 +                "reference": "4e25cc0582a36a786c31115e419c6e40498f6972",
                  "shasum": ""
              },
              "require": {
 -                "aws/aws-sdk-php": "^3.0.0",
 +                "aws/aws-sdk-php": "^3.20.0",
                  "league/flysystem": "^1.0.40",
                  "php": ">=5.5.0"
              },
                  }
              ],
              "description": "Flysystem adapter for the AWS S3 SDK v3.x",
 -            "time": "2020-02-23T13:31:58+00:00"
 +            "support": {
 +                "issues": "https://github.com/thephpleague/flysystem-aws-s3-v3/issues",
 +                "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/1.0.29"
 +            },
 +            "time": "2020-10-08T18:58:37+00:00"
          },
          {
 -            "name": "league/oauth1-client",
 +            "name": "league/html-to-markdown",
 +            "version": "5.0.1",
 +            "source": {
 +                "type": "git",
 +                "url": "https://github.com/thephpleague/html-to-markdown.git",
 +                "reference": "e5600a2c5ce7b7571b16732c7086940f56f7abec"
 +            },
 +            "dist": {
 +                "type": "zip",
 +                "url": "https://api.github.com/repos/thephpleague/html-to-markdown/zipball/e5600a2c5ce7b7571b16732c7086940f56f7abec",
 +                "reference": "e5600a2c5ce7b7571b16732c7086940f56f7abec",
 +                "shasum": ""
 +            },
 +            "require": {
 +                "ext-dom": "*",
 +                "ext-xml": "*",
 +                "php": "^7.2.5 || ^8.0"
 +            },
 +            "require-dev": {
 +                "mikehaertl/php-shellcommand": "^1.1.0",
 +                "phpstan/phpstan": "^0.12.82",
 +                "phpunit/phpunit": "^8.5 || ^9.2",
 +                "scrutinizer/ocular": "^1.6",
 +                "unleashedtech/php-coding-standard": "^2.7",
 +                "vimeo/psalm": "^4.6"
 +            },
 +            "bin": [
 +                "bin/html-to-markdown"
 +            ],
 +            "type": "library",
 +            "extra": {
 +                "branch-alias": {
 +                    "dev-master": "5.1-dev"
 +                }
 +            },
 +            "autoload": {
 +                "psr-4": {
 +                    "League\\HTMLToMarkdown\\": "src/"
 +                }
 +            },
 +            "notification-url": "https://packagist.org/downloads/",
 +            "license": [
 +                "MIT"
 +            ],
 +            "authors": [
 +                {
 +                    "name": "Colin O'Dell",
 +                    "email": "[email protected]",
 +                    "homepage": "https://www.colinodell.com",
 +                    "role": "Lead Developer"
 +                },
 +                {
 +                    "name": "Nick Cernis",
 +                    "email": "[email protected]",
 +                    "homepage": "http://modernnerd.net",
 +                    "role": "Original Author"
 +                }
 +            ],
 +            "description": "An HTML-to-markdown conversion helper for PHP",
 +            "homepage": "https://github.com/thephpleague/html-to-markdown",
 +            "keywords": [
 +                "html",
 +                "markdown"
 +            ],
 +            "support": {
 +                "issues": "https://github.com/thephpleague/html-to-markdown/issues",
 +                "source": "https://github.com/thephpleague/html-to-markdown/tree/5.0.1"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://www.colinodell.com/sponsor",
 +                    "type": "custom"
 +                },
 +                {
 +                    "url": "https://www.paypal.me/colinpodell/10.00",
 +                    "type": "custom"
 +                },
 +                {
 +                    "url": "https://github.com/colinodell",
 +                    "type": "github"
 +                },
 +                {
 +                    "url": "https://tidelift.com/funding/github/packagist/league/html-to-markdown",
 +                    "type": "tidelift"
 +                }
 +            ],
 +            "time": "2021-09-17T20:00:27+00:00"
 +        },
 +        {
 +            "name": "league/mime-type-detection",
              "version": "1.7.0",
 +            "source": {
 +                "type": "git",
 +                "url": "https://github.com/thephpleague/mime-type-detection.git",
 +                "reference": "3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3"
 +            },
 +            "dist": {
 +                "type": "zip",
 +                "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3",
 +                "reference": "3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3",
 +                "shasum": ""
 +            },
 +            "require": {
 +                "ext-fileinfo": "*",
 +                "php": "^7.2 || ^8.0"
 +            },
 +            "require-dev": {
 +                "friendsofphp/php-cs-fixer": "^2.18",
 +                "phpstan/phpstan": "^0.12.68",
 +                "phpunit/phpunit": "^8.5.8 || ^9.3"
 +            },
 +            "type": "library",
 +            "autoload": {
 +                "psr-4": {
 +                    "League\\MimeTypeDetection\\": "src"
 +                }
 +            },
 +            "notification-url": "https://packagist.org/downloads/",
 +            "license": [
 +                "MIT"
 +            ],
 +            "authors": [
 +                {
 +                    "name": "Frank de Jonge",
 +                    "email": "[email protected]"
 +                }
 +            ],
 +            "description": "Mime-type detection for Flysystem",
 +            "support": {
 +                "issues": "https://github.com/thephpleague/mime-type-detection/issues",
 +                "source": "https://github.com/thephpleague/mime-type-detection/tree/1.7.0"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/frankdejonge",
 +                    "type": "github"
 +                },
 +                {
 +                    "url": "https://tidelift.com/funding/github/packagist/league/flysystem",
 +                    "type": "tidelift"
 +                }
 +            ],
 +            "time": "2021-01-18T20:58:21+00:00"
 +        },
 +        {
 +            "name": "league/oauth1-client",
 +            "version": "v1.10.0",
              "source": {
                  "type": "git",
                  "url": "https://github.com/thephpleague/oauth1-client.git",
 -                "reference": "fca5f160650cb74d23fc11aa570dd61f86dcf647"
 +                "reference": "88dd16b0cff68eb9167bfc849707d2c40ad91ddc"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/thephpleague/oauth1-client/zipball/fca5f160650cb74d23fc11aa570dd61f86dcf647",
 -                "reference": "fca5f160650cb74d23fc11aa570dd61f86dcf647",
 +                "url": "https://api.github.com/repos/thephpleague/oauth1-client/zipball/88dd16b0cff68eb9167bfc849707d2c40ad91ddc",
 +                "reference": "88dd16b0cff68eb9167bfc849707d2c40ad91ddc",
                  "shasum": ""
              },
              "require": {
 -                "guzzlehttp/guzzle": "^6.0",
 -                "php": ">=5.5.0"
 +                "ext-json": "*",
 +                "ext-openssl": "*",
 +                "guzzlehttp/guzzle": "^6.0|^7.0",
 +                "guzzlehttp/psr7": "^1.7|^2.0",
 +                "php": ">=7.1||>=8.0"
              },
              "require-dev": {
 -                "mockery/mockery": "^0.9",
 -                "phpunit/phpunit": "^4.0",
 -                "squizlabs/php_codesniffer": "^2.0"
 +                "ext-simplexml": "*",
 +                "friendsofphp/php-cs-fixer": "^2.17",
 +                "mockery/mockery": "^1.3.3",
 +                "phpstan/phpstan": "^0.12.42",
 +                "phpunit/phpunit": "^7.5||9.5"
 +            },
 +            "suggest": {
 +                "ext-simplexml": "For decoding XML-based responses."
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "1.0-dev"
 +                    "dev-master": "1.0-dev",
 +                    "dev-develop": "2.0-dev"
                  }
              },
              "autoload": {
                  "psr-4": {
 -                    "League\\OAuth1\\": "src/"
 +                    "League\\OAuth1\\Client\\": "src/"
                  }
              },
              "notification-url": "https://packagist.org/downloads/",
                  "tumblr",
                  "twitter"
              ],
 -            "time": "2016-08-17T00:36:58+00:00"
 +            "support": {
 +                "issues": "https://github.com/thephpleague/oauth1-client/issues",
 +                "source": "https://github.com/thephpleague/oauth1-client/tree/v1.10.0"
 +            },
 +            "time": "2021-08-15T23:05:49+00:00"
          },
+         {
+             "name": "league/oauth2-client",
+             "version": "2.4.1",
+             "source": {
+                 "type": "git",
+                 "url": "https://github.com/thephpleague/oauth2-client.git",
+                 "reference": "cc114abc622a53af969e8664722e84ca36257530"
+             },
+             "dist": {
+                 "type": "zip",
+                 "url": "https://api.github.com/repos/thephpleague/oauth2-client/zipball/cc114abc622a53af969e8664722e84ca36257530",
+                 "reference": "cc114abc622a53af969e8664722e84ca36257530",
+                 "shasum": ""
+             },
+             "require": {
+                 "guzzlehttp/guzzle": "^6.0",
+                 "paragonie/random_compat": "^1|^2|^9.99",
+                 "php": "^5.6|^7.0"
+             },
+             "require-dev": {
+                 "eloquent/liberator": "^2.0",
+                 "eloquent/phony-phpunit": "^1.0|^3.0",
+                 "jakub-onderka/php-parallel-lint": "^0.9.2",
+                 "phpunit/phpunit": "^5.7|^6.0",
+                 "squizlabs/php_codesniffer": "^2.3|^3.0"
+             },
+             "type": "library",
+             "extra": {
+                 "branch-alias": {
+                     "dev-2.x": "2.0.x-dev"
+                 }
+             },
+             "autoload": {
+                 "psr-4": {
+                     "League\\OAuth2\\Client\\": "src/"
+                 }
+             },
+             "notification-url": "https://packagist.org/downloads/",
+             "license": [
+                 "MIT"
+             ],
+             "authors": [
+                 {
+                     "name": "Alex Bilbie",
+                     "email": "[email protected]",
+                     "homepage": "http://www.alexbilbie.com",
+                     "role": "Developer"
+                 },
+                 {
+                     "name": "Woody Gilk",
+                     "homepage": "https://github.com/shadowhand",
+                     "role": "Contributor"
+                 }
+             ],
+             "description": "OAuth 2.0 Client Library",
+             "keywords": [
+                 "Authentication",
+                 "SSO",
+                 "authorization",
+                 "identity",
+                 "idp",
+                 "oauth",
+                 "oauth2",
+                 "single sign on"
+             ],
+             "time": "2018-11-22T18:33:57+00:00"
+         },
          {
              "name": "monolog/monolog",
 -            "version": "2.1.0",
 +            "version": "2.3.4",
              "source": {
                  "type": "git",
                  "url": "https://github.com/Seldaek/monolog.git",
 -                "reference": "38914429aac460e8e4616c8cb486ecb40ec90bb1"
 +                "reference": "437e7a1c50044b92773b361af77620efb76fff59"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/Seldaek/monolog/zipball/38914429aac460e8e4616c8cb486ecb40ec90bb1",
 -                "reference": "38914429aac460e8e4616c8cb486ecb40ec90bb1",
 +                "url": "https://api.github.com/repos/Seldaek/monolog/zipball/437e7a1c50044b92773b361af77620efb76fff59",
 +                "reference": "437e7a1c50044b92773b361af77620efb76fff59",
                  "shasum": ""
              },
              "require": {
                  "php": ">=7.2",
 -                "psr/log": "^1.0.1"
 +                "psr/log": "^1.0.1 || ^2.0 || ^3.0"
              },
              "provide": {
 -                "psr/log-implementation": "1.0.0"
 +                "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0"
              },
              "require-dev": {
                  "aws/aws-sdk-php": "^2.4.9 || ^3.0",
                  "doctrine/couchdb": "~1.0@dev",
 -                "elasticsearch/elasticsearch": "^6.0",
 +                "elasticsearch/elasticsearch": "^7",
                  "graylog2/gelf-php": "^1.4.2",
 +                "mongodb/mongodb": "^1.8",
                  "php-amqplib/php-amqplib": "~2.4",
                  "php-console/php-console": "^3.1.3",
 -                "php-parallel-lint/php-parallel-lint": "^1.0",
                  "phpspec/prophecy": "^1.6.1",
 +                "phpstan/phpstan": "^0.12.91",
                  "phpunit/phpunit": "^8.5",
                  "predis/predis": "^1.1",
                  "rollbar/rollbar": "^1.3",
 -                "ruflin/elastica": ">=0.90 <3.0",
 +                "ruflin/elastica": ">=0.90@dev",
                  "swiftmailer/swiftmailer": "^5.3|^6.0"
              },
              "suggest": {
                  "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
                  "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client",
                  "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
 +                "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler",
                  "ext-mbstring": "Allow to work properly with unicode symbols",
                  "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)",
 +                "ext-openssl": "Required to send log messages using SSL",
 +                "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)",
                  "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
                  "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)",
                  "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "2.x-dev"
 +                    "dev-main": "2.x-dev"
                  }
              },
              "autoload": {
                  {
                      "name": "Jordi Boggiano",
                      "email": "[email protected]",
 -                    "homepage": "http://seld.be"
 +                    "homepage": "https://seld.be"
                  }
              ],
              "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
 -            "homepage": "http://github.com/Seldaek/monolog",
 +            "homepage": "https://github.com/Seldaek/monolog",
              "keywords": [
                  "log",
                  "logging",
                  "psr-3"
              ],
 +            "support": {
 +                "issues": "https://github.com/Seldaek/monolog/issues",
 +                "source": "https://github.com/Seldaek/monolog/tree/2.3.4"
 +            },
              "funding": [
                  {
                      "url": "https://github.com/Seldaek",
                      "type": "tidelift"
                  }
              ],
 -            "time": "2020-05-22T08:12:19+00:00"
 +            "time": "2021-09-15T11:27:21+00:00"
          },
          {
              "name": "mtdowling/jmespath.php",
 -            "version": "2.5.0",
 +            "version": "2.6.1",
              "source": {
                  "type": "git",
                  "url": "https://github.com/jmespath/jmespath.php.git",
 -                "reference": "52168cb9472de06979613d365c7f1ab8798be895"
 +                "reference": "9b87907a81b87bc76d19a7fb2d61e61486ee9edb"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/52168cb9472de06979613d365c7f1ab8798be895",
 -                "reference": "52168cb9472de06979613d365c7f1ab8798be895",
 +                "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/9b87907a81b87bc76d19a7fb2d61e61486ee9edb",
 +                "reference": "9b87907a81b87bc76d19a7fb2d61e61486ee9edb",
                  "shasum": ""
              },
              "require": {
 -                "php": ">=5.4.0",
 -                "symfony/polyfill-mbstring": "^1.4"
 +                "php": "^5.4 || ^7.0 || ^8.0",
 +                "symfony/polyfill-mbstring": "^1.17"
              },
              "require-dev": {
 -                "composer/xdebug-handler": "^1.2",
 -                "phpunit/phpunit": "^4.8.36|^7.5.15"
 +                "composer/xdebug-handler": "^1.4 || ^2.0",
 +                "phpunit/phpunit": "^4.8.36 || ^7.5.15"
              },
              "bin": [
                  "bin/jp.php"
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "2.5-dev"
 +                    "dev-master": "2.6-dev"
                  }
              },
              "autoload": {
                  "json",
                  "jsonpath"
              ],
 -            "time": "2019-12-30T18:03:34+00:00"
 +            "support": {
 +                "issues": "https://github.com/jmespath/jmespath.php/issues",
 +                "source": "https://github.com/jmespath/jmespath.php/tree/2.6.1"
 +            },
 +            "time": "2021-06-14T00:11:39+00:00"
          },
          {
              "name": "nesbot/carbon",
 -            "version": "2.34.2",
 +            "version": "2.53.1",
              "source": {
                  "type": "git",
                  "url": "https://github.com/briannesbitt/Carbon.git",
 -                "reference": "3e87404329b8072295ea11d548b47a1eefe5a162"
 +                "reference": "f4655858a784988f880c1b8c7feabbf02dfdf045"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/3e87404329b8072295ea11d548b47a1eefe5a162",
 -                "reference": "3e87404329b8072295ea11d548b47a1eefe5a162",
 +                "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/f4655858a784988f880c1b8c7feabbf02dfdf045",
 +                "reference": "f4655858a784988f880c1b8c7feabbf02dfdf045",
                  "shasum": ""
              },
              "require": {
                  "ext-json": "*",
                  "php": "^7.1.8 || ^8.0",
                  "symfony/polyfill-mbstring": "^1.0",
 +                "symfony/polyfill-php80": "^1.16",
                  "symfony/translation": "^3.4 || ^4.0 || ^5.0"
              },
              "require-dev": {
                  "doctrine/orm": "^2.7",
 -                "friendsofphp/php-cs-fixer": "^2.14 || ^3.0",
 -                "kylekatarnls/multi-tester": "^1.1",
 -                "phpmd/phpmd": "^2.8",
 -                "phpstan/phpstan": "^0.11",
 -                "phpunit/phpunit": "^7.5 || ^8.0",
 +                "friendsofphp/php-cs-fixer": "^3.0",
 +                "kylekatarnls/multi-tester": "^2.0",
 +                "phpmd/phpmd": "^2.9",
 +                "phpstan/extension-installer": "^1.0",
 +                "phpstan/phpstan": "^0.12.54",
 +                "phpunit/phpunit": "^7.5.20 || ^8.5.14",
                  "squizlabs/php_codesniffer": "^3.4"
              },
              "bin": [
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "2.x-dev",
 -                    "dev-3.x": "3.x-dev"
 +                    "dev-3.x": "3.x-dev",
 +                    "dev-master": "2.x-dev"
                  },
                  "laravel": {
                      "providers": [
                          "Carbon\\Laravel\\ServiceProvider"
                      ]
 +                },
 +                "phpstan": {
 +                    "includes": [
 +                        "extension.neon"
 +                    ]
                  }
              },
              "autoload": {
                  {
                      "name": "Brian Nesbitt",
                      "email": "[email protected]",
 -                    "homepage": "http://nesbot.com"
 +                    "homepage": "https://markido.com"
                  },
                  {
                      "name": "kylekatarnls",
 -                    "homepage": "http://github.com/kylekatarnls"
 +                    "homepage": "https://github.com/kylekatarnls"
                  }
              ],
              "description": "An API extension for DateTime that supports 281 different languages.",
 -            "homepage": "http://carbon.nesbot.com",
 +            "homepage": "https://carbon.nesbot.com",
              "keywords": [
                  "date",
                  "datetime",
                  "time"
              ],
 +            "support": {
 +                "issues": "https://github.com/briannesbitt/Carbon/issues",
 +                "source": "https://github.com/briannesbitt/Carbon"
 +            },
              "funding": [
                  {
                      "url": "https://opencollective.com/Carbon",
                      "type": "tidelift"
                  }
              ],
 -            "time": "2020-05-19T22:14:16+00:00"
 +            "time": "2021-09-06T09:29:23+00:00"
          },
          {
              "name": "nunomaduro/collision",
 -            "version": "v3.0.1",
 +            "version": "v3.2.0",
              "source": {
                  "type": "git",
                  "url": "https://github.com/nunomaduro/collision.git",
 -                "reference": "af42d339fe2742295a54f6fdd42aaa6f8c4aca68"
 +                "reference": "f7c45764dfe4ba5f2618d265a6f1f9c72732e01d"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/nunomaduro/collision/zipball/af42d339fe2742295a54f6fdd42aaa6f8c4aca68",
 -                "reference": "af42d339fe2742295a54f6fdd42aaa6f8c4aca68",
 +                "url": "https://api.github.com/repos/nunomaduro/collision/zipball/f7c45764dfe4ba5f2618d265a6f1f9c72732e01d",
 +                "reference": "f7c45764dfe4ba5f2618d265a6f1f9c72732e01d",
                  "shasum": ""
              },
              "require": {
                  "filp/whoops": "^2.1.4",
 -                "jakub-onderka/php-console-highlighter": "0.3.*|0.4.*",
 -                "php": "^7.1",
 +                "php": "^7.2.5 || ^8.0",
 +                "php-parallel-lint/php-console-highlighter": "0.5.*",
                  "symfony/console": "~2.8|~3.3|~4.0"
              },
              "require-dev": {
 -                "laravel/framework": "5.8.*",
 -                "nunomaduro/larastan": "^0.3.0",
 -                "phpstan/phpstan": "^0.11",
 -                "phpunit/phpunit": "~8.0"
 +                "laravel/framework": "^6.0",
 +                "phpunit/phpunit": "^8.0 || ^9.0"
              },
              "type": "library",
              "extra": {
                  "php",
                  "symfony"
              ],
 -            "time": "2019-03-07T21:35:13+00:00"
 +            "support": {
 +                "issues": "https://github.com/nunomaduro/collision/issues",
 +                "source": "https://github.com/nunomaduro/collision"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L",
 +                    "type": "custom"
 +                },
 +                {
 +                    "url": "https://github.com/nunomaduro",
 +                    "type": "github"
 +                },
 +                {
 +                    "url": "https://www.patreon.com/nunomaduro",
 +                    "type": "patreon"
 +                }
 +            ],
 +            "time": "2021-02-11T09:01:42+00:00"
          },
          {
              "name": "onelogin/php-saml",
 -            "version": "3.4.1",
 +            "version": "4.0.0",
              "source": {
                  "type": "git",
                  "url": "https://github.com/onelogin/php-saml.git",
 -                "reference": "5fbf3486704ac9835b68184023ab54862c95f213"
 +                "reference": "f30f5062f3653c4d2082892d207f4dc3e577d979"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/onelogin/php-saml/zipball/5fbf3486704ac9835b68184023ab54862c95f213",
 -                "reference": "5fbf3486704ac9835b68184023ab54862c95f213",
 +                "url": "https://api.github.com/repos/onelogin/php-saml/zipball/f30f5062f3653c4d2082892d207f4dc3e577d979",
 +                "reference": "f30f5062f3653c4d2082892d207f4dc3e577d979",
                  "shasum": ""
              },
              "require": {
 -                "php": ">=5.4",
 -                "robrichards/xmlseclibs": ">=3.0.4"
 +                "php": ">=7.3",
 +                "robrichards/xmlseclibs": ">=3.1.1"
              },
              "require-dev": {
 -                "pdepend/pdepend": "^2.5.0",
 -                "php-coveralls/php-coveralls": "^1.0.2 || ^2.0",
 -                "phploc/phploc": "^2.1 || ^3.0 || ^4.0",
 -                "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1",
 -                "sebastian/phpcpd": "^2.0 || ^3.0 || ^4.0",
 -                "squizlabs/php_codesniffer": "^3.1.1"
 +                "pdepend/pdepend": "^2.8.0",
 +                "php-coveralls/php-coveralls": "^2.0",
 +                "phploc/phploc": "^4.0 || ^5.0 || ^6.0 || ^7.0",
 +                "phpunit/phpunit": "^9.5",
 +                "sebastian/phpcpd": "^4.0 || ^5.0 || ^6.0 ",
 +                "squizlabs/php_codesniffer": "^3.5.8"
              },
              "suggest": {
                  "ext-curl": "Install curl lib to be able to use the IdPMetadataParser for parsing remote XMLs",
 -                "ext-gettext": "Install gettext and php5-gettext libs to handle translations",
 -                "ext-openssl": "Install openssl lib in order to handle with x509 certs (require to support sign and encryption)"
 +                "ext-dom": "Install xml lib",
 +                "ext-openssl": "Install openssl lib in order to handle with x509 certs (require to support sign and encryption)",
 +                "ext-zlib": "Install zlib"
              },
              "type": "library",
              "autoload": {
                  "onelogin",
                  "saml"
              ],
 -            "time": "2019-11-25T17:30:07+00:00"
 +            "support": {
 +                "email": "[email protected]",
 +                "issues": "https://github.com/onelogin/php-saml/issues",
 +                "source": "https://github.com/onelogin/php-saml/"
 +            },
 +            "time": "2021-03-02T10:19:19+00:00"
          },
          {
              "name": "opis/closure",
 -            "version": "3.5.2",
 +            "version": "3.6.2",
              "source": {
                  "type": "git",
                  "url": "https://github.com/opis/closure.git",
 -                "reference": "2e3299cea6f485ca64d19c540f46d7896c512ace"
 +                "reference": "06e2ebd25f2869e54a306dda991f7db58066f7f6"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/opis/closure/zipball/2e3299cea6f485ca64d19c540f46d7896c512ace",
 -                "reference": "2e3299cea6f485ca64d19c540f46d7896c512ace",
 +                "url": "https://api.github.com/repos/opis/closure/zipball/06e2ebd25f2869e54a306dda991f7db58066f7f6",
 +                "reference": "06e2ebd25f2869e54a306dda991f7db58066f7f6",
                  "shasum": ""
              },
              "require": {
 -                "php": "^5.4 || ^7.0"
 +                "php": "^5.4 || ^7.0 || ^8.0"
              },
              "require-dev": {
                  "jeremeamia/superclosure": "^2.0",
 -                "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
 +                "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "3.5.x-dev"
 +                    "dev-master": "3.6.x-dev"
                  }
              },
              "autoload": {
                  "serialization",
                  "serialize"
              ],
 -            "time": "2020-05-21T20:09:36+00:00"
 +            "support": {
 +                "issues": "https://github.com/opis/closure/issues",
 +                "source": "https://github.com/opis/closure/tree/3.6.2"
 +            },
 +            "time": "2021-04-09T13:42:10+00:00"
          },
          {
 -            "name": "paragonie/random_compat",
 -            "version": "v9.99.99",
 +            "name": "paragonie/constant_time_encoding",
 +            "version": "v2.4.0",
              "source": {
                  "type": "git",
 -                "url": "https://github.com/paragonie/random_compat.git",
 -                "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95"
 +                "url": "https://github.com/paragonie/constant_time_encoding.git",
 +                "reference": "f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95",
 -                "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95",
 +                "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c",
 +                "reference": "f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7"
 +                "php": "^7|^8"
              },
              "require-dev": {
 -                "phpunit/phpunit": "4.*|5.*",
 -                "vimeo/psalm": "^1"
 +                "phpunit/phpunit": "^6|^7|^8|^9",
 +                "vimeo/psalm": "^1|^2|^3|^4"
 +            },
 +            "type": "library",
 +            "autoload": {
 +                "psr-4": {
 +                    "ParagonIE\\ConstantTime\\": "src/"
 +                }
 +            },
 +            "notification-url": "https://packagist.org/downloads/",
 +            "license": [
 +                "MIT"
 +            ],
 +            "authors": [
 +                {
 +                    "name": "Paragon Initiative Enterprises",
 +                    "email": "[email protected]",
 +                    "homepage": "https://paragonie.com",
 +                    "role": "Maintainer"
 +                },
 +                {
 +                    "name": "Steve 'Sc00bz' Thomas",
 +                    "email": "[email protected]",
 +                    "homepage": "https://www.tobtu.com",
 +                    "role": "Original Developer"
 +                }
 +            ],
 +            "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)",
 +            "keywords": [
 +                "base16",
 +                "base32",
 +                "base32_decode",
 +                "base32_encode",
 +                "base64",
 +                "base64_decode",
 +                "base64_encode",
 +                "bin2hex",
 +                "encoding",
 +                "hex",
 +                "hex2bin",
 +                "rfc4648"
 +            ],
 +            "support": {
 +                "email": "[email protected]",
 +                "issues": "https://github.com/paragonie/constant_time_encoding/issues",
 +                "source": "https://github.com/paragonie/constant_time_encoding"
 +            },
 +            "time": "2020-12-06T15:14:20+00:00"
 +        },
 +        {
 +            "name": "paragonie/random_compat",
 +            "version": "v9.99.100",
 +            "source": {
 +                "type": "git",
 +                "url": "https://github.com/paragonie/random_compat.git",
 +                "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a"
 +            },
 +            "dist": {
 +                "type": "zip",
 +                "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a",
 +                "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a",
 +                "shasum": ""
 +            },
 +            "require": {
 +                "php": ">= 7"
 +            },
 +            "require-dev": {
 +                "phpunit/phpunit": "4.*|5.*",
 +                "vimeo/psalm": "^1"
              },
              "suggest": {
                  "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
                  "pseudorandom",
                  "random"
              ],
 -            "time": "2018-07-02T15:55:56+00:00"
 +            "support": {
 +                "email": "[email protected]",
 +                "issues": "https://github.com/paragonie/random_compat/issues",
 +                "source": "https://github.com/paragonie/random_compat"
 +            },
 +            "time": "2020-10-15T08:29:30+00:00"
          },
          {
              "name": "phenx/php-font-lib",
              ],
              "description": "A library to read, parse, export and make subsets of different types of font files.",
              "homepage": "https://github.com/PhenX/php-font-lib",
 +            "support": {
 +                "issues": "https://github.com/PhenX/php-font-lib/issues",
 +                "source": "https://github.com/PhenX/php-font-lib/tree/0.5.2"
 +            },
              "time": "2020-03-08T15:31:32+00:00"
          },
          {
              ],
              "description": "A library to read, parse and export to PDF SVG files.",
              "homepage": "https://github.com/PhenX/php-svg-lib",
 +            "support": {
 +                "issues": "https://github.com/PhenX/php-svg-lib/issues",
 +                "source": "https://github.com/PhenX/php-svg-lib/tree/master"
 +            },
              "time": "2019-09-11T20:02:13+00:00"
          },
 +        {
 +            "name": "php-parallel-lint/php-console-color",
 +            "version": "v0.3",
 +            "source": {
 +                "type": "git",
 +                "url": "https://github.com/php-parallel-lint/PHP-Console-Color.git",
 +                "reference": "b6af326b2088f1ad3b264696c9fd590ec395b49e"
 +            },
 +            "dist": {
 +                "type": "zip",
 +                "url": "https://api.github.com/repos/php-parallel-lint/PHP-Console-Color/zipball/b6af326b2088f1ad3b264696c9fd590ec395b49e",
 +                "reference": "b6af326b2088f1ad3b264696c9fd590ec395b49e",
 +                "shasum": ""
 +            },
 +            "require": {
 +                "php": ">=5.4.0"
 +            },
 +            "replace": {
 +                "jakub-onderka/php-console-color": "*"
 +            },
 +            "require-dev": {
 +                "php-parallel-lint/php-code-style": "1.0",
 +                "php-parallel-lint/php-parallel-lint": "1.0",
 +                "php-parallel-lint/php-var-dump-check": "0.*",
 +                "phpunit/phpunit": "~4.3",
 +                "squizlabs/php_codesniffer": "1.*"
 +            },
 +            "type": "library",
 +            "autoload": {
 +                "psr-4": {
 +                    "JakubOnderka\\PhpConsoleColor\\": "src/"
 +                }
 +            },
 +            "notification-url": "https://packagist.org/downloads/",
 +            "license": [
 +                "BSD-2-Clause"
 +            ],
 +            "authors": [
 +                {
 +                    "name": "Jakub Onderka",
 +                    "email": "[email protected]"
 +                }
 +            ],
 +            "support": {
 +                "issues": "https://github.com/php-parallel-lint/PHP-Console-Color/issues",
 +                "source": "https://github.com/php-parallel-lint/PHP-Console-Color/tree/master"
 +            },
 +            "time": "2020-05-14T05:47:14+00:00"
 +        },
 +        {
 +            "name": "php-parallel-lint/php-console-highlighter",
 +            "version": "v0.5",
 +            "source": {
 +                "type": "git",
 +                "url": "https://github.com/php-parallel-lint/PHP-Console-Highlighter.git",
 +                "reference": "21bf002f077b177f056d8cb455c5ed573adfdbb8"
 +            },
 +            "dist": {
 +                "type": "zip",
 +                "url": "https://api.github.com/repos/php-parallel-lint/PHP-Console-Highlighter/zipball/21bf002f077b177f056d8cb455c5ed573adfdbb8",
 +                "reference": "21bf002f077b177f056d8cb455c5ed573adfdbb8",
 +                "shasum": ""
 +            },
 +            "require": {
 +                "ext-tokenizer": "*",
 +                "php": ">=5.4.0",
 +                "php-parallel-lint/php-console-color": "~0.2"
 +            },
 +            "replace": {
 +                "jakub-onderka/php-console-highlighter": "*"
 +            },
 +            "require-dev": {
 +                "php-parallel-lint/php-code-style": "~1.0",
 +                "php-parallel-lint/php-parallel-lint": "~1.0",
 +                "php-parallel-lint/php-var-dump-check": "~0.1",
 +                "phpunit/phpunit": "~4.0",
 +                "squizlabs/php_codesniffer": "~1.5"
 +            },
 +            "type": "library",
 +            "autoload": {
 +                "psr-4": {
 +                    "JakubOnderka\\PhpConsoleHighlighter\\": "src/"
 +                }
 +            },
 +            "notification-url": "https://packagist.org/downloads/",
 +            "license": [
 +                "MIT"
 +            ],
 +            "authors": [
 +                {
 +                    "name": "Jakub Onderka",
 +                    "email": "[email protected]",
 +                    "homepage": "http://www.acci.cz/"
 +                }
 +            ],
 +            "description": "Highlight PHP code in terminal",
 +            "support": {
 +                "issues": "https://github.com/php-parallel-lint/PHP-Console-Highlighter/issues",
 +                "source": "https://github.com/php-parallel-lint/PHP-Console-Highlighter/tree/master"
 +            },
 +            "time": "2020-05-13T07:37:49+00:00"
 +        },
          {
              "name": "phpoption/phpoption",
 -            "version": "1.7.3",
 +            "version": "1.8.0",
              "source": {
                  "type": "git",
                  "url": "https://github.com/schmittjoh/php-option.git",
 -                "reference": "4acfd6a4b33a509d8c88f50e5222f734b6aeebae"
 +                "reference": "5455cb38aed4523f99977c4a12ef19da4bfe2a28"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/4acfd6a4b33a509d8c88f50e5222f734b6aeebae",
 -                "reference": "4acfd6a4b33a509d8c88f50e5222f734b6aeebae",
 +                "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/5455cb38aed4523f99977c4a12ef19da4bfe2a28",
 +                "reference": "5455cb38aed4523f99977c4a12ef19da4bfe2a28",
                  "shasum": ""
              },
              "require": {
 -                "php": "^5.5.9 || ^7.0 || ^8.0"
 +                "php": "^7.0 || ^8.0"
              },
              "require-dev": {
 -                "bamarni/composer-bin-plugin": "^1.3",
 -                "phpunit/phpunit": "^4.8.35 || ^5.0 || ^6.0 || ^7.0"
 +                "bamarni/composer-bin-plugin": "^1.4.1",
 +                "phpunit/phpunit": "^6.5.14 || ^7.0.20 || ^8.5.19 || ^9.5.8"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "1.7-dev"
 +                    "dev-master": "1.8-dev"
                  }
              },
              "autoload": {
                  },
                  {
                      "name": "Graham Campbell",
 -                    "email": "[email protected]"
 +                    "email": "[email protected]"
                  }
              ],
              "description": "Option Type for PHP",
                  "php",
                  "type"
              ],
 -            "time": "2020-03-21T18:07:53+00:00"
 +            "support": {
 +                "issues": "https://github.com/schmittjoh/php-option/issues",
 +                "source": "https://github.com/schmittjoh/php-option/tree/1.8.0"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/GrahamCampbell",
 +                    "type": "github"
 +                },
 +                {
 +                    "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption",
 +                    "type": "tidelift"
 +                }
 +            ],
 +            "time": "2021-08-28T21:27:29+00:00"
 +        },
 +        {
 +            "name": "pragmarx/google2fa",
 +            "version": "8.0.0",
 +            "source": {
 +                "type": "git",
 +                "url": "https://github.com/antonioribeiro/google2fa.git",
 +                "reference": "26c4c5cf30a2844ba121760fd7301f8ad240100b"
 +            },
 +            "dist": {
 +                "type": "zip",
 +                "url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/26c4c5cf30a2844ba121760fd7301f8ad240100b",
 +                "reference": "26c4c5cf30a2844ba121760fd7301f8ad240100b",
 +                "shasum": ""
 +            },
 +            "require": {
 +                "paragonie/constant_time_encoding": "^1.0|^2.0",
 +                "php": "^7.1|^8.0"
 +            },
 +            "require-dev": {
 +                "phpstan/phpstan": "^0.12.18",
 +                "phpunit/phpunit": "^7.5.15|^8.5|^9.0"
 +            },
 +            "type": "library",
 +            "autoload": {
 +                "psr-4": {
 +                    "PragmaRX\\Google2FA\\": "src/"
 +                }
 +            },
 +            "notification-url": "https://packagist.org/downloads/",
 +            "license": [
 +                "MIT"
 +            ],
 +            "authors": [
 +                {
 +                    "name": "Antonio Carlos Ribeiro",
 +                    "email": "[email protected]",
 +                    "role": "Creator & Designer"
 +                }
 +            ],
 +            "description": "A One Time Password Authentication package, compatible with Google Authenticator.",
 +            "keywords": [
 +                "2fa",
 +                "Authentication",
 +                "Two Factor Authentication",
 +                "google2fa"
 +            ],
 +            "support": {
 +                "issues": "https://github.com/antonioribeiro/google2fa/issues",
 +                "source": "https://github.com/antonioribeiro/google2fa/tree/8.0.0"
 +            },
 +            "time": "2020-04-05T10:47:18+00:00"
          },
          {
              "name": "predis/predis",
 -            "version": "v1.1.1",
 +            "version": "v1.1.7",
              "source": {
                  "type": "git",
 -                "url": "https://github.com/nrk/predis.git",
 -                "reference": "f0210e38881631afeafb56ab43405a92cafd9fd1"
 +                "url": "https://github.com/predis/predis.git",
 +                "reference": "b240daa106d4e02f0c5b7079b41e31ddf66fddf8"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/nrk/predis/zipball/f0210e38881631afeafb56ab43405a92cafd9fd1",
 -                "reference": "f0210e38881631afeafb56ab43405a92cafd9fd1",
 +                "url": "https://api.github.com/repos/predis/predis/zipball/b240daa106d4e02f0c5b7079b41e31ddf66fddf8",
 +                "reference": "b240daa106d4e02f0c5b7079b41e31ddf66fddf8",
                  "shasum": ""
              },
              "require": {
                  {
                      "name": "Daniele Alessandri",
                      "email": "[email protected]",
 -                    "homepage": "http://clorophilla.net"
 +                    "homepage": "http://clorophilla.net",
 +                    "role": "Creator & Maintainer"
 +                },
 +                {
 +                    "name": "Till Krüss",
 +                    "homepage": "https://till.im",
 +                    "role": "Maintainer"
                  }
              ],
              "description": "Flexible and feature-complete Redis client for PHP and HHVM",
 -            "homepage": "http://github.com/nrk/predis",
 +            "homepage": "http://github.com/predis/predis",
              "keywords": [
                  "nosql",
                  "predis",
                  "redis"
              ],
 -            "time": "2016-06-16T16:22:20+00:00"
 +            "support": {
 +                "issues": "https://github.com/predis/predis/issues",
 +                "source": "https://github.com/predis/predis/tree/v1.1.7"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/sponsors/tillkruss",
 +                    "type": "github"
 +                }
 +            ],
 +            "time": "2021-04-04T19:34:46+00:00"
          },
          {
              "name": "psr/container",
 -            "version": "1.0.0",
 +            "version": "1.1.1",
              "source": {
                  "type": "git",
                  "url": "https://github.com/php-fig/container.git",
 -                "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
 +                "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
 -                "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
 +                "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf",
 +                "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf",
                  "shasum": ""
              },
              "require": {
 -                "php": ">=5.3.0"
 +                "php": ">=7.2.0"
              },
              "type": "library",
 -            "extra": {
 -                "branch-alias": {
 -                    "dev-master": "1.0.x-dev"
 -                }
 -            },
              "autoload": {
                  "psr-4": {
                      "Psr\\Container\\": "src/"
              "authors": [
                  {
                      "name": "PHP-FIG",
 -                    "homepage": "http://www.php-fig.org/"
 +                    "homepage": "https://www.php-fig.org/"
                  }
              ],
              "description": "Common Container Interface (PHP FIG PSR-11)",
                  "container-interop",
                  "psr"
              ],
 -            "time": "2017-02-14T16:28:37+00:00"
 +            "support": {
 +                "issues": "https://github.com/php-fig/container/issues",
 +                "source": "https://github.com/php-fig/container/tree/1.1.1"
 +            },
 +            "time": "2021-03-05T17:36:06+00:00"
 +        },
 +        {
 +            "name": "psr/http-client",
 +            "version": "1.0.1",
 +            "source": {
 +                "type": "git",
 +                "url": "https://github.com/php-fig/http-client.git",
 +                "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621"
 +            },
 +            "dist": {
 +                "type": "zip",
 +                "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
 +                "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
 +                "shasum": ""
 +            },
 +            "require": {
 +                "php": "^7.0 || ^8.0",
 +                "psr/http-message": "^1.0"
 +            },
 +            "type": "library",
 +            "extra": {
 +                "branch-alias": {
 +                    "dev-master": "1.0.x-dev"
 +                }
 +            },
 +            "autoload": {
 +                "psr-4": {
 +                    "Psr\\Http\\Client\\": "src/"
 +                }
 +            },
 +            "notification-url": "https://packagist.org/downloads/",
 +            "license": [
 +                "MIT"
 +            ],
 +            "authors": [
 +                {
 +                    "name": "PHP-FIG",
 +                    "homepage": "http://www.php-fig.org/"
 +                }
 +            ],
 +            "description": "Common interface for HTTP clients",
 +            "homepage": "https://github.com/php-fig/http-client",
 +            "keywords": [
 +                "http",
 +                "http-client",
 +                "psr",
 +                "psr-18"
 +            ],
 +            "support": {
 +                "source": "https://github.com/php-fig/http-client/tree/master"
 +            },
 +            "time": "2020-06-29T06:28:15+00:00"
          },
          {
              "name": "psr/http-message",
                  "request",
                  "response"
              ],
 +            "support": {
 +                "source": "https://github.com/php-fig/http-message/tree/master"
 +            },
              "time": "2016-08-06T14:39:51+00:00"
          },
          {
              "name": "psr/log",
 -            "version": "1.1.3",
 +            "version": "1.1.4",
              "source": {
                  "type": "git",
                  "url": "https://github.com/php-fig/log.git",
 -                "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc"
 +                "reference": "d49695b909c3b7628b6289db5479a1c204601f11"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc",
 -                "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc",
 +                "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11",
 +                "reference": "d49695b909c3b7628b6289db5479a1c204601f11",
                  "shasum": ""
              },
              "require": {
              "authors": [
                  {
                      "name": "PHP-FIG",
 -                    "homepage": "http://www.php-fig.org/"
 +                    "homepage": "https://www.php-fig.org/"
                  }
              ],
              "description": "Common interface for logging libraries",
                  "psr",
                  "psr-3"
              ],
 -            "time": "2020-03-23T09:12:05+00:00"
 +            "support": {
 +                "source": "https://github.com/php-fig/log/tree/1.1.4"
 +            },
 +            "time": "2021-05-03T11:20:27+00:00"
          },
          {
              "name": "psr/simple-cache",
                  "psr-16",
                  "simple-cache"
              ],
 +            "support": {
 +                "source": "https://github.com/php-fig/simple-cache/tree/master"
 +            },
              "time": "2017-10-23T01:57:42+00:00"
          },
          {
                  }
              ],
              "description": "A polyfill for getallheaders.",
 +            "support": {
 +                "issues": "https://github.com/ralouphie/getallheaders/issues",
 +                "source": "https://github.com/ralouphie/getallheaders/tree/develop"
 +            },
              "time": "2019-03-08T08:55:37+00:00"
          },
          {
              "name": "ramsey/uuid",
 -            "version": "3.9.3",
 +            "version": "3.9.4",
              "source": {
                  "type": "git",
                  "url": "https://github.com/ramsey/uuid.git",
 -                "reference": "7e1633a6964b48589b142d60542f9ed31bd37a92"
 +                "reference": "be2451bef8147b7352a28fb4cddb08adc497ada3"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/ramsey/uuid/zipball/7e1633a6964b48589b142d60542f9ed31bd37a92",
 -                "reference": "7e1633a6964b48589b142d60542f9ed31bd37a92",
 +                "url": "https://api.github.com/repos/ramsey/uuid/zipball/be2451bef8147b7352a28fb4cddb08adc497ada3",
 +                "reference": "be2451bef8147b7352a28fb4cddb08adc497ada3",
                  "shasum": ""
              },
              "require": {
                  "ext-json": "*",
 -                "paragonie/random_compat": "^1 | ^2 | 9.99.99",
 +                "paragonie/random_compat": "^1 | ^2 | ^9.99.99",
                  "php": "^5.4 | ^7 | ^8",
                  "symfony/polyfill-ctype": "^1.8"
              },
                  "identifier",
                  "uuid"
              ],
 -            "time": "2020-02-21T04:36:14+00:00"
 +            "support": {
 +                "issues": "https://github.com/ramsey/uuid/issues",
 +                "rss": "https://github.com/ramsey/uuid/releases.atom",
 +                "source": "https://github.com/ramsey/uuid",
 +                "wiki": "https://github.com/ramsey/uuid/wiki"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/ramsey",
 +                    "type": "github"
 +                },
 +                {
 +                    "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid",
 +                    "type": "tidelift"
 +                }
 +            ],
 +            "time": "2021-08-06T20:32:15+00:00"
          },
          {
              "name": "robrichards/xmlseclibs",
 -            "version": "3.1.0",
 +            "version": "3.1.1",
              "source": {
                  "type": "git",
                  "url": "https://github.com/robrichards/xmlseclibs.git",
 -                "reference": "8d8e56ca7914440a8c60caff1a865e7dff1d9a5a"
 +                "reference": "f8f19e58f26cdb42c54b214ff8a820760292f8df"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/robrichards/xmlseclibs/zipball/8d8e56ca7914440a8c60caff1a865e7dff1d9a5a",
 -                "reference": "8d8e56ca7914440a8c60caff1a865e7dff1d9a5a",
 +                "url": "https://api.github.com/repos/robrichards/xmlseclibs/zipball/f8f19e58f26cdb42c54b214ff8a820760292f8df",
 +                "reference": "f8f19e58f26cdb42c54b214ff8a820760292f8df",
                  "shasum": ""
              },
              "require": {
                  "xml",
                  "xmldsig"
              ],
 -            "time": "2020-04-22T17:19:51+00:00"
 +            "support": {
 +                "issues": "https://github.com/robrichards/xmlseclibs/issues",
 +                "source": "https://github.com/robrichards/xmlseclibs/tree/3.1.1"
 +            },
 +            "time": "2020-09-05T13:00:25+00:00"
          },
          {
              "name": "sabberworm/php-css-parser",
 -            "version": "8.3.0",
 +            "version": "8.3.1",
              "source": {
                  "type": "git",
                  "url": "https://github.com/sabberworm/PHP-CSS-Parser.git",
 -                "reference": "91bcc3e3fdb7386c9a2e0e0aa09ca75cc43f121f"
 +                "reference": "d217848e1396ef962fb1997cf3e2421acba7f796"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/sabberworm/PHP-CSS-Parser/zipball/91bcc3e3fdb7386c9a2e0e0aa09ca75cc43f121f",
 -                "reference": "91bcc3e3fdb7386c9a2e0e0aa09ca75cc43f121f",
 +                "url": "https://api.github.com/repos/sabberworm/PHP-CSS-Parser/zipball/d217848e1396ef962fb1997cf3e2421acba7f796",
 +                "reference": "d217848e1396ef962fb1997cf3e2421acba7f796",
                  "shasum": ""
              },
              "require": {
                  "parser",
                  "stylesheet"
              ],
 -            "time": "2019-02-22T07:42:52+00:00"
 +            "support": {
 +                "issues": "https://github.com/sabberworm/PHP-CSS-Parser/issues",
 +                "source": "https://github.com/sabberworm/PHP-CSS-Parser/tree/8.3.1"
 +            },
 +            "time": "2020-06-01T09:10:00+00:00"
          },
          {
              "name": "scrivo/highlight.php",
 -            "version": "v9.18.1.1",
 +            "version": "v9.18.1.7",
              "source": {
                  "type": "git",
                  "url": "https://github.com/scrivo/highlight.php.git",
 -                "reference": "52fc21c99fd888e33aed4879e55a3646f8d40558"
 +                "reference": "05996fcc61e97978d76ca7d1ac14b65e7cd26f91"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/scrivo/highlight.php/zipball/52fc21c99fd888e33aed4879e55a3646f8d40558",
 -                "reference": "52fc21c99fd888e33aed4879e55a3646f8d40558",
 +                "url": "https://api.github.com/repos/scrivo/highlight.php/zipball/05996fcc61e97978d76ca7d1ac14b65e7cd26f91",
 +                "reference": "05996fcc61e97978d76ca7d1ac14b65e7cd26f91",
                  "shasum": ""
              },
              "require": {
                  "symfony/finder": "^2.8|^3.4",
                  "symfony/var-dumper": "^2.8|^3.4"
              },
 -            "suggest": {
 -                "ext-dom": "Needed to make use of the features in the utilities namespace"
 -            },
              "type": "library",
              "autoload": {
                  "psr-0": {
                  "highlight.php",
                  "syntax"
              ],
 -            "time": "2020-03-02T05:59:21+00:00"
 +            "support": {
 +                "issues": "https://github.com/scrivo/highlight.php/issues",
 +                "source": "https://github.com/scrivo/highlight.php"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/allejo",
 +                    "type": "github"
 +                }
 +            ],
 +            "time": "2021-07-09T00:30:39+00:00"
          },
          {
              "name": "socialiteproviders/discord",
 -            "version": "v2.0.2",
 +            "version": "4.1.1",
              "source": {
                  "type": "git",
                  "url": "https://github.com/SocialiteProviders/Discord.git",
 -                "reference": "e0cd8895f321943b36f533e7bf21ad29bcdece9a"
 +                "reference": "c6eddeb07ace7473e82d02d4db852dfacf5ef574"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/SocialiteProviders/Discord/zipball/e0cd8895f321943b36f533e7bf21ad29bcdece9a",
 -                "reference": "e0cd8895f321943b36f533e7bf21ad29bcdece9a",
 +                "url": "https://api.github.com/repos/SocialiteProviders/Discord/zipball/c6eddeb07ace7473e82d02d4db852dfacf5ef574",
 +                "reference": "c6eddeb07ace7473e82d02d4db852dfacf5ef574",
                  "shasum": ""
              },
              "require": {
 -                "php": "^5.6 || ^7.0",
 -                "socialiteproviders/manager": "~2.0 || ~3.0"
 +                "ext-json": "*",
 +                "php": "^7.2 || ^8.0",
 +                "socialiteproviders/manager": "~4.0"
              },
              "type": "library",
              "autoload": {
                  }
              ],
              "description": "Discord OAuth2 Provider for Laravel Socialite",
 -            "time": "2018-05-26T03:40:07+00:00"
 +            "support": {
 +                "source": "https://github.com/SocialiteProviders/Discord/tree/4.1.1"
 +            },
 +            "time": "2021-01-05T22:03:58+00:00"
          },
          {
              "name": "socialiteproviders/gitlab",
 -            "version": "v3.1",
 +            "version": "4.1.0",
              "source": {
                  "type": "git",
                  "url": "https://github.com/SocialiteProviders/GitLab.git",
 -                "reference": "69e537f6192ca15483e98b8662495384f44299ca"
 +                "reference": "a8f67d3b02c9ee8c70c25c6728417c0eddcbbb9d"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/SocialiteProviders/GitLab/zipball/69e537f6192ca15483e98b8662495384f44299ca",
 -                "reference": "69e537f6192ca15483e98b8662495384f44299ca",
 +                "url": "https://api.github.com/repos/SocialiteProviders/GitLab/zipball/a8f67d3b02c9ee8c70c25c6728417c0eddcbbb9d",
 +                "reference": "a8f67d3b02c9ee8c70c25c6728417c0eddcbbb9d",
                  "shasum": ""
              },
              "require": {
 -                "php": "^5.6 || ^7.0",
 -                "socialiteproviders/manager": "~2.0 || ~3.0"
 +                "ext-json": "*",
 +                "php": "^7.2 || ^8.0",
 +                "socialiteproviders/manager": "~4.0"
              },
              "type": "library",
              "autoload": {
                  }
              ],
              "description": "GitLab OAuth2 Provider for Laravel Socialite",
 -            "time": "2018-06-27T05:10:32+00:00"
 +            "support": {
 +                "source": "https://github.com/SocialiteProviders/GitLab/tree/4.1.0"
 +            },
 +            "time": "2020-12-01T23:10:59+00:00"
          },
          {
              "name": "socialiteproviders/manager",
 -            "version": "v3.5",
 +            "version": "4.0.1",
              "source": {
                  "type": "git",
                  "url": "https://github.com/SocialiteProviders/Manager.git",
 -                "reference": "7a5872d9e4b22bb26ecd0c69ea9ddbaad8c0f570"
 +                "reference": "0f5e82af0404df0080bdc5c105cef936c1711524"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/SocialiteProviders/Manager/zipball/7a5872d9e4b22bb26ecd0c69ea9ddbaad8c0f570",
 -                "reference": "7a5872d9e4b22bb26ecd0c69ea9ddbaad8c0f570",
 +                "url": "https://api.github.com/repos/SocialiteProviders/Manager/zipball/0f5e82af0404df0080bdc5c105cef936c1711524",
 +                "reference": "0f5e82af0404df0080bdc5c105cef936c1711524",
                  "shasum": ""
              },
              "require": {
 -                "illuminate/support": "~5.4|~5.7.0|~5.8.0|^6.0|^7.0",
 -                "laravel/socialite": "~3.0|~4.0",
 -                "php": "^5.6 || ^7.0"
 +                "illuminate/support": "^6.0|^7.0|^8.0",
 +                "laravel/socialite": "~4.0|~5.0",
 +                "php": "^7.2 || ^8.0"
              },
              "require-dev": {
 -                "mockery/mockery": "^0.9.4",
 -                "phpunit/phpunit": "^5.0"
 +                "mockery/mockery": "^1.2",
 +                "phpunit/phpunit": "^9.0"
              },
              "type": "library",
              "extra": {
                  {
                      "name": "Miguel Piedrafita",
                      "email": "[email protected]"
 +                },
 +                {
 +                    "name": "atymic",
 +                    "email": "[email protected]",
 +                    "homepage": "https://atymic.dev"
                  }
              ],
              "description": "Easily add new or override built-in providers in Laravel Socialite.",
 -            "time": "2020-03-08T16:54:44+00:00"
 +            "homepage": "https://socialiteproviders.com/",
 +            "support": {
 +                "issues": "https://github.com/SocialiteProviders/Manager/issues",
 +                "source": "https://github.com/SocialiteProviders/Manager/tree/4.0.1"
 +            },
 +            "time": "2020-12-01T23:09:06+00:00"
          },
          {
              "name": "socialiteproviders/microsoft-azure",
 -            "version": "v3.1.0",
 +            "version": "4.2.1",
              "source": {
                  "type": "git",
                  "url": "https://github.com/SocialiteProviders/Microsoft-Azure.git",
 -                "reference": "b22f4696cccecd6de902cf0bc923de7fc2e4608e"
 +                "reference": "64779ec21db0bee3111039a67c0fa0ab550a3462"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/SocialiteProviders/Microsoft-Azure/zipball/b22f4696cccecd6de902cf0bc923de7fc2e4608e",
 -                "reference": "b22f4696cccecd6de902cf0bc923de7fc2e4608e",
 +                "url": "https://api.github.com/repos/SocialiteProviders/Microsoft-Azure/zipball/64779ec21db0bee3111039a67c0fa0ab550a3462",
 +                "reference": "64779ec21db0bee3111039a67c0fa0ab550a3462",
                  "shasum": ""
              },
              "require": {
                  "ext-json": "*",
 -                "php": "^5.6 || ^7.0",
 -                "socialiteproviders/manager": "~2.0 || ~3.0"
 +                "php": "^7.2 || ^8.0",
 +                "socialiteproviders/manager": "~4.0"
              },
              "type": "library",
              "autoload": {
                  }
              ],
              "description": "Microsoft Azure OAuth2 Provider for Laravel Socialite",
 -            "time": "2020-04-30T23:01:40+00:00"
 +            "support": {
 +                "source": "https://github.com/SocialiteProviders/Microsoft-Azure/tree/4.2.1"
 +            },
 +            "time": "2021-06-14T22:51:38+00:00"
          },
          {
              "name": "socialiteproviders/okta",
 -            "version": "v1.1.0",
 +            "version": "4.1.1",
              "source": {
                  "type": "git",
                  "url": "https://github.com/SocialiteProviders/Okta.git",
 -                "reference": "7c2512f0872316b139e3eea1c50c9351747a57ea"
 +                "reference": "e3ef9f23c7d2f86b3b16a174b82333cf4e2459e8"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/SocialiteProviders/Okta/zipball/7c2512f0872316b139e3eea1c50c9351747a57ea",
 -                "reference": "7c2512f0872316b139e3eea1c50c9351747a57ea",
 +                "url": "https://api.github.com/repos/SocialiteProviders/Okta/zipball/e3ef9f23c7d2f86b3b16a174b82333cf4e2459e8",
 +                "reference": "e3ef9f23c7d2f86b3b16a174b82333cf4e2459e8",
                  "shasum": ""
              },
              "require": {
                  "ext-json": "*",
 -                "php": "^5.6 || ^7.0",
 -                "socialiteproviders/manager": "~2.0 || ~3.0"
 +                "php": "^7.2 || ^8.0",
 +                "socialiteproviders/manager": "~4.0"
              },
              "type": "library",
              "autoload": {
                  }
              ],
              "description": "Okta OAuth2 Provider for Laravel Socialite",
 -            "time": "2019-09-06T15:27:03+00:00"
 +            "support": {
 +                "source": "https://github.com/SocialiteProviders/Okta/tree/4.1.1"
 +            },
 +            "time": "2021-01-12T23:51:01+00:00"
          },
          {
              "name": "socialiteproviders/slack",
 -            "version": "v3.1",
 +            "version": "4.1.1",
              "source": {
                  "type": "git",
                  "url": "https://github.com/SocialiteProviders/Slack.git",
 -                "reference": "d46826640fbeae8f34328d99c358404a1e1050a3"
 +                "reference": "2b781c95daf06ec87a8f3deba2ab613d6bea5e8d"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/SocialiteProviders/Slack/zipball/d46826640fbeae8f34328d99c358404a1e1050a3",
 -                "reference": "d46826640fbeae8f34328d99c358404a1e1050a3",
 +                "url": "https://api.github.com/repos/SocialiteProviders/Slack/zipball/2b781c95daf06ec87a8f3deba2ab613d6bea5e8d",
 +                "reference": "2b781c95daf06ec87a8f3deba2ab613d6bea5e8d",
                  "shasum": ""
              },
              "require": {
 -                "php": "^5.6 || ^7.0",
 -                "socialiteproviders/manager": "~2.0 || ~3.0"
 +                "ext-json": "*",
 +                "php": "^7.2 || ^8.0",
 +                "socialiteproviders/manager": "~4.0"
              },
              "type": "library",
              "autoload": {
                  }
              ],
              "description": "Slack OAuth2 Provider for Laravel Socialite",
 -            "time": "2019-01-11T19:48:14+00:00"
 +            "support": {
 +                "source": "https://github.com/SocialiteProviders/Slack/tree/4.1.1"
 +            },
 +            "time": "2021-03-26T04:10:10+00:00"
          },
          {
              "name": "socialiteproviders/twitch",
 -            "version": "v5.2.0",
 +            "version": "5.3.1",
              "source": {
                  "type": "git",
                  "url": "https://github.com/SocialiteProviders/Twitch.git",
 -                "reference": "9ee6fe196d7c28777139b3cde04cbd537cf7e652"
 +                "reference": "7accf30ae7a3139b757b4ca8f34989c09a3dbee7"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/SocialiteProviders/Twitch/zipball/9ee6fe196d7c28777139b3cde04cbd537cf7e652",
 -                "reference": "9ee6fe196d7c28777139b3cde04cbd537cf7e652",
 +                "url": "https://api.github.com/repos/SocialiteProviders/Twitch/zipball/7accf30ae7a3139b757b4ca8f34989c09a3dbee7",
 +                "reference": "7accf30ae7a3139b757b4ca8f34989c09a3dbee7",
                  "shasum": ""
              },
              "require": {
                  "ext-json": "*",
 -                "php": "^5.6 || ^7.0",
 -                "socialiteproviders/manager": "~2.0 || ~3.0"
 +                "php": "^7.2 || ^8.0",
 +                "socialiteproviders/manager": "~4.0"
              },
              "type": "library",
              "autoload": {
                  }
              ],
              "description": "Twitch OAuth2 Provider for Laravel Socialite",
 -            "time": "2020-05-06T22:51:30+00:00"
 +            "support": {
 +                "source": "https://github.com/SocialiteProviders/Twitch/tree/5.3.1"
 +            },
 +            "time": "2020-12-01T23:10:59+00:00"
          },
          {
 -            "name": "steverhoades/oauth2-openid-connect-client",
 -            "version": "v0.3.0",
 +            "name": "ssddanbrown/htmldiff",
 +            "version": "v1.0.1",
              "source": {
                  "type": "git",
 -                "url": "https://github.com/steverhoades/oauth2-openid-connect-client.git",
 -                "reference": "0159471487540a4620b8d0b693f5f215503a8d75"
 +                "url": "https://github.com/ssddanbrown/HtmlDiff.git",
 +                "reference": "f60d5cc278b60305ab980a6665f46117c5b589c0"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/steverhoades/oauth2-openid-connect-client/zipball/0159471487540a4620b8d0b693f5f215503a8d75",
 +                "url": "https://api.github.com/repos/ssddanbrown/HtmlDiff/zipball/f60d5cc278b60305ab980a6665f46117c5b589c0",
 +                "reference": "f60d5cc278b60305ab980a6665f46117c5b589c0",
 +                "shasum": ""
 +            },
 +            "require": {
 +                "ext-mbstring": "*",
 +                "php": ">=7.2"
++            },
++            "require-dev": {
++                "phpunit/phpunit": "^8.5|^9.4.3"
++            },
++            "type": "library",
++            "autoload": {
++                "psr-4": {
++                    "Ssddanbrown\\HtmlDiff\\": "src"
++                }
++            },
++            "notification-url": "https://packagist.org/downloads/",
++            "license": [
++                "MIT"
++            ],
++            "authors": [
++                {
++                    "name": "Dan Brown",
++                    "email": "[email protected]",
++                    "role": "Developer"
++                }
++            ],
++            "description": "HTML Content Diff Generator",
++            "homepage": "https://github.com/ssddanbrown/htmldiff",
++            "support": {
++                "issues": "https://github.com/ssddanbrown/HtmlDiff/issues",
++                "source": "https://github.com/ssddanbrown/HtmlDiff/tree/v1.0.1"
++            },
++            "funding": [
++                {
++                    "url": "https://github.com/ssddanbrown",
++                    "type": "github"
++                }
++            ],
++            "time": "2021-01-24T18:51:30+00:00"
++        },
++        {
++            "name": "steverhoades/oauth2-openid-connect-client",
++            "version": "v0.3.0",
++            "source": {
++                "type": "git",
++                "url": "https://github.com/steverhoades/oauth2-openid-connect-client.git",
++                "reference": "0159471487540a4620b8d0b693f5f215503a8d75"
++            },
++            "dist": {
++                "type": "zip",
++                "url": "https://api.github.com/repos/steverhoades/oauth2-openid-connect-client/zipball/0159471487540a4620b8d0b693f5f215503a8d75",
+                 "reference": "0159471487540a4620b8d0b693f5f215503a8d75",
+                 "shasum": ""
+             },
+             "require": {
+                 "lcobucci/jwt": "^3.2",
+                 "league/oauth2-client": "^2.0"
+             },
+             "require-dev": {
+                 "phpmd/phpmd": "~2.2",
+                 "phpunit/php-invoker": "~1.1",
+                 "phpunit/phpunit": "~4.5",
+                 "squizlabs/php_codesniffer": "~2.3"
+             },
+             "type": "library",
+             "autoload": {
+                 "psr-4": {
+                     "OpenIDConnectClient\\": "src/"
+                 }
+             },
+             "notification-url": "https://packagist.org/downloads/",
+             "license": [
+                 "MIT"
+             ],
+             "authors": [
+                 {
+                     "name": "Steve Rhoades",
+                     "email": "[email protected]"
+                 }
+             ],
+             "description": "OAuth2 OpenID Connect Client that utilizes the PHP Leagues OAuth2 Client",
+             "time": "2020-05-19T23:06:36+00:00"
+         },
+         {
+             "name": "swiftmailer/swiftmailer",
+             "version": "v6.2.3",
++            "source": {
++                "type": "git",
++                "url": "https://github.com/ssddanbrown/HtmlDiff.git",
++                "reference": "f60d5cc278b60305ab980a6665f46117c5b589c0"
++            },
++            "dist": {
++                "type": "zip",
++                "url": "https://api.github.com/repos/ssddanbrown/HtmlDiff/zipball/f60d5cc278b60305ab980a6665f46117c5b589c0",
++                "reference": "f60d5cc278b60305ab980a6665f46117c5b589c0",
++                "shasum": ""
++            },
++            "require": {
++                "ext-mbstring": "*",
++                "php": ">=7.2"
 +            },
 +            "require-dev": {
 +                "phpunit/phpunit": "^8.5|^9.4.3"
 +            },
 +            "type": "library",
 +            "autoload": {
 +                "psr-4": {
 +                    "Ssddanbrown\\HtmlDiff\\": "src"
 +                }
 +            },
 +            "notification-url": "https://packagist.org/downloads/",
 +            "license": [
 +                "MIT"
 +            ],
 +            "authors": [
 +                {
 +                    "name": "Dan Brown",
 +                    "email": "[email protected]",
 +                    "role": "Developer"
 +                }
 +            ],
 +            "description": "HTML Content Diff Generator",
 +            "homepage": "https://github.com/ssddanbrown/htmldiff",
 +            "support": {
 +                "issues": "https://github.com/ssddanbrown/HtmlDiff/issues",
 +                "source": "https://github.com/ssddanbrown/HtmlDiff/tree/v1.0.1"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/ssddanbrown",
 +                    "type": "github"
 +                }
 +            ],
 +            "time": "2021-01-24T18:51:30+00:00"
 +        },
 +        {
 +            "name": "swiftmailer/swiftmailer",
 +            "version": "v6.2.7",
              "source": {
                  "type": "git",
                  "url": "https://github.com/swiftmailer/swiftmailer.git",
 -                "reference": "149cfdf118b169f7840bbe3ef0d4bc795d1780c9"
 +                "reference": "15f7faf8508e04471f666633addacf54c0ab5933"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/149cfdf118b169f7840bbe3ef0d4bc795d1780c9",
 -                "reference": "149cfdf118b169f7840bbe3ef0d4bc795d1780c9",
 +                "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/15f7faf8508e04471f666633addacf54c0ab5933",
 +                "reference": "15f7faf8508e04471f666633addacf54c0ab5933",
                  "shasum": ""
              },
              "require": {
 -                "egulias/email-validator": "~2.0",
 +                "egulias/email-validator": "^2.0|^3.1",
                  "php": ">=7.0.0",
                  "symfony/polyfill-iconv": "^1.0",
                  "symfony/polyfill-intl-idn": "^1.10",
                  "symfony/polyfill-mbstring": "^1.0"
              },
              "require-dev": {
 -                "mockery/mockery": "~0.9.1",
 -                "symfony/phpunit-bridge": "^3.4.19|^4.1.8"
 +                "mockery/mockery": "^1.0",
 +                "symfony/phpunit-bridge": "^4.4|^5.0"
              },
              "suggest": {
 -                "ext-intl": "Needed to support internationalized email addresses",
 -                "true/punycode": "Needed to support internationalized email addresses, if ext-intl is not installed"
 +                "ext-intl": "Needed to support internationalized email addresses"
              },
              "type": "library",
              "extra": {
                  "mail",
                  "mailer"
              ],
 -            "time": "2019-11-12T09:31:26+00:00"
 +            "support": {
 +                "issues": "https://github.com/swiftmailer/swiftmailer/issues",
 +                "source": "https://github.com/swiftmailer/swiftmailer/tree/v6.2.7"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/fabpot",
 +                    "type": "github"
 +                },
 +                {
 +                    "url": "https://tidelift.com/funding/github/packagist/swiftmailer/swiftmailer",
 +                    "type": "tidelift"
 +                }
 +            ],
 +            "time": "2021-03-09T12:30:35+00:00"
          },
          {
              "name": "symfony/console",
 -            "version": "v4.4.8",
 +            "version": "v4.4.30",
              "source": {
                  "type": "git",
                  "url": "https://github.com/symfony/console.git",
 -                "reference": "10bb3ee3c97308869d53b3e3d03f6ac23ff985f7"
 +                "reference": "a3f7189a0665ee33b50e9e228c46f50f5acbed22"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/symfony/console/zipball/10bb3ee3c97308869d53b3e3d03f6ac23ff985f7",
 -                "reference": "10bb3ee3c97308869d53b3e3d03f6ac23ff985f7",
 +                "url": "https://api.github.com/repos/symfony/console/zipball/a3f7189a0665ee33b50e9e228c46f50f5acbed22",
 +                "reference": "a3f7189a0665ee33b50e9e228c46f50f5acbed22",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.1.3",
 +                "php": ">=7.1.3",
                  "symfony/polyfill-mbstring": "~1.0",
                  "symfony/polyfill-php73": "^1.8",
 +                "symfony/polyfill-php80": "^1.16",
                  "symfony/service-contracts": "^1.1|^2"
              },
              "conflict": {
 +                "psr/log": ">=3",
                  "symfony/dependency-injection": "<3.4",
                  "symfony/event-dispatcher": "<4.3|>=5",
                  "symfony/lock": "<4.4",
                  "symfony/process": "<3.3"
              },
              "provide": {
 -                "psr/log-implementation": "1.0"
 +                "psr/log-implementation": "1.0|2.0"
              },
              "require-dev": {
 -                "psr/log": "~1.0",
 +                "psr/log": "^1|^2",
                  "symfony/config": "^3.4|^4.0|^5.0",
                  "symfony/dependency-injection": "^3.4|^4.0|^5.0",
                  "symfony/event-dispatcher": "^4.3",
                  "symfony/process": ""
              },
              "type": "library",
 -            "extra": {
 -                "branch-alias": {
 -                    "dev-master": "4.4-dev"
 -                }
 -            },
              "autoload": {
                  "psr-4": {
                      "Symfony\\Component\\Console\\": ""
                      "homepage": "https://symfony.com/contributors"
                  }
              ],
 -            "description": "Symfony Console Component",
 +            "description": "Eases the creation of beautiful and testable command line interfaces",
              "homepage": "https://symfony.com",
 +            "support": {
 +                "source": "https://github.com/symfony/console/tree/v4.4.30"
 +            },
              "funding": [
                  {
                      "url": "https://symfony.com/sponsor",
                      "type": "tidelift"
                  }
              ],
 -            "time": "2020-03-30T11:41:10+00:00"
 +            "time": "2021-08-25T19:27:26+00:00"
          },
          {
              "name": "symfony/css-selector",
 -            "version": "v4.4.8",
 +            "version": "v5.3.4",
              "source": {
                  "type": "git",
                  "url": "https://github.com/symfony/css-selector.git",
 -                "reference": "afc26133a6fbdd4f8842e38893e0ee4685c7c94b"
 +                "reference": "7fb120adc7f600a59027775b224c13a33530dd90"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/symfony/css-selector/zipball/afc26133a6fbdd4f8842e38893e0ee4685c7c94b",
 -                "reference": "afc26133a6fbdd4f8842e38893e0ee4685c7c94b",
 +                "url": "https://api.github.com/repos/symfony/css-selector/zipball/7fb120adc7f600a59027775b224c13a33530dd90",
 +                "reference": "7fb120adc7f600a59027775b224c13a33530dd90",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.1.3"
 +                "php": ">=7.2.5",
 +                "symfony/polyfill-php80": "^1.16"
              },
              "type": "library",
 -            "extra": {
 -                "branch-alias": {
 -                    "dev-master": "4.4-dev"
 -                }
 -            },
              "autoload": {
                  "psr-4": {
                      "Symfony\\Component\\CssSelector\\": ""
                      "homepage": "https://symfony.com/contributors"
                  }
              ],
 -            "description": "Symfony CssSelector Component",
 +            "description": "Converts CSS selectors to XPath expressions",
              "homepage": "https://symfony.com",
 +            "support": {
 +                "source": "https://github.com/symfony/css-selector/tree/v5.3.4"
 +            },
              "funding": [
                  {
                      "url": "https://symfony.com/sponsor",
                      "type": "tidelift"
                  }
              ],
 -            "time": "2020-03-27T16:54:36+00:00"
 +            "time": "2021-07-21T12:38:00+00:00"
          },
          {
              "name": "symfony/debug",
 -            "version": "v4.4.8",
 +            "version": "v4.4.27",
              "source": {
                  "type": "git",
                  "url": "https://github.com/symfony/debug.git",
 -                "reference": "346636d2cae417992ecfd761979b2ab98b339a45"
 +                "reference": "2f9160e92eb64c95da7368c867b663a8e34e980c"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/symfony/debug/zipball/346636d2cae417992ecfd761979b2ab98b339a45",
 -                "reference": "346636d2cae417992ecfd761979b2ab98b339a45",
 +                "url": "https://api.github.com/repos/symfony/debug/zipball/2f9160e92eb64c95da7368c867b663a8e34e980c",
 +                "reference": "2f9160e92eb64c95da7368c867b663a8e34e980c",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.1.3",
 -                "psr/log": "~1.0"
 +                "php": ">=7.1.3",
 +                "psr/log": "^1|^2|^3"
              },
              "conflict": {
                  "symfony/http-kernel": "<3.4"
                  "symfony/http-kernel": "^3.4|^4.0|^5.0"
              },
              "type": "library",
 -            "extra": {
 -                "branch-alias": {
 -                    "dev-master": "4.4-dev"
 -                }
 -            },
              "autoload": {
                  "psr-4": {
                      "Symfony\\Component\\Debug\\": ""
                      "homepage": "https://symfony.com/contributors"
                  }
              ],
 -            "description": "Symfony Debug Component",
 +            "description": "Provides tools to ease debugging PHP code",
 +            "homepage": "https://symfony.com",
 +            "support": {
 +                "source": "https://github.com/symfony/debug/tree/v4.4.27"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://symfony.com/sponsor",
 +                    "type": "custom"
 +                },
 +                {
 +                    "url": "https://github.com/fabpot",
 +                    "type": "github"
 +                },
 +                {
 +                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
 +                    "type": "tidelift"
 +                }
 +            ],
 +            "time": "2021-07-22T07:21:39+00:00"
 +        },
 +        {
 +            "name": "symfony/deprecation-contracts",
 +            "version": "v2.4.0",
 +            "source": {
 +                "type": "git",
 +                "url": "https://github.com/symfony/deprecation-contracts.git",
 +                "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627"
 +            },
 +            "dist": {
 +                "type": "zip",
 +                "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627",
 +                "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627",
 +                "shasum": ""
 +            },
 +            "require": {
 +                "php": ">=7.1"
 +            },
 +            "type": "library",
 +            "extra": {
 +                "branch-alias": {
 +                    "dev-main": "2.4-dev"
 +                },
 +                "thanks": {
 +                    "name": "symfony/contracts",
 +                    "url": "https://github.com/symfony/contracts"
 +                }
 +            },
 +            "autoload": {
 +                "files": [
 +                    "function.php"
 +                ]
 +            },
 +            "notification-url": "https://packagist.org/downloads/",
 +            "license": [
 +                "MIT"
 +            ],
 +            "authors": [
 +                {
 +                    "name": "Nicolas Grekas",
 +                    "email": "[email protected]"
 +                },
 +                {
 +                    "name": "Symfony Community",
 +                    "homepage": "https://symfony.com/contributors"
 +                }
 +            ],
 +            "description": "A generic function and convention to trigger deprecation notices",
              "homepage": "https://symfony.com",
 +            "support": {
 +                "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0"
 +            },
              "funding": [
                  {
                      "url": "https://symfony.com/sponsor",
                      "type": "tidelift"
                  }
              ],
 -            "time": "2020-03-27T16:54:36+00:00"
 +            "time": "2021-03-23T23:28:01+00:00"
          },
          {
              "name": "symfony/error-handler",
 -            "version": "v4.4.8",
 +            "version": "v4.4.30",
              "source": {
                  "type": "git",
                  "url": "https://github.com/symfony/error-handler.git",
 -                "reference": "7e9828fc98aa1cf27b422fe478a84f5b0abb7358"
 +                "reference": "51f98f7aa99f00f3b1da6bafe934e67ae6ba6dc5"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/symfony/error-handler/zipball/7e9828fc98aa1cf27b422fe478a84f5b0abb7358",
 -                "reference": "7e9828fc98aa1cf27b422fe478a84f5b0abb7358",
 +                "url": "https://api.github.com/repos/symfony/error-handler/zipball/51f98f7aa99f00f3b1da6bafe934e67ae6ba6dc5",
 +                "reference": "51f98f7aa99f00f3b1da6bafe934e67ae6ba6dc5",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.1.3",
 -                "psr/log": "~1.0",
 +                "php": ">=7.1.3",
 +                "psr/log": "^1|^2|^3",
                  "symfony/debug": "^4.4.5",
                  "symfony/var-dumper": "^4.4|^5.0"
              },
                  "symfony/serializer": "^4.4|^5.0"
              },
              "type": "library",
 -            "extra": {
 -                "branch-alias": {
 -                    "dev-master": "4.4-dev"
 -                }
 -            },
              "autoload": {
                  "psr-4": {
                      "Symfony\\Component\\ErrorHandler\\": ""
                      "homepage": "https://symfony.com/contributors"
                  }
              ],
 -            "description": "Symfony ErrorHandler Component",
 +            "description": "Provides tools to manage errors and ease debugging PHP code",
              "homepage": "https://symfony.com",
 +            "support": {
 +                "source": "https://github.com/symfony/error-handler/tree/v4.4.30"
 +            },
              "funding": [
                  {
                      "url": "https://symfony.com/sponsor",
                      "type": "tidelift"
                  }
              ],
 -            "time": "2020-03-30T14:07:33+00:00"
 +            "time": "2021-08-27T17:42:48+00:00"
          },
          {
              "name": "symfony/event-dispatcher",
 -            "version": "v4.4.8",
 +            "version": "v4.4.30",
              "source": {
                  "type": "git",
                  "url": "https://github.com/symfony/event-dispatcher.git",
 -                "reference": "abc8e3618bfdb55e44c8c6a00abd333f831bbfed"
 +                "reference": "2fe81680070043c4c80e7cedceb797e34f377bac"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/abc8e3618bfdb55e44c8c6a00abd333f831bbfed",
 -                "reference": "abc8e3618bfdb55e44c8c6a00abd333f831bbfed",
 +                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/2fe81680070043c4c80e7cedceb797e34f377bac",
 +                "reference": "2fe81680070043c4c80e7cedceb797e34f377bac",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.1.3",
 -                "symfony/event-dispatcher-contracts": "^1.1"
 +                "php": ">=7.1.3",
 +                "symfony/event-dispatcher-contracts": "^1.1",
 +                "symfony/polyfill-php80": "^1.16"
              },
              "conflict": {
                  "symfony/dependency-injection": "<3.4"
                  "symfony/event-dispatcher-implementation": "1.1"
              },
              "require-dev": {
 -                "psr/log": "~1.0",
 +                "psr/log": "^1|^2|^3",
                  "symfony/config": "^3.4|^4.0|^5.0",
                  "symfony/dependency-injection": "^3.4|^4.0|^5.0",
 +                "symfony/error-handler": "~3.4|~4.4",
                  "symfony/expression-language": "^3.4|^4.0|^5.0",
                  "symfony/http-foundation": "^3.4|^4.0|^5.0",
                  "symfony/service-contracts": "^1.1|^2",
                  "symfony/http-kernel": ""
              },
              "type": "library",
 -            "extra": {
 -                "branch-alias": {
 -                    "dev-master": "4.4-dev"
 -                }
 -            },
              "autoload": {
                  "psr-4": {
                      "Symfony\\Component\\EventDispatcher\\": ""
                      "homepage": "https://symfony.com/contributors"
                  }
              ],
 -            "description": "Symfony EventDispatcher Component",
 +            "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/v4.4.30"
 +            },
              "funding": [
                  {
                      "url": "https://symfony.com/sponsor",
                      "type": "tidelift"
                  }
              ],
 -            "time": "2020-03-27T16:54:36+00:00"
 +            "time": "2021-08-04T20:31:23+00:00"
          },
          {
              "name": "symfony/event-dispatcher-contracts",
 -            "version": "v1.1.7",
 +            "version": "v1.1.9",
              "source": {
                  "type": "git",
                  "url": "https://github.com/symfony/event-dispatcher-contracts.git",
 -                "reference": "c43ab685673fb6c8d84220c77897b1d6cdbe1d18"
 +                "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/c43ab685673fb6c8d84220c77897b1d6cdbe1d18",
 -                "reference": "c43ab685673fb6c8d84220c77897b1d6cdbe1d18",
 +                "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/84e23fdcd2517bf37aecbd16967e83f0caee25a7",
 +                "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.1.3"
 +                "php": ">=7.1.3"
              },
              "suggest": {
                  "psr/event-dispatcher": "",
              "extra": {
                  "branch-alias": {
                      "dev-master": "1.1-dev"
 +                },
 +                "thanks": {
 +                    "name": "symfony/contracts",
 +                    "url": "https://github.com/symfony/contracts"
                  }
              },
              "autoload": {
                  "interoperability",
                  "standards"
              ],
 -            "time": "2019-09-17T09:54:03+00:00"
 +            "support": {
 +                "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v1.1.9"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://symfony.com/sponsor",
 +                    "type": "custom"
 +                },
 +                {
 +                    "url": "https://github.com/fabpot",
 +                    "type": "github"
 +                },
 +                {
 +                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
 +                    "type": "tidelift"
 +                }
 +            ],
 +            "time": "2020-07-06T13:19:58+00:00"
          },
          {
              "name": "symfony/finder",
 -            "version": "v4.4.8",
 +            "version": "v4.4.30",
              "source": {
                  "type": "git",
                  "url": "https://github.com/symfony/finder.git",
 -                "reference": "5729f943f9854c5781984ed4907bbb817735776b"
 +                "reference": "70362f1e112280d75b30087c7598b837c1b468b6"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/symfony/finder/zipball/5729f943f9854c5781984ed4907bbb817735776b",
 -                "reference": "5729f943f9854c5781984ed4907bbb817735776b",
 +                "url": "https://api.github.com/repos/symfony/finder/zipball/70362f1e112280d75b30087c7598b837c1b468b6",
 +                "reference": "70362f1e112280d75b30087c7598b837c1b468b6",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.1.3"
 +                "php": ">=7.1.3",
 +                "symfony/polyfill-php80": "^1.16"
              },
              "type": "library",
 -            "extra": {
 -                "branch-alias": {
 -                    "dev-master": "4.4-dev"
 -                }
 -            },
              "autoload": {
                  "psr-4": {
                      "Symfony\\Component\\Finder\\": ""
                      "homepage": "https://symfony.com/contributors"
                  }
              ],
 -            "description": "Symfony Finder Component",
 +            "description": "Finds files and directories via an intuitive fluent interface",
              "homepage": "https://symfony.com",
 +            "support": {
 +                "source": "https://github.com/symfony/finder/tree/v4.4.30"
 +            },
              "funding": [
                  {
                      "url": "https://symfony.com/sponsor",
                      "type": "tidelift"
                  }
              ],
 -            "time": "2020-03-27T16:54:36+00:00"
 +            "time": "2021-08-04T20:31:23+00:00"
          },
          {
 -            "name": "symfony/http-foundation",
 -            "version": "v4.4.8",
 +            "name": "symfony/http-client-contracts",
 +            "version": "v2.4.0",
              "source": {
                  "type": "git",
 -                "url": "https://github.com/symfony/http-foundation.git",
 -                "reference": "ec5bd254c223786f5fa2bb49a1e705c1b8e7cee2"
 +                "url": "https://github.com/symfony/http-client-contracts.git",
 +                "reference": "7e82f6084d7cae521a75ef2cb5c9457bbda785f4"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ec5bd254c223786f5fa2bb49a1e705c1b8e7cee2",
 -                "reference": "ec5bd254c223786f5fa2bb49a1e705c1b8e7cee2",
 +                "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/7e82f6084d7cae521a75ef2cb5c9457bbda785f4",
 +                "reference": "7e82f6084d7cae521a75ef2cb5c9457bbda785f4",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.1.3",
 -                "symfony/mime": "^4.3|^5.0",
 -                "symfony/polyfill-mbstring": "~1.1"
 +                "php": ">=7.2.5"
              },
 -            "require-dev": {
 -                "predis/predis": "~1.0",
 -                "symfony/expression-language": "^3.4|^4.0|^5.0"
 +            "suggest": {
 +                "symfony/http-client-implementation": ""
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "4.4-dev"
 +                    "dev-main": "2.4-dev"
 +                },
 +                "thanks": {
 +                    "name": "symfony/contracts",
 +                    "url": "https://github.com/symfony/contracts"
                  }
              },
              "autoload": {
                  "psr-4": {
 -                    "Symfony\\Component\\HttpFoundation\\": ""
 -                },
 -                "exclude-from-classmap": [
 -                    "/Tests/"
 -                ]
 +                    "Symfony\\Contracts\\HttpClient\\": ""
 +                }
              },
              "notification-url": "https://packagist.org/downloads/",
              "license": [
              ],
              "authors": [
                  {
 -                    "name": "Fabien Potencier",
 -                    "email": "fabien@symfony.com"
 +                    "name": "Nicolas Grekas",
 +                    "email": "p@tchwork.com"
                  },
                  {
                      "name": "Symfony Community",
                      "homepage": "https://symfony.com/contributors"
                  }
              ],
 -            "description": "Symfony HttpFoundation Component",
 +            "description": "Generic abstractions related to HTTP clients",
              "homepage": "https://symfony.com",
 +            "keywords": [
 +                "abstractions",
 +                "contracts",
 +                "decoupling",
 +                "interfaces",
 +                "interoperability",
 +                "standards"
 +            ],
 +            "support": {
 +                "source": "https://github.com/symfony/http-client-contracts/tree/v2.4.0"
 +            },
              "funding": [
                  {
                      "url": "https://symfony.com/sponsor",
                      "type": "tidelift"
                  }
              ],
 -            "time": "2020-04-18T20:40:08+00:00"
 +            "time": "2021-04-11T23:07:08+00:00"
          },
          {
 -            "name": "symfony/http-kernel",
 -            "version": "v4.4.8",
 +            "name": "symfony/http-foundation",
 +            "version": "v4.4.30",
              "source": {
                  "type": "git",
 -                "url": "https://github.com/symfony/http-kernel.git",
 -                "reference": "1799a6c01f0db5851f399151abdb5d6393fec277"
 +                "url": "https://github.com/symfony/http-foundation.git",
 +                "reference": "09b3202651ab23ac8dcf455284a48a3500e56731"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/1799a6c01f0db5851f399151abdb5d6393fec277",
 -                "reference": "1799a6c01f0db5851f399151abdb5d6393fec277",
 +                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/09b3202651ab23ac8dcf455284a48a3500e56731",
 +                "reference": "09b3202651ab23ac8dcf455284a48a3500e56731",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.1.3",
 -                "psr/log": "~1.0",
 -                "symfony/error-handler": "^4.4",
 -                "symfony/event-dispatcher": "^4.4",
 -                "symfony/http-foundation": "^4.4|^5.0",
 -                "symfony/polyfill-ctype": "^1.8",
 -                "symfony/polyfill-php73": "^1.9"
 -            },
 -            "conflict": {
 -                "symfony/browser-kit": "<4.3",
 -                "symfony/config": "<3.4",
 -                "symfony/console": ">=5",
 -                "symfony/dependency-injection": "<4.3",
 -                "symfony/translation": "<4.2",
 -                "twig/twig": "<1.34|<2.4,>=2"
 -            },
 -            "provide": {
 -                "psr/log-implementation": "1.0"
 +                "php": ">=7.1.3",
 +                "symfony/mime": "^4.3|^5.0",
 +                "symfony/polyfill-mbstring": "~1.1",
 +                "symfony/polyfill-php80": "^1.16"
              },
              "require-dev": {
 -                "psr/cache": "~1.0",
 -                "symfony/browser-kit": "^4.3|^5.0",
 -                "symfony/config": "^3.4|^4.0|^5.0",
 -                "symfony/console": "^3.4|^4.0",
 -                "symfony/css-selector": "^3.4|^4.0|^5.0",
 -                "symfony/dependency-injection": "^4.3|^5.0",
 -                "symfony/dom-crawler": "^3.4|^4.0|^5.0",
 -                "symfony/expression-language": "^3.4|^4.0|^5.0",
 -                "symfony/finder": "^3.4|^4.0|^5.0",
 -                "symfony/process": "^3.4|^4.0|^5.0",
 -                "symfony/routing": "^3.4|^4.0|^5.0",
 -                "symfony/stopwatch": "^3.4|^4.0|^5.0",
 -                "symfony/templating": "^3.4|^4.0|^5.0",
 -                "symfony/translation": "^4.2|^5.0",
 -                "symfony/translation-contracts": "^1.1|^2",
 -                "twig/twig": "^1.34|^2.4|^3.0"
 -            },
 -            "suggest": {
 -                "symfony/browser-kit": "",
 -                "symfony/config": "",
 -                "symfony/console": "",
 -                "symfony/dependency-injection": ""
 +                "predis/predis": "~1.0",
 +                "symfony/expression-language": "^3.4|^4.0|^5.0"
              },
              "type": "library",
 -            "extra": {
 -                "branch-alias": {
 -                    "dev-master": "4.4-dev"
 +            "autoload": {
 +                "psr-4": {
 +                    "Symfony\\Component\\HttpFoundation\\": ""
 +                },
 +                "exclude-from-classmap": [
 +                    "/Tests/"
 +                ]
 +            },
 +            "notification-url": "https://packagist.org/downloads/",
 +            "license": [
 +                "MIT"
 +            ],
 +            "authors": [
 +                {
 +                    "name": "Fabien Potencier",
 +                    "email": "[email protected]"
 +                },
 +                {
 +                    "name": "Symfony Community",
 +                    "homepage": "https://symfony.com/contributors"
 +                }
 +            ],
 +            "description": "Defines an object-oriented layer for the HTTP specification",
 +            "homepage": "https://symfony.com",
 +            "support": {
 +                "source": "https://github.com/symfony/http-foundation/tree/v4.4.30"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://symfony.com/sponsor",
 +                    "type": "custom"
 +                },
 +                {
 +                    "url": "https://github.com/fabpot",
 +                    "type": "github"
 +                },
 +                {
 +                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
 +                    "type": "tidelift"
                  }
 +            ],
 +            "time": "2021-08-26T15:51:23+00:00"
 +        },
 +        {
 +            "name": "symfony/http-kernel",
 +            "version": "v4.4.30",
 +            "source": {
 +                "type": "git",
 +                "url": "https://github.com/symfony/http-kernel.git",
 +                "reference": "87f7ea4a8a7a30c967e26001de99f12943bf57ae"
 +            },
 +            "dist": {
 +                "type": "zip",
 +                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/87f7ea4a8a7a30c967e26001de99f12943bf57ae",
 +                "reference": "87f7ea4a8a7a30c967e26001de99f12943bf57ae",
 +                "shasum": ""
 +            },
 +            "require": {
 +                "php": ">=7.1.3",
 +                "psr/log": "^1|^2",
 +                "symfony/error-handler": "^4.4",
 +                "symfony/event-dispatcher": "^4.4",
 +                "symfony/http-client-contracts": "^1.1|^2",
 +                "symfony/http-foundation": "^4.4.30|^5.3.7",
 +                "symfony/polyfill-ctype": "^1.8",
 +                "symfony/polyfill-php73": "^1.9",
 +                "symfony/polyfill-php80": "^1.16"
 +            },
 +            "conflict": {
 +                "symfony/browser-kit": "<4.3",
 +                "symfony/config": "<3.4",
 +                "symfony/console": ">=5",
 +                "symfony/dependency-injection": "<4.3",
 +                "symfony/translation": "<4.2",
 +                "twig/twig": "<1.43|<2.13,>=2"
              },
 +            "provide": {
 +                "psr/log-implementation": "1.0|2.0"
 +            },
 +            "require-dev": {
 +                "psr/cache": "^1.0|^2.0|^3.0",
 +                "symfony/browser-kit": "^4.3|^5.0",
 +                "symfony/config": "^3.4|^4.0|^5.0",
 +                "symfony/console": "^3.4|^4.0",
 +                "symfony/css-selector": "^3.4|^4.0|^5.0",
 +                "symfony/dependency-injection": "^4.3|^5.0",
 +                "symfony/dom-crawler": "^3.4|^4.0|^5.0",
 +                "symfony/expression-language": "^3.4|^4.0|^5.0",
 +                "symfony/finder": "^3.4|^4.0|^5.0",
 +                "symfony/process": "^3.4|^4.0|^5.0",
 +                "symfony/routing": "^3.4|^4.0|^5.0",
 +                "symfony/stopwatch": "^3.4|^4.0|^5.0",
 +                "symfony/templating": "^3.4|^4.0|^5.0",
 +                "symfony/translation": "^4.2|^5.0",
 +                "symfony/translation-contracts": "^1.1|^2",
 +                "twig/twig": "^1.43|^2.13|^3.0.4"
 +            },
 +            "suggest": {
 +                "symfony/browser-kit": "",
 +                "symfony/config": "",
 +                "symfony/console": "",
 +                "symfony/dependency-injection": ""
 +            },
 +            "type": "library",
              "autoload": {
                  "psr-4": {
                      "Symfony\\Component\\HttpKernel\\": ""
                      "homepage": "https://symfony.com/contributors"
                  }
              ],
 -            "description": "Symfony HttpKernel Component",
 +            "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/v4.4.30"
 +            },
              "funding": [
                  {
                      "url": "https://symfony.com/sponsor",
                      "type": "tidelift"
                  }
              ],
 -            "time": "2020-04-28T18:47:42+00:00"
 +            "time": "2021-08-30T12:27:20+00:00"
          },
          {
              "name": "symfony/mime",
 -            "version": "v4.4.8",
 +            "version": "v5.3.7",
              "source": {
                  "type": "git",
                  "url": "https://github.com/symfony/mime.git",
 -                "reference": "7a583ffb6c7dd5aabb5db920817a3cc39261c517"
 +                "reference": "ae887cb3b044658676129f5e97aeb7e9eb69c2d8"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/symfony/mime/zipball/7a583ffb6c7dd5aabb5db920817a3cc39261c517",
 -                "reference": "7a583ffb6c7dd5aabb5db920817a3cc39261c517",
 +                "url": "https://api.github.com/repos/symfony/mime/zipball/ae887cb3b044658676129f5e97aeb7e9eb69c2d8",
 +                "reference": "ae887cb3b044658676129f5e97aeb7e9eb69c2d8",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.1.3",
 +                "php": ">=7.2.5",
 +                "symfony/deprecation-contracts": "^2.1",
                  "symfony/polyfill-intl-idn": "^1.10",
 -                "symfony/polyfill-mbstring": "^1.0"
 +                "symfony/polyfill-mbstring": "^1.0",
 +                "symfony/polyfill-php80": "^1.16"
              },
              "conflict": {
 +                "egulias/email-validator": "~3.0.0",
 +                "phpdocumentor/reflection-docblock": "<3.2.2",
 +                "phpdocumentor/type-resolver": "<1.4.0",
                  "symfony/mailer": "<4.4"
              },
              "require-dev": {
 -                "egulias/email-validator": "^2.1.10",
 -                "symfony/dependency-injection": "^3.4|^4.1|^5.0"
 +                "egulias/email-validator": "^2.1.10|^3.1",
 +                "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
 +                "symfony/dependency-injection": "^4.4|^5.0",
 +                "symfony/property-access": "^4.4|^5.1",
 +                "symfony/property-info": "^4.4|^5.1",
 +                "symfony/serializer": "^5.2"
              },
              "type": "library",
 -            "extra": {
 -                "branch-alias": {
 -                    "dev-master": "4.4-dev"
 -                }
 -            },
              "autoload": {
                  "psr-4": {
                      "Symfony\\Component\\Mime\\": ""
                      "homepage": "https://symfony.com/contributors"
                  }
              ],
 -            "description": "A library to manipulate MIME messages",
 +            "description": "Allows manipulating MIME messages",
              "homepage": "https://symfony.com",
              "keywords": [
                  "mime",
                  "mime-type"
              ],
 +            "support": {
 +                "source": "https://github.com/symfony/mime/tree/v5.3.7"
 +            },
              "funding": [
                  {
                      "url": "https://symfony.com/sponsor",
                      "type": "tidelift"
                  }
              ],
 -            "time": "2020-04-16T14:49:30+00:00"
 +            "time": "2021-08-20T11:40:01+00:00"
          },
          {
              "name": "symfony/polyfill-ctype",
 -            "version": "v1.17.0",
 +            "version": "v1.23.0",
              "source": {
                  "type": "git",
                  "url": "https://github.com/symfony/polyfill-ctype.git",
 -                "reference": "e94c8b1bbe2bc77507a1056cdb06451c75b427f9"
 +                "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e94c8b1bbe2bc77507a1056cdb06451c75b427f9",
 -                "reference": "e94c8b1bbe2bc77507a1056cdb06451c75b427f9",
 +                "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce",
 +                "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce",
                  "shasum": ""
              },
              "require": {
 -                "php": ">=5.3.3"
 +                "php": ">=7.1"
              },
              "suggest": {
                  "ext-ctype": "For best performance"
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "1.17-dev"
 +                    "dev-main": "1.23-dev"
 +                },
 +                "thanks": {
 +                    "name": "symfony/polyfill",
 +                    "url": "https://github.com/symfony/polyfill"
                  }
              },
              "autoload": {
                  "polyfill",
                  "portable"
              ],
 +            "support": {
 +                "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0"
 +            },
              "funding": [
                  {
                      "url": "https://symfony.com/sponsor",
                      "type": "tidelift"
                  }
              ],
 -            "time": "2020-05-12T16:14:59+00:00"
 +            "time": "2021-02-19T12:13:01+00:00"
          },
          {
              "name": "symfony/polyfill-iconv",
 -            "version": "v1.17.0",
 +            "version": "v1.23.0",
              "source": {
                  "type": "git",
                  "url": "https://github.com/symfony/polyfill-iconv.git",
 -                "reference": "c4de7601eefbf25f9d47190abe07f79fe0a27424"
 +                "reference": "63b5bb7db83e5673936d6e3b8b3e022ff6474933"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/c4de7601eefbf25f9d47190abe07f79fe0a27424",
 -                "reference": "c4de7601eefbf25f9d47190abe07f79fe0a27424",
 +                "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/63b5bb7db83e5673936d6e3b8b3e022ff6474933",
 +                "reference": "63b5bb7db83e5673936d6e3b8b3e022ff6474933",
                  "shasum": ""
              },
              "require": {
 -                "php": ">=5.3.3"
 +                "php": ">=7.1"
              },
              "suggest": {
                  "ext-iconv": "For best performance"
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "1.17-dev"
 +                    "dev-main": "1.23-dev"
 +                },
 +                "thanks": {
 +                    "name": "symfony/polyfill",
 +                    "url": "https://github.com/symfony/polyfill"
                  }
              },
              "autoload": {
                  "portable",
                  "shim"
              ],
 +            "support": {
 +                "source": "https://github.com/symfony/polyfill-iconv/tree/v1.23.0"
 +            },
              "funding": [
                  {
                      "url": "https://symfony.com/sponsor",
                      "type": "tidelift"
                  }
              ],
 -            "time": "2020-05-12T16:47:27+00:00"
 +            "time": "2021-05-27T09:27:20+00:00"
          },
          {
              "name": "symfony/polyfill-intl-idn",
 -            "version": "v1.17.0",
 +            "version": "v1.23.0",
              "source": {
                  "type": "git",
                  "url": "https://github.com/symfony/polyfill-intl-idn.git",
 -                "reference": "3bff59ea7047e925be6b7f2059d60af31bb46d6a"
 +                "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/3bff59ea7047e925be6b7f2059d60af31bb46d6a",
 -                "reference": "3bff59ea7047e925be6b7f2059d60af31bb46d6a",
 +                "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/65bd267525e82759e7d8c4e8ceea44f398838e65",
 +                "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65",
                  "shasum": ""
              },
              "require": {
 -                "php": ">=5.3.3",
 -                "symfony/polyfill-mbstring": "^1.3",
 +                "php": ">=7.1",
 +                "symfony/polyfill-intl-normalizer": "^1.10",
                  "symfony/polyfill-php72": "^1.10"
              },
              "suggest": {
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "1.17-dev"
 +                    "dev-main": "1.23-dev"
 +                },
 +                "thanks": {
 +                    "name": "symfony/polyfill",
 +                    "url": "https://github.com/symfony/polyfill"
                  }
              },
              "autoload": {
                      "name": "Laurent Bassin",
                      "email": "[email protected]"
                  },
 +                {
 +                    "name": "Trevor Rowbotham",
 +                    "email": "[email protected]"
 +                },
                  {
                      "name": "Symfony Community",
                      "homepage": "https://symfony.com/contributors"
                  "portable",
                  "shim"
              ],
 +            "support": {
 +                "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.23.0"
 +            },
              "funding": [
                  {
                      "url": "https://symfony.com/sponsor",
                      "type": "tidelift"
                  }
              ],
 -            "time": "2020-05-12T16:47:27+00:00"
 +            "time": "2021-05-27T09:27:20+00:00"
          },
          {
 -            "name": "symfony/polyfill-mbstring",
 -            "version": "v1.17.0",
 +            "name": "symfony/polyfill-intl-normalizer",
 +            "version": "v1.23.0",
              "source": {
                  "type": "git",
 -                "url": "https://github.com/symfony/polyfill-mbstring.git",
 -                "reference": "fa79b11539418b02fc5e1897267673ba2c19419c"
 +                "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
 +                "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fa79b11539418b02fc5e1897267673ba2c19419c",
 -                "reference": "fa79b11539418b02fc5e1897267673ba2c19419c",
 +                "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8",
 +                "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8",
                  "shasum": ""
              },
              "require": {
 -                "php": ">=5.3.3"
 +                "php": ">=7.1"
              },
              "suggest": {
 -                "ext-mbstring": "For best performance"
 +                "ext-intl": "For best performance"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "1.17-dev"
 +                    "dev-main": "1.23-dev"
 +                },
 +                "thanks": {
 +                    "name": "symfony/polyfill",
 +                    "url": "https://github.com/symfony/polyfill"
                  }
              },
              "autoload": {
                  "psr-4": {
 -                    "Symfony\\Polyfill\\Mbstring\\": ""
 +                    "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
                  },
                  "files": [
                      "bootstrap.php"
 +                ],
 +                "classmap": [
 +                    "Resources/stubs"
                  ]
              },
              "notification-url": "https://packagist.org/downloads/",
                      "homepage": "https://symfony.com/contributors"
                  }
              ],
 -            "description": "Symfony polyfill for the Mbstring extension",
 +            "description": "Symfony polyfill for intl's Normalizer class and related functions",
              "homepage": "https://symfony.com",
              "keywords": [
                  "compatibility",
 -                "mbstring",
 +                "intl",
 +                "normalizer",
                  "polyfill",
                  "portable",
                  "shim"
              ],
 +            "support": {
 +                "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0"
 +            },
              "funding": [
                  {
                      "url": "https://symfony.com/sponsor",
                      "type": "tidelift"
                  }
              ],
 -            "time": "2020-05-12T16:47:27+00:00"
 +            "time": "2021-02-19T12:13:01+00:00"
          },
          {
 -            "name": "symfony/polyfill-php72",
 -            "version": "v1.17.0",
 +            "name": "symfony/polyfill-mbstring",
 +            "version": "v1.23.1",
              "source": {
                  "type": "git",
 -                "url": "https://github.com/symfony/polyfill-php72.git",
 -                "reference": "f048e612a3905f34931127360bdd2def19a5e582"
 +                "url": "https://github.com/symfony/polyfill-mbstring.git",
 +                "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/f048e612a3905f34931127360bdd2def19a5e582",
 -                "reference": "f048e612a3905f34931127360bdd2def19a5e582",
 +                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6",
 +                "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6",
                  "shasum": ""
              },
              "require": {
 -                "php": ">=5.3.3"
 +                "php": ">=7.1"
 +            },
 +            "suggest": {
 +                "ext-mbstring": "For best performance"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "1.17-dev"
 +                    "dev-main": "1.23-dev"
 +                },
 +                "thanks": {
 +                    "name": "symfony/polyfill",
 +                    "url": "https://github.com/symfony/polyfill"
                  }
              },
              "autoload": {
                  "psr-4": {
 -                    "Symfony\\Polyfill\\Php72\\": ""
 +                    "Symfony\\Polyfill\\Mbstring\\": ""
                  },
                  "files": [
                      "bootstrap.php"
                      "homepage": "https://symfony.com/contributors"
                  }
              ],
 -            "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
 +            "description": "Symfony polyfill for the Mbstring extension",
              "homepage": "https://symfony.com",
              "keywords": [
                  "compatibility",
 +                "mbstring",
                  "polyfill",
                  "portable",
                  "shim"
              ],
 +            "support": {
 +                "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1"
 +            },
              "funding": [
                  {
                      "url": "https://symfony.com/sponsor",
                      "type": "tidelift"
                  }
              ],
 -            "time": "2020-05-12T16:47:27+00:00"
 +            "time": "2021-05-27T12:26:48+00:00"
          },
          {
 -            "name": "symfony/polyfill-php73",
 -            "version": "v1.17.0",
 +            "name": "symfony/polyfill-php72",
 +            "version": "v1.23.0",
              "source": {
                  "type": "git",
 -                "url": "https://github.com/symfony/polyfill-php73.git",
 -                "reference": "a760d8964ff79ab9bf057613a5808284ec852ccc"
 +                "url": "https://github.com/symfony/polyfill-php72.git",
 +                "reference": "9a142215a36a3888e30d0a9eeea9766764e96976"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/a760d8964ff79ab9bf057613a5808284ec852ccc",
 -                "reference": "a760d8964ff79ab9bf057613a5808284ec852ccc",
 +                "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976",
 +                "reference": "9a142215a36a3888e30d0a9eeea9766764e96976",
                  "shasum": ""
              },
              "require": {
 -                "php": ">=5.3.3"
 +                "php": ">=7.1"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "1.17-dev"
 +                    "dev-main": "1.23-dev"
 +                },
 +                "thanks": {
 +                    "name": "symfony/polyfill",
 +                    "url": "https://github.com/symfony/polyfill"
                  }
              },
              "autoload": {
                  "psr-4": {
 -                    "Symfony\\Polyfill\\Php73\\": ""
 +                    "Symfony\\Polyfill\\Php72\\": ""
                  },
                  "files": [
                      "bootstrap.php"
 -                ],
 -                "classmap": [
 -                    "Resources/stubs"
                  ]
              },
              "notification-url": "https://packagist.org/downloads/",
                      "homepage": "https://symfony.com/contributors"
                  }
              ],
 -            "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
 +            "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
              "homepage": "https://symfony.com",
              "keywords": [
                  "compatibility",
                  "portable",
                  "shim"
              ],
 +            "support": {
 +                "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0"
 +            },
              "funding": [
                  {
                      "url": "https://symfony.com/sponsor",
                      "type": "tidelift"
                  }
              ],
 -            "time": "2020-05-12T16:47:27+00:00"
 +            "time": "2021-05-27T09:17:38+00:00"
          },
          {
 -            "name": "symfony/process",
 -            "version": "v4.4.8",
 +            "name": "symfony/polyfill-php73",
 +            "version": "v1.23.0",
              "source": {
                  "type": "git",
 -                "url": "https://github.com/symfony/process.git",
 -                "reference": "4b6a9a4013baa65d409153cbb5a895bf093dc7f4"
 +                "url": "https://github.com/symfony/polyfill-php73.git",
 +                "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/symfony/process/zipball/4b6a9a4013baa65d409153cbb5a895bf093dc7f4",
 -                "reference": "4b6a9a4013baa65d409153cbb5a895bf093dc7f4",
 +                "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010",
 +                "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.1.3"
 +                "php": ">=7.1"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "4.4-dev"
 +                    "dev-main": "1.23-dev"
 +                },
 +                "thanks": {
 +                    "name": "symfony/polyfill",
 +                    "url": "https://github.com/symfony/polyfill"
                  }
              },
              "autoload": {
                  "psr-4": {
 -                    "Symfony\\Component\\Process\\": ""
 +                    "Symfony\\Polyfill\\Php73\\": ""
                  },
 -                "exclude-from-classmap": [
 -                    "/Tests/"
 +                "files": [
 +                    "bootstrap.php"
 +                ],
 +                "classmap": [
 +                    "Resources/stubs"
                  ]
              },
              "notification-url": "https://packagist.org/downloads/",
              ],
              "authors": [
                  {
 -                    "name": "Fabien Potencier",
 -                    "email": "fabien@symfony.com"
 +                    "name": "Nicolas Grekas",
 +                    "email": "p@tchwork.com"
                  },
                  {
                      "name": "Symfony Community",
                      "homepage": "https://symfony.com/contributors"
                  }
              ],
 -            "description": "Symfony Process Component",
 +            "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
              "homepage": "https://symfony.com",
 +            "keywords": [
 +                "compatibility",
 +                "polyfill",
 +                "portable",
 +                "shim"
 +            ],
 +            "support": {
 +                "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0"
 +            },
              "funding": [
                  {
                      "url": "https://symfony.com/sponsor",
                      "type": "tidelift"
                  }
              ],
 -            "time": "2020-04-15T15:56:18+00:00"
 +            "time": "2021-02-19T12:13:01+00:00"
          },
          {
 -            "name": "symfony/routing",
 -            "version": "v4.4.8",
 +            "name": "symfony/polyfill-php80",
 +            "version": "v1.23.1",
              "source": {
                  "type": "git",
 -                "url": "https://github.com/symfony/routing.git",
 -                "reference": "67b4e1f99c050cbc310b8f3d0dbdc4b0212c052c"
 +                "url": "https://github.com/symfony/polyfill-php80.git",
 +                "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/symfony/routing/zipball/67b4e1f99c050cbc310b8f3d0dbdc4b0212c052c",
 -                "reference": "67b4e1f99c050cbc310b8f3d0dbdc4b0212c052c",
 +                "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be",
 +                "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.1.3"
 -            },
 -            "conflict": {
 -                "symfony/config": "<4.2",
 -                "symfony/dependency-injection": "<3.4",
 -                "symfony/yaml": "<3.4"
 -            },
 -            "require-dev": {
 -                "doctrine/annotations": "~1.2",
 -                "psr/log": "~1.0",
 -                "symfony/config": "^4.2|^5.0",
 -                "symfony/dependency-injection": "^3.4|^4.0|^5.0",
 -                "symfony/expression-language": "^3.4|^4.0|^5.0",
 -                "symfony/http-foundation": "^3.4|^4.0|^5.0",
 -                "symfony/yaml": "^3.4|^4.0|^5.0"
 -            },
 -            "suggest": {
 -                "doctrine/annotations": "For using the annotation loader",
 -                "symfony/config": "For using the all-in-one router or any loader",
 -                "symfony/expression-language": "For using expression matching",
 -                "symfony/http-foundation": "For using a Symfony Request object",
 -                "symfony/yaml": "For using the YAML loader"
 +                "php": ">=7.1"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "4.4-dev"
 +                    "dev-main": "1.23-dev"
 +                },
 +                "thanks": {
 +                    "name": "symfony/polyfill",
 +                    "url": "https://github.com/symfony/polyfill"
                  }
              },
              "autoload": {
                  "psr-4": {
 -                    "Symfony\\Component\\Routing\\": ""
 +                    "Symfony\\Polyfill\\Php80\\": ""
                  },
 -                "exclude-from-classmap": [
 -                    "/Tests/"
 +                "files": [
 +                    "bootstrap.php"
 +                ],
 +                "classmap": [
 +                    "Resources/stubs"
                  ]
              },
              "notification-url": "https://packagist.org/downloads/",
              ],
              "authors": [
                  {
 -                    "name": "Fabien Potencier",
 -                    "email": "[email protected]"
 +                    "name": "Ion Bazan",
 +                    "email": "[email protected]"
 +                },
 +                {
 +                    "name": "Nicolas Grekas",
 +                    "email": "[email protected]"
                  },
                  {
                      "name": "Symfony Community",
                      "homepage": "https://symfony.com/contributors"
                  }
              ],
 -            "description": "Symfony Routing Component",
 +            "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
              "homepage": "https://symfony.com",
              "keywords": [
 -                "router",
 -                "routing",
 -                "uri",
 -                "url"
 +                "compatibility",
 +                "polyfill",
 +                "portable",
 +                "shim"
              ],
 +            "support": {
 +                "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1"
 +            },
              "funding": [
                  {
                      "url": "https://symfony.com/sponsor",
                      "type": "tidelift"
                  }
              ],
 -            "time": "2020-04-21T19:59:53+00:00"
 +            "time": "2021-07-28T13:41:28+00:00"
          },
          {
 -            "name": "symfony/service-contracts",
 -            "version": "v1.1.8",
 +            "name": "symfony/process",
 +            "version": "v4.4.30",
              "source": {
                  "type": "git",
 -                "url": "https://github.com/symfony/service-contracts.git",
 -                "reference": "ffc7f5692092df31515df2a5ecf3b7302b3ddacf"
 +                "url": "https://github.com/symfony/process.git",
 +                "reference": "13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/symfony/service-contracts/zipball/ffc7f5692092df31515df2a5ecf3b7302b3ddacf",
 -                "reference": "ffc7f5692092df31515df2a5ecf3b7302b3ddacf",
 +                "url": "https://api.github.com/repos/symfony/process/zipball/13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d",
 +                "reference": "13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.1.3",
 -                "psr/container": "^1.0"
 -            },
 -            "suggest": {
 -                "symfony/service-implementation": ""
 +                "php": ">=7.1.3",
 +                "symfony/polyfill-php80": "^1.16"
              },
              "type": "library",
 -            "extra": {
 -                "branch-alias": {
 -                    "dev-master": "1.1-dev"
 -                }
 -            },
              "autoload": {
                  "psr-4": {
 -                    "Symfony\\Contracts\\Service\\": ""
 -                }
 +                    "Symfony\\Component\\Process\\": ""
 +                },
 +                "exclude-from-classmap": [
 +                    "/Tests/"
 +                ]
 +            },
 +            "notification-url": "https://packagist.org/downloads/",
 +            "license": [
 +                "MIT"
 +            ],
 +            "authors": [
 +                {
 +                    "name": "Fabien Potencier",
 +                    "email": "[email protected]"
 +                },
 +                {
 +                    "name": "Symfony Community",
 +                    "homepage": "https://symfony.com/contributors"
 +                }
 +            ],
 +            "description": "Executes commands in sub-processes",
 +            "homepage": "https://symfony.com",
 +            "support": {
 +                "source": "https://github.com/symfony/process/tree/v4.4.30"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://symfony.com/sponsor",
 +                    "type": "custom"
 +                },
 +                {
 +                    "url": "https://github.com/fabpot",
 +                    "type": "github"
 +                },
 +                {
 +                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
 +                    "type": "tidelift"
 +                }
 +            ],
 +            "time": "2021-08-04T20:31:23+00:00"
 +        },
 +        {
 +            "name": "symfony/routing",
 +            "version": "v4.4.30",
 +            "source": {
 +                "type": "git",
 +                "url": "https://github.com/symfony/routing.git",
 +                "reference": "9ddf033927ad9f30ba2bfd167a7b342cafa13e8e"
 +            },
 +            "dist": {
 +                "type": "zip",
 +                "url": "https://api.github.com/repos/symfony/routing/zipball/9ddf033927ad9f30ba2bfd167a7b342cafa13e8e",
 +                "reference": "9ddf033927ad9f30ba2bfd167a7b342cafa13e8e",
 +                "shasum": ""
 +            },
 +            "require": {
 +                "php": ">=7.1.3",
 +                "symfony/polyfill-php80": "^1.16"
 +            },
 +            "conflict": {
 +                "symfony/config": "<4.2",
 +                "symfony/dependency-injection": "<3.4",
 +                "symfony/yaml": "<3.4"
 +            },
 +            "require-dev": {
 +                "doctrine/annotations": "^1.10.4",
 +                "psr/log": "^1|^2|^3",
 +                "symfony/config": "^4.2|^5.0",
 +                "symfony/dependency-injection": "^3.4|^4.0|^5.0",
 +                "symfony/expression-language": "^3.4|^4.0|^5.0",
 +                "symfony/http-foundation": "^3.4|^4.0|^5.0",
 +                "symfony/yaml": "^3.4|^4.0|^5.0"
 +            },
 +            "suggest": {
 +                "doctrine/annotations": "For using the annotation loader",
 +                "symfony/config": "For using the all-in-one router or any loader",
 +                "symfony/expression-language": "For using expression matching",
 +                "symfony/http-foundation": "For using a Symfony Request object",
 +                "symfony/yaml": "For using the YAML loader"
 +            },
 +            "type": "library",
 +            "autoload": {
 +                "psr-4": {
 +                    "Symfony\\Component\\Routing\\": ""
 +                },
 +                "exclude-from-classmap": [
 +                    "/Tests/"
 +                ]
 +            },
 +            "notification-url": "https://packagist.org/downloads/",
 +            "license": [
 +                "MIT"
 +            ],
 +            "authors": [
 +                {
 +                    "name": "Fabien Potencier",
 +                    "email": "[email protected]"
 +                },
 +                {
 +                    "name": "Symfony Community",
 +                    "homepage": "https://symfony.com/contributors"
 +                }
 +            ],
 +            "description": "Maps an HTTP request to a set of configuration variables",
 +            "homepage": "https://symfony.com",
 +            "keywords": [
 +                "router",
 +                "routing",
 +                "uri",
 +                "url"
 +            ],
 +            "support": {
 +                "source": "https://github.com/symfony/routing/tree/v4.4.30"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://symfony.com/sponsor",
 +                    "type": "custom"
 +                },
 +                {
 +                    "url": "https://github.com/fabpot",
 +                    "type": "github"
 +                },
 +                {
 +                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
 +                    "type": "tidelift"
 +                }
 +            ],
 +            "time": "2021-08-04T21:41:01+00:00"
 +        },
 +        {
 +            "name": "symfony/service-contracts",
 +            "version": "v2.4.0",
 +            "source": {
 +                "type": "git",
 +                "url": "https://github.com/symfony/service-contracts.git",
 +                "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb"
 +            },
 +            "dist": {
 +                "type": "zip",
 +                "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb",
 +                "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb",
 +                "shasum": ""
 +            },
 +            "require": {
 +                "php": ">=7.2.5",
 +                "psr/container": "^1.1"
 +            },
 +            "suggest": {
 +                "symfony/service-implementation": ""
 +            },
 +            "type": "library",
 +            "extra": {
 +                "branch-alias": {
 +                    "dev-main": "2.4-dev"
 +                },
 +                "thanks": {
 +                    "name": "symfony/contracts",
 +                    "url": "https://github.com/symfony/contracts"
 +                }
 +            },
 +            "autoload": {
 +                "psr-4": {
 +                    "Symfony\\Contracts\\Service\\": ""
 +                }
              },
              "notification-url": "https://packagist.org/downloads/",
              "license": [
                  "interoperability",
                  "standards"
              ],
 -            "time": "2019-10-14T12:27:06+00:00"
 +            "support": {
 +                "source": "https://github.com/symfony/service-contracts/tree/v2.4.0"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://symfony.com/sponsor",
 +                    "type": "custom"
 +                },
 +                {
 +                    "url": "https://github.com/fabpot",
 +                    "type": "github"
 +                },
 +                {
 +                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
 +                    "type": "tidelift"
 +                }
 +            ],
 +            "time": "2021-04-01T10:43:52+00:00"
          },
          {
              "name": "symfony/translation",
 -            "version": "v4.4.8",
 +            "version": "v4.4.30",
              "source": {
                  "type": "git",
                  "url": "https://github.com/symfony/translation.git",
 -                "reference": "8272bbd2b7e220ef812eba2a2b30068a5c64b191"
 +                "reference": "db0ba1e85280d8ff11e38d53c70f8814d4d740f5"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/symfony/translation/zipball/8272bbd2b7e220ef812eba2a2b30068a5c64b191",
 -                "reference": "8272bbd2b7e220ef812eba2a2b30068a5c64b191",
 +                "url": "https://api.github.com/repos/symfony/translation/zipball/db0ba1e85280d8ff11e38d53c70f8814d4d740f5",
 +                "reference": "db0ba1e85280d8ff11e38d53c70f8814d4d740f5",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.1.3",
 +                "php": ">=7.1.3",
                  "symfony/polyfill-mbstring": "~1.0",
 +                "symfony/polyfill-php80": "^1.16",
                  "symfony/translation-contracts": "^1.1.6|^2"
              },
              "conflict": {
                  "symfony/yaml": "<3.4"
              },
              "provide": {
 -                "symfony/translation-implementation": "1.0"
 +                "symfony/translation-implementation": "1.0|2.0"
              },
              "require-dev": {
 -                "psr/log": "~1.0",
 +                "psr/log": "^1|^2|^3",
                  "symfony/config": "^3.4|^4.0|^5.0",
                  "symfony/console": "^3.4|^4.0|^5.0",
                  "symfony/dependency-injection": "^3.4|^4.0|^5.0",
                  "symfony/yaml": ""
              },
              "type": "library",
 -            "extra": {
 -                "branch-alias": {
 -                    "dev-master": "4.4-dev"
 -                }
 -            },
              "autoload": {
                  "psr-4": {
                      "Symfony\\Component\\Translation\\": ""
                      "homepage": "https://symfony.com/contributors"
                  }
              ],
 -            "description": "Symfony Translation Component",
 +            "description": "Provides tools to internationalize your application",
              "homepage": "https://symfony.com",
 +            "support": {
 +                "source": "https://github.com/symfony/translation/tree/v4.4.30"
 +            },
              "funding": [
                  {
                      "url": "https://symfony.com/sponsor",
                      "type": "tidelift"
                  }
              ],
 -            "time": "2020-04-12T16:45:36+00:00"
 +            "time": "2021-08-26T05:57:13+00:00"
          },
          {
              "name": "symfony/translation-contracts",
 -            "version": "v1.1.7",
 +            "version": "v2.4.0",
              "source": {
                  "type": "git",
                  "url": "https://github.com/symfony/translation-contracts.git",
 -                "reference": "364518c132c95642e530d9b2d217acbc2ccac3e6"
 +                "reference": "95c812666f3e91db75385749fe219c5e494c7f95"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/364518c132c95642e530d9b2d217acbc2ccac3e6",
 -                "reference": "364518c132c95642e530d9b2d217acbc2ccac3e6",
 +                "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/95c812666f3e91db75385749fe219c5e494c7f95",
 +                "reference": "95c812666f3e91db75385749fe219c5e494c7f95",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.1.3"
 +                "php": ">=7.2.5"
              },
              "suggest": {
                  "symfony/translation-implementation": ""
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "1.1-dev"
 +                    "dev-main": "2.4-dev"
 +                },
 +                "thanks": {
 +                    "name": "symfony/contracts",
 +                    "url": "https://github.com/symfony/contracts"
                  }
              },
              "autoload": {
                  "interoperability",
                  "standards"
              ],
 -            "time": "2019-09-17T11:12:18+00:00"
 +            "support": {
 +                "source": "https://github.com/symfony/translation-contracts/tree/v2.4.0"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://symfony.com/sponsor",
 +                    "type": "custom"
 +                },
 +                {
 +                    "url": "https://github.com/fabpot",
 +                    "type": "github"
 +                },
 +                {
 +                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
 +                    "type": "tidelift"
 +                }
 +            ],
 +            "time": "2021-03-23T23:28:01+00:00"
          },
          {
              "name": "symfony/var-dumper",
 -            "version": "v4.4.8",
 +            "version": "v4.4.30",
              "source": {
                  "type": "git",
                  "url": "https://github.com/symfony/var-dumper.git",
 -                "reference": "c587e04ce5d1aa62d534a038f574d9a709e814cf"
 +                "reference": "7f65c44c2ce80d3a0fcdb6385ee0ad535e45660c"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c587e04ce5d1aa62d534a038f574d9a709e814cf",
 -                "reference": "c587e04ce5d1aa62d534a038f574d9a709e814cf",
 +                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/7f65c44c2ce80d3a0fcdb6385ee0ad535e45660c",
 +                "reference": "7f65c44c2ce80d3a0fcdb6385ee0ad535e45660c",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.1.3",
 +                "php": ">=7.1.3",
                  "symfony/polyfill-mbstring": "~1.0",
 -                "symfony/polyfill-php72": "~1.5"
 +                "symfony/polyfill-php72": "~1.5",
 +                "symfony/polyfill-php80": "^1.16"
              },
              "conflict": {
                  "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0",
                  "ext-iconv": "*",
                  "symfony/console": "^3.4|^4.0|^5.0",
                  "symfony/process": "^4.4|^5.0",
 -                "twig/twig": "^1.34|^2.4|^3.0"
 +                "twig/twig": "^1.43|^2.13|^3.0.4"
              },
              "suggest": {
                  "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
                  "Resources/bin/var-dump-server"
              ],
              "type": "library",
 -            "extra": {
 -                "branch-alias": {
 -                    "dev-master": "4.4-dev"
 -                }
 -            },
              "autoload": {
                  "files": [
                      "Resources/functions/dump.php"
                      "homepage": "https://symfony.com/contributors"
                  }
              ],
 -            "description": "Symfony mechanism for exploring and dumping PHP variables",
 +            "description": "Provides mechanisms for walking through any arbitrary PHP variable",
              "homepage": "https://symfony.com",
              "keywords": [
                  "debug",
                  "dump"
              ],
 +            "support": {
 +                "source": "https://github.com/symfony/var-dumper/tree/v4.4.30"
 +            },
              "funding": [
                  {
                      "url": "https://symfony.com/sponsor",
                      "type": "tidelift"
                  }
              ],
 -            "time": "2020-04-12T16:14:02+00:00"
 +            "time": "2021-08-04T20:31:23+00:00"
          },
          {
              "name": "tijsverkoyen/css-to-inline-styles",
 -            "version": "2.2.2",
 +            "version": "2.2.3",
              "source": {
                  "type": "git",
                  "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git",
 -                "reference": "dda2ee426acd6d801d5b7fd1001cde9b5f790e15"
 +                "reference": "b43b05cf43c1b6d849478965062b6ef73e223bb5"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/dda2ee426acd6d801d5b7fd1001cde9b5f790e15",
 -                "reference": "dda2ee426acd6d801d5b7fd1001cde9b5f790e15",
 +                "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/b43b05cf43c1b6d849478965062b6ef73e223bb5",
 +                "reference": "b43b05cf43c1b6d849478965062b6ef73e223bb5",
                  "shasum": ""
              },
              "require": {
                  "ext-dom": "*",
                  "ext-libxml": "*",
 -                "php": "^5.5 || ^7.0",
 +                "php": "^5.5 || ^7.0 || ^8.0",
                  "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0"
              },
              "require-dev": {
 -                "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
 +                "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5"
              },
              "type": "library",
              "extra": {
              ],
              "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.",
              "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles",
 -            "time": "2019-10-24T08:53:34+00:00"
 +            "support": {
 +                "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues",
 +                "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.3"
 +            },
 +            "time": "2020-07-13T06:12:54+00:00"
          },
          {
              "name": "vlucas/phpdotenv",
 -            "version": "v3.6.4",
 +            "version": "v3.6.8",
              "source": {
                  "type": "git",
                  "url": "https://github.com/vlucas/phpdotenv.git",
 -                "reference": "10d3f853fdf1f3a6b3c7ea0c4620d2f699713db5"
 +                "reference": "5e679f7616db829358341e2d5cccbd18773bdab8"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/10d3f853fdf1f3a6b3c7ea0c4620d2f699713db5",
 -                "reference": "10d3f853fdf1f3a6b3c7ea0c4620d2f699713db5",
 +                "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/5e679f7616db829358341e2d5cccbd18773bdab8",
 +                "reference": "5e679f7616db829358341e2d5cccbd18773bdab8",
                  "shasum": ""
              },
              "require": {
                  "php": "^5.4 || ^7.0 || ^8.0",
 -                "phpoption/phpoption": "^1.5",
 -                "symfony/polyfill-ctype": "^1.9"
 +                "phpoption/phpoption": "^1.5.2",
 +                "symfony/polyfill-ctype": "^1.17"
              },
              "require-dev": {
                  "ext-filter": "*",
                  "ext-pcre": "*",
 -                "phpunit/phpunit": "^4.8.35 || ^5.0 || ^6.0 || ^7.0"
 +                "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20"
              },
              "suggest": {
                  "ext-filter": "Required to use the boolean validator.",
                  "env",
                  "environment"
              ],
 +            "support": {
 +                "issues": "https://github.com/vlucas/phpdotenv/issues",
 +                "source": "https://github.com/vlucas/phpdotenv/tree/v3.6.8"
 +            },
              "funding": [
                  {
                      "url": "https://github.com/GrahamCampbell",
                      "type": "tidelift"
                  }
              ],
 -            "time": "2020-05-02T13:46:13+00:00"
 +            "time": "2021-01-20T14:39:46+00:00"
          }
      ],
      "packages-dev": [
          {
              "name": "barryvdh/laravel-debugbar",
 -            "version": "v3.3.3",
 +            "version": "v3.6.2",
              "source": {
                  "type": "git",
                  "url": "https://github.com/barryvdh/laravel-debugbar.git",
 -                "reference": "57f2219f6d9efe41ed1bc880d86701c52f261bf5"
 +                "reference": "70b89754913fd89fef16d0170a91dbc2a5cd633a"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/57f2219f6d9efe41ed1bc880d86701c52f261bf5",
 -                "reference": "57f2219f6d9efe41ed1bc880d86701c52f261bf5",
 +                "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/70b89754913fd89fef16d0170a91dbc2a5cd633a",
 +                "reference": "70b89754913fd89fef16d0170a91dbc2a5cd633a",
                  "shasum": ""
              },
              "require": {
 -                "illuminate/routing": "^5.5|^6|^7",
 -                "illuminate/session": "^5.5|^6|^7",
 -                "illuminate/support": "^5.5|^6|^7",
 -                "maximebf/debugbar": "^1.15.1",
 -                "php": ">=7.0",
 -                "symfony/debug": "^3|^4|^5",
 -                "symfony/finder": "^3|^4|^5"
 +                "illuminate/routing": "^6|^7|^8",
 +                "illuminate/session": "^6|^7|^8",
 +                "illuminate/support": "^6|^7|^8",
 +                "maximebf/debugbar": "^1.16.3",
 +                "php": ">=7.2",
 +                "symfony/debug": "^4.3|^5",
 +                "symfony/finder": "^4.3|^5"
              },
              "require-dev": {
 -                "laravel/framework": "5.5.x"
 +                "mockery/mockery": "^1.3.3",
 +                "orchestra/testbench-dusk": "^4|^5|^6",
 +                "phpunit/phpunit": "^8.5|^9.0",
 +                "squizlabs/php_codesniffer": "^3.5"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "3.2-dev"
 +                    "dev-master": "3.5-dev"
                  },
                  "laravel": {
                      "providers": [
                  "profiler",
                  "webprofiler"
              ],
 +            "support": {
 +                "issues": "https://github.com/barryvdh/laravel-debugbar/issues",
 +                "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.6.2"
 +            },
              "funding": [
 +                {
 +                    "url": "https://fruitcake.nl",
 +                    "type": "custom"
 +                },
                  {
                      "url": "https://github.com/barryvdh",
                      "type": "github"
                  }
              ],
 -            "time": "2020-05-05T10:53:32+00:00"
 +            "time": "2021-06-14T14:29:26+00:00"
          },
          {
              "name": "barryvdh/laravel-ide-helper",
 -            "version": "v2.7.0",
 +            "version": "v2.8.2",
              "source": {
                  "type": "git",
                  "url": "https://github.com/barryvdh/laravel-ide-helper.git",
 -                "reference": "5f677edc14bdcfdcac36633e6eea71b2728a4dbc"
 +                "reference": "5515cabea39b9cf55f98980d0f269dc9d85cfcca"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/5f677edc14bdcfdcac36633e6eea71b2728a4dbc",
 -                "reference": "5f677edc14bdcfdcac36633e6eea71b2728a4dbc",
 +                "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/5515cabea39b9cf55f98980d0f269dc9d85cfcca",
 +                "reference": "5515cabea39b9cf55f98980d0f269dc9d85cfcca",
                  "shasum": ""
              },
              "require": {
                  "barryvdh/reflection-docblock": "^2.0.6",
 -                "composer/composer": "^1.6",
 +                "composer/composer": "^1.6 || ^2",
                  "doctrine/dbal": "~2.3",
 -                "illuminate/console": "^5.5|^6|^7",
 -                "illuminate/filesystem": "^5.5|^6|^7",
 -                "illuminate/support": "^5.5|^6|^7",
 -                "php": ">=7.2"
 +                "ext-json": "*",
 +                "illuminate/console": "^6 || ^7 || ^8",
 +                "illuminate/filesystem": "^6 || ^7 || ^8",
 +                "illuminate/support": "^6 || ^7 || ^8",
 +                "php": ">=7.2",
 +                "phpdocumentor/type-resolver": "^1.1.0"
              },
              "require-dev": {
 -                "illuminate/config": "^5.5|^6|^7",
 -                "illuminate/view": "^5.5|^6|^7",
 -                "mockery/mockery": "^1.3",
 -                "orchestra/testbench": "^3|^4|^5",
 -                "phpro/grumphp": "^0.17.1",
 -                "squizlabs/php_codesniffer": "^3"
 +                "ext-pdo_sqlite": "*",
 +                "friendsofphp/php-cs-fixer": "^2",
 +                "illuminate/config": "^6 || ^7 || ^8",
 +                "illuminate/view": "^6 || ^7 || ^8",
 +                "mockery/mockery": "^1.3.3",
 +                "orchestra/testbench": "^4 || ^5 || ^6",
 +                "phpunit/phpunit": "^8.5 || ^9",
 +                "spatie/phpunit-snapshot-assertions": "^1.4 || ^2.2 || ^3 || ^4",
 +                "vimeo/psalm": "^3.12"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "2.6-dev"
 +                    "dev-master": "2.8-dev"
                  },
                  "laravel": {
                      "providers": [
                  "phpstorm",
                  "sublime"
              ],
 +            "support": {
 +                "issues": "https://github.com/barryvdh/laravel-ide-helper/issues",
 +                "source": "https://github.com/barryvdh/laravel-ide-helper/tree/v2.8.2"
 +            },
              "funding": [
                  {
                      "url": "https://github.com/barryvdh",
                      "type": "github"
                  }
              ],
 -            "time": "2020-04-22T09:57:26+00:00"
 +            "time": "2020-12-06T08:55:05+00:00"
          },
          {
              "name": "barryvdh/reflection-docblock",
                      "email": "[email protected]"
                  }
              ],
 +            "support": {
 +                "source": "https://github.com/barryvdh/ReflectionDocBlock/tree/v2.0.6"
 +            },
              "time": "2018-12-13T10:34:14+00:00"
          },
          {
              "name": "composer/ca-bundle",
 -            "version": "1.2.7",
 +            "version": "1.2.10",
              "source": {
                  "type": "git",
                  "url": "https://github.com/composer/ca-bundle.git",
 -                "reference": "95c63ab2117a72f48f5a55da9740a3273d45b7fd"
 +                "reference": "9fdb22c2e97a614657716178093cd1da90a64aa8"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/composer/ca-bundle/zipball/95c63ab2117a72f48f5a55da9740a3273d45b7fd",
 -                "reference": "95c63ab2117a72f48f5a55da9740a3273d45b7fd",
 +                "url": "https://api.github.com/repos/composer/ca-bundle/zipball/9fdb22c2e97a614657716178093cd1da90a64aa8",
 +                "reference": "9fdb22c2e97a614657716178093cd1da90a64aa8",
                  "shasum": ""
              },
              "require": {
                  "php": "^5.3.2 || ^7.0 || ^8.0"
              },
              "require-dev": {
 -                "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8",
 +                "phpstan/phpstan": "^0.12.55",
                  "psr/log": "^1.0",
 +                "symfony/phpunit-bridge": "^4.2 || ^5",
                  "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "1.x-dev"
 +                    "dev-main": "1.x-dev"
                  }
              },
              "autoload": {
                  "ssl",
                  "tls"
              ],
 +            "support": {
 +                "irc": "irc://irc.freenode.org/composer",
 +                "issues": "https://github.com/composer/ca-bundle/issues",
 +                "source": "https://github.com/composer/ca-bundle/tree/1.2.10"
 +            },
              "funding": [
                  {
                      "url": "https://packagist.com",
                      "type": "custom"
                  },
 +                {
 +                    "url": "https://github.com/composer",
 +                    "type": "github"
 +                },
                  {
                      "url": "https://tidelift.com/funding/github/packagist/composer/composer",
                      "type": "tidelift"
                  }
              ],
 -            "time": "2020-04-08T08:27:21+00:00"
 +            "time": "2021-06-07T13:58:28+00:00"
          },
          {
              "name": "composer/composer",
 -            "version": "1.10.6",
 +            "version": "2.1.8",
              "source": {
                  "type": "git",
                  "url": "https://github.com/composer/composer.git",
 -                "reference": "be81b9c4735362c26876bdbfd3b5bc7e7f711c88"
 +                "reference": "24d38e9686092de05214cafa187dc282a5d89497"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/composer/composer/zipball/be81b9c4735362c26876bdbfd3b5bc7e7f711c88",
 -                "reference": "be81b9c4735362c26876bdbfd3b5bc7e7f711c88",
 +                "url": "https://api.github.com/repos/composer/composer/zipball/24d38e9686092de05214cafa187dc282a5d89497",
 +                "reference": "24d38e9686092de05214cafa187dc282a5d89497",
                  "shasum": ""
              },
              "require": {
                  "composer/ca-bundle": "^1.0",
 -                "composer/semver": "^1.0",
 +                "composer/metadata-minifier": "^1.0",
 +                "composer/semver": "^3.0",
                  "composer/spdx-licenses": "^1.2",
 -                "composer/xdebug-handler": "^1.1",
 -                "justinrainbow/json-schema": "^3.0 || ^4.0 || ^5.0",
 -                "php": "^5.3.2 || ^7.0",
 +                "composer/xdebug-handler": "^2.0",
 +                "justinrainbow/json-schema": "^5.2.11",
 +                "php": "^5.3.2 || ^7.0 || ^8.0",
                  "psr/log": "^1.0",
 +                "react/promise": "^1.2 || ^2.7",
                  "seld/jsonlint": "^1.4",
                  "seld/phar-utils": "^1.0",
 -                "symfony/console": "^2.7 || ^3.0 || ^4.0 || ^5.0",
 -                "symfony/filesystem": "^2.7 || ^3.0 || ^4.0 || ^5.0",
 -                "symfony/finder": "^2.7 || ^3.0 || ^4.0 || ^5.0",
 -                "symfony/process": "^2.7 || ^3.0 || ^4.0 || ^5.0"
 -            },
 -            "conflict": {
 -                "symfony/console": "2.8.38",
 -                "symfony/phpunit-bridge": "3.4.40"
 +                "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0",
 +                "symfony/filesystem": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0",
 +                "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0",
 +                "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0"
              },
              "require-dev": {
                  "phpspec/prophecy": "^1.10",
 -                "symfony/phpunit-bridge": "^3.4"
 +                "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0"
              },
              "suggest": {
                  "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages",
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "1.10-dev"
 +                    "dev-master": "2.1-dev"
                  }
              },
              "autoload": {
                  {
                      "name": "Nils Adermann",
                      "email": "[email protected]",
 -                    "homepage": "http://www.naderman.de"
 +                    "homepage": "https://www.naderman.de"
                  },
                  {
                      "name": "Jordi Boggiano",
                      "email": "[email protected]",
 -                    "homepage": "http://seld.be"
 +                    "homepage": "https://seld.be"
                  }
              ],
              "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.",
                  "dependency",
                  "package"
              ],
 +            "support": {
 +                "irc": "ircs://irc.libera.chat:6697/composer",
 +                "issues": "https://github.com/composer/composer/issues",
 +                "source": "https://github.com/composer/composer/tree/2.1.8"
 +            },
              "funding": [
                  {
                      "url": "https://packagist.com",
                      "type": "custom"
                  },
 +                {
 +                    "url": "https://github.com/composer",
 +                    "type": "github"
 +                },
                  {
                      "url": "https://tidelift.com/funding/github/packagist/composer/composer",
                      "type": "tidelift"
                  }
              ],
 -            "time": "2020-05-06T08:28:10+00:00"
 +            "time": "2021-09-15T11:55:15+00:00"
          },
          {
 -            "name": "composer/semver",
 -            "version": "1.5.1",
 +            "name": "composer/metadata-minifier",
 +            "version": "1.0.0",
              "source": {
                  "type": "git",
 -                "url": "https://github.com/composer/semver.git",
 -                "reference": "c6bea70230ef4dd483e6bbcab6005f682ed3a8de"
 +                "url": "https://github.com/composer/metadata-minifier.git",
 +                "reference": "c549d23829536f0d0e984aaabbf02af91f443207"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/composer/semver/zipball/c6bea70230ef4dd483e6bbcab6005f682ed3a8de",
 -                "reference": "c6bea70230ef4dd483e6bbcab6005f682ed3a8de",
 +                "url": "https://api.github.com/repos/composer/metadata-minifier/zipball/c549d23829536f0d0e984aaabbf02af91f443207",
 +                "reference": "c549d23829536f0d0e984aaabbf02af91f443207",
                  "shasum": ""
              },
              "require": {
 -                "php": "^5.3.2 || ^7.0"
 +                "php": "^5.3.2 || ^7.0 || ^8.0"
              },
              "require-dev": {
 -                "phpunit/phpunit": "^4.5 || ^5.0.5"
 +                "composer/composer": "^2",
 +                "phpstan/phpstan": "^0.12.55",
 +                "symfony/phpunit-bridge": "^4.2 || ^5"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "1.x-dev"
 +                    "dev-main": "1.x-dev"
                  }
              },
              "autoload": {
                  "psr-4": {
 -                    "Composer\\Semver\\": "src"
 +                    "Composer\\MetadataMinifier\\": "src"
                  }
              },
              "notification-url": "https://packagist.org/downloads/",
                  "MIT"
              ],
              "authors": [
 -                {
 -                    "name": "Nils Adermann",
 -                    "email": "[email protected]",
 -                    "homepage": "http://www.naderman.de"
 -                },
                  {
                      "name": "Jordi Boggiano",
                      "email": "[email protected]",
                      "homepage": "http://seld.be"
 -                },
 -                {
 -                    "name": "Rob Bast",
 -                    "email": "[email protected]",
 -                    "homepage": "http://robbast.nl"
                  }
              ],
 -            "description": "Semver library that offers utilities, version constraint parsing and validation.",
 +            "description": "Small utility library that handles metadata minification and expansion.",
              "keywords": [
 -                "semantic",
 -                "semver",
 -                "validation",
 -                "versioning"
 +                "composer",
 +                "compression"
 +            ],
 +            "support": {
 +                "issues": "https://github.com/composer/metadata-minifier/issues",
 +                "source": "https://github.com/composer/metadata-minifier/tree/1.0.0"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://packagist.com",
 +                    "type": "custom"
 +                },
 +                {
 +                    "url": "https://github.com/composer",
 +                    "type": "github"
 +                },
 +                {
 +                    "url": "https://tidelift.com/funding/github/packagist/composer/composer",
 +                    "type": "tidelift"
 +                }
              ],
 -            "time": "2020-01-13T12:06:48+00:00"
 +            "time": "2021-04-07T13:37:33+00:00"
          },
          {
 -            "name": "composer/spdx-licenses",
 -            "version": "1.5.3",
 +            "name": "composer/semver",
 +            "version": "3.2.5",
              "source": {
                  "type": "git",
 -                "url": "https://github.com/composer/spdx-licenses.git",
 -                "reference": "0c3e51e1880ca149682332770e25977c70cf9dae"
 +                "url": "https://github.com/composer/semver.git",
 +                "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/0c3e51e1880ca149682332770e25977c70cf9dae",
 -                "reference": "0c3e51e1880ca149682332770e25977c70cf9dae",
 +                "url": "https://api.github.com/repos/composer/semver/zipball/31f3ea725711245195f62e54ffa402d8ef2fdba9",
 +                "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9",
                  "shasum": ""
              },
              "require": {
                  "php": "^5.3.2 || ^7.0 || ^8.0"
              },
              "require-dev": {
 -                "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7"
 +                "phpstan/phpstan": "^0.12.54",
 +                "symfony/phpunit-bridge": "^4.2 || ^5"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "1.x-dev"
 +                    "dev-main": "3.x-dev"
                  }
              },
              "autoload": {
                  "psr-4": {
 -                    "Composer\\Spdx\\": "src"
 +                    "Composer\\Semver\\": "src"
                  }
              },
              "notification-url": "https://packagist.org/downloads/",
                      "homepage": "http://robbast.nl"
                  }
              ],
 -            "description": "SPDX licenses list and validation library.",
 +            "description": "Semver library that offers utilities, version constraint parsing and validation.",
 +            "keywords": [
 +                "semantic",
 +                "semver",
 +                "validation",
 +                "versioning"
 +            ],
 +            "support": {
 +                "irc": "irc://irc.freenode.org/composer",
 +                "issues": "https://github.com/composer/semver/issues",
 +                "source": "https://github.com/composer/semver/tree/3.2.5"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://packagist.com",
 +                    "type": "custom"
 +                },
 +                {
 +                    "url": "https://github.com/composer",
 +                    "type": "github"
 +                },
 +                {
 +                    "url": "https://tidelift.com/funding/github/packagist/composer/composer",
 +                    "type": "tidelift"
 +                }
 +            ],
 +            "time": "2021-05-24T12:41:47+00:00"
 +        },
 +        {
 +            "name": "composer/spdx-licenses",
 +            "version": "1.5.5",
 +            "source": {
 +                "type": "git",
 +                "url": "https://github.com/composer/spdx-licenses.git",
 +                "reference": "de30328a7af8680efdc03e396aad24befd513200"
 +            },
 +            "dist": {
 +                "type": "zip",
 +                "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/de30328a7af8680efdc03e396aad24befd513200",
 +                "reference": "de30328a7af8680efdc03e396aad24befd513200",
 +                "shasum": ""
 +            },
 +            "require": {
 +                "php": "^5.3.2 || ^7.0 || ^8.0"
 +            },
 +            "require-dev": {
 +                "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7"
 +            },
 +            "type": "library",
 +            "extra": {
 +                "branch-alias": {
 +                    "dev-main": "1.x-dev"
 +                }
 +            },
 +            "autoload": {
 +                "psr-4": {
 +                    "Composer\\Spdx\\": "src"
 +                }
 +            },
 +            "notification-url": "https://packagist.org/downloads/",
 +            "license": [
 +                "MIT"
 +            ],
 +            "authors": [
 +                {
 +                    "name": "Nils Adermann",
 +                    "email": "[email protected]",
 +                    "homepage": "http://www.naderman.de"
 +                },
 +                {
 +                    "name": "Jordi Boggiano",
 +                    "email": "[email protected]",
 +                    "homepage": "http://seld.be"
 +                },
 +                {
 +                    "name": "Rob Bast",
 +                    "email": "[email protected]",
 +                    "homepage": "http://robbast.nl"
 +                }
 +            ],
 +            "description": "SPDX licenses list and validation library.",
              "keywords": [
                  "license",
                  "spdx",
                  "validator"
              ],
 -            "time": "2020-02-14T07:44:31+00:00"
 +            "support": {
 +                "irc": "irc://irc.freenode.org/composer",
 +                "issues": "https://github.com/composer/spdx-licenses/issues",
 +                "source": "https://github.com/composer/spdx-licenses/tree/1.5.5"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://packagist.com",
 +                    "type": "custom"
 +                },
 +                {
 +                    "url": "https://github.com/composer",
 +                    "type": "github"
 +                },
 +                {
 +                    "url": "https://tidelift.com/funding/github/packagist/composer/composer",
 +                    "type": "tidelift"
 +                }
 +            ],
 +            "time": "2020-12-03T16:04:16+00:00"
          },
          {
              "name": "composer/xdebug-handler",
 -            "version": "1.4.1",
 +            "version": "2.0.2",
              "source": {
                  "type": "git",
                  "url": "https://github.com/composer/xdebug-handler.git",
 -                "reference": "1ab9842d69e64fb3a01be6b656501032d1b78cb7"
 +                "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/1ab9842d69e64fb3a01be6b656501032d1b78cb7",
 -                "reference": "1ab9842d69e64fb3a01be6b656501032d1b78cb7",
 +                "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/84674dd3a7575ba617f5a76d7e9e29a7d3891339",
 +                "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339",
                  "shasum": ""
              },
              "require": {
                  "php": "^5.3.2 || ^7.0 || ^8.0",
 -                "psr/log": "^1.0"
 +                "psr/log": "^1 || ^2 || ^3"
              },
              "require-dev": {
 -                "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8"
 +                "phpstan/phpstan": "^0.12.55",
 +                "symfony/phpunit-bridge": "^4.2 || ^5"
              },
              "type": "library",
              "autoload": {
                  "Xdebug",
                  "performance"
              ],
 -            "time": "2020-03-01T12:26:26+00:00"
 +            "support": {
 +                "irc": "irc://irc.freenode.org/composer",
 +                "issues": "https://github.com/composer/xdebug-handler/issues",
 +                "source": "https://github.com/composer/xdebug-handler/tree/2.0.2"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://packagist.com",
 +                    "type": "custom"
 +                },
 +                {
 +                    "url": "https://github.com/composer",
 +                    "type": "github"
 +                },
 +                {
 +                    "url": "https://tidelift.com/funding/github/packagist/composer/composer",
 +                    "type": "tidelift"
 +                }
 +            ],
 +            "time": "2021-07-31T17:03:58+00:00"
          },
          {
              "name": "doctrine/instantiator",
 -            "version": "1.3.0",
 +            "version": "1.4.0",
              "source": {
                  "type": "git",
                  "url": "https://github.com/doctrine/instantiator.git",
 -                "reference": "ae466f726242e637cebdd526a7d991b9433bacf1"
 +                "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/doctrine/instantiator/zipball/ae466f726242e637cebdd526a7d991b9433bacf1",
 -                "reference": "ae466f726242e637cebdd526a7d991b9433bacf1",
 +                "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b",
 +                "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.1"
 +                "php": "^7.1 || ^8.0"
              },
              "require-dev": {
 -                "doctrine/coding-standard": "^6.0",
 +                "doctrine/coding-standard": "^8.0",
                  "ext-pdo": "*",
                  "ext-phar": "*",
 -                "phpbench/phpbench": "^0.13",
 -                "phpstan/phpstan-phpunit": "^0.11",
 -                "phpstan/phpstan-shim": "^0.11",
 -                "phpunit/phpunit": "^7.0"
 +                "phpbench/phpbench": "^0.13 || 1.0.0-alpha2",
 +                "phpstan/phpstan": "^0.12",
 +                "phpstan/phpstan-phpunit": "^0.12",
 +                "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
              },
              "type": "library",
 -            "extra": {
 -                "branch-alias": {
 -                    "dev-master": "1.2.x-dev"
 -                }
 -            },
              "autoload": {
                  "psr-4": {
                      "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
                  {
                      "name": "Marco Pivetta",
                      "email": "[email protected]",
 -                    "homepage": "http://ocramius.github.com/"
 +                    "homepage": "https://ocramius.github.io/"
                  }
              ],
              "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
                  "constructor",
                  "instantiate"
              ],
 -            "time": "2019-10-21T16:45:58+00:00"
 +            "support": {
 +                "issues": "https://github.com/doctrine/instantiator/issues",
 +                "source": "https://github.com/doctrine/instantiator/tree/1.4.0"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://www.doctrine-project.org/sponsorship.html",
 +                    "type": "custom"
 +                },
 +                {
 +                    "url": "https://www.patreon.com/phpdoctrine",
 +                    "type": "patreon"
 +                },
 +                {
 +                    "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
 +                    "type": "tidelift"
 +                }
 +            ],
 +            "time": "2020-11-10T18:47:58+00:00"
          },
          {
 -            "name": "fzaninotto/faker",
 -            "version": "v1.9.1",
 +            "name": "fakerphp/faker",
 +            "version": "v1.16.0",
              "source": {
                  "type": "git",
 -                "url": "https://github.com/fzaninotto/Faker.git",
 -                "reference": "fc10d778e4b84d5bd315dad194661e091d307c6f"
 +                "url": "https://github.com/FakerPHP/Faker.git",
 +                "reference": "271d384d216e5e5c468a6b28feedf95d49f83b35"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/fc10d778e4b84d5bd315dad194661e091d307c6f",
 -                "reference": "fc10d778e4b84d5bd315dad194661e091d307c6f",
 +                "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/271d384d216e5e5c468a6b28feedf95d49f83b35",
 +                "reference": "271d384d216e5e5c468a6b28feedf95d49f83b35",
                  "shasum": ""
              },
              "require": {
 -                "php": "^5.3.3 || ^7.0"
 +                "php": "^7.1 || ^8.0",
 +                "psr/container": "^1.0 || ^2.0",
 +                "symfony/deprecation-contracts": "^2.2"
 +            },
 +            "conflict": {
 +                "fzaninotto/faker": "*"
              },
              "require-dev": {
 +                "bamarni/composer-bin-plugin": "^1.4.1",
                  "ext-intl": "*",
 -                "phpunit/phpunit": "^4.8.35 || ^5.7",
 -                "squizlabs/php_codesniffer": "^2.9.2"
 +                "symfony/phpunit-bridge": "^4.4 || ^5.2"
 +            },
 +            "suggest": {
 +                "ext-curl": "Required by Faker\\Provider\\Image to download images.",
 +                "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.",
 +                "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.",
 +                "ext-mbstring": "Required for multibyte Unicode string functionality."
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "1.9-dev"
 +                    "dev-main": "v1.16-dev"
                  }
              },
              "autoload": {
                  "faker",
                  "fixtures"
              ],
 -            "time": "2019-12-12T13:22:17+00:00"
 +            "support": {
 +                "issues": "https://github.com/FakerPHP/Faker/issues",
 +                "source": "https://github.com/FakerPHP/Faker/tree/v1.16.0"
 +            },
 +            "time": "2021-09-06T14:53:37+00:00"
          },
          {
              "name": "hamcrest/hamcrest-php",
 -            "version": "v2.0.0",
 +            "version": "v2.0.1",
              "source": {
                  "type": "git",
                  "url": "https://github.com/hamcrest/hamcrest-php.git",
 -                "reference": "776503d3a8e85d4f9a1148614f95b7a608b046ad"
 +                "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/776503d3a8e85d4f9a1148614f95b7a608b046ad",
 -                "reference": "776503d3a8e85d4f9a1148614f95b7a608b046ad",
 +                "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3",
 +                "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3",
                  "shasum": ""
              },
              "require": {
 -                "php": "^5.3|^7.0"
 +                "php": "^5.3|^7.0|^8.0"
              },
              "replace": {
                  "cordoval/hamcrest-php": "*",
                  "kodova/hamcrest-php": "*"
              },
              "require-dev": {
 -                "phpunit/php-file-iterator": "1.3.3",
 -                "phpunit/phpunit": "~4.0",
 -                "satooshi/php-coveralls": "^1.0"
 +                "phpunit/php-file-iterator": "^1.4 || ^2.0",
 +                "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "2.0-dev"
 +                    "dev-master": "2.1-dev"
                  }
              },
              "autoload": {
              },
              "notification-url": "https://packagist.org/downloads/",
              "license": [
 -                "BSD"
 +                "BSD-3-Clause"
              ],
              "description": "This is the PHP port of Hamcrest Matchers",
              "keywords": [
                  "test"
              ],
 -            "time": "2016-01-20T08:20:44+00:00"
 +            "support": {
 +                "issues": "https://github.com/hamcrest/hamcrest-php/issues",
 +                "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1"
 +            },
 +            "time": "2020-07-09T08:09:16+00:00"
          },
          {
              "name": "justinrainbow/json-schema",
 -            "version": "5.2.9",
 +            "version": "5.2.11",
              "source": {
                  "type": "git",
                  "url": "https://github.com/justinrainbow/json-schema.git",
 -                "reference": "44c6787311242a979fa15c704327c20e7221a0e4"
 +                "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/44c6787311242a979fa15c704327c20e7221a0e4",
 -                "reference": "44c6787311242a979fa15c704327c20e7221a0e4",
 +                "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ab6744b7296ded80f8cc4f9509abbff393399aa",
 +                "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa",
                  "shasum": ""
              },
              "require": {
                  "json",
                  "schema"
              ],
 -            "time": "2019-09-25T14:49:45+00:00"
 -        },
 -        {
 -            "name": "laravel/browser-kit-testing",
 -            "version": "v5.1.3",
 -            "source": {
 -                "type": "git",
 -                "url": "https://github.com/laravel/browser-kit-testing.git",
 -                "reference": "cb0cf22cf38fe8796842adc8b9ad550ded2a1377"
 -            },
 -            "dist": {
 -                "type": "zip",
 -                "url": "https://api.github.com/repos/laravel/browser-kit-testing/zipball/cb0cf22cf38fe8796842adc8b9ad550ded2a1377",
 -                "reference": "cb0cf22cf38fe8796842adc8b9ad550ded2a1377",
 -                "shasum": ""
 -            },
 -            "require": {
 -                "ext-dom": "*",
 -                "ext-json": "*",
 -                "illuminate/contracts": "~5.7.0|~5.8.0|^6.0",
 -                "illuminate/database": "~5.7.0|~5.8.0|^6.0",
 -                "illuminate/http": "~5.7.0|~5.8.0|^6.0",
 -                "illuminate/support": "~5.7.0|~5.8.0|^6.0",
 -                "mockery/mockery": "^1.0",
 -                "php": ">=7.1.3",
 -                "phpunit/phpunit": "^7.0|^8.0",
 -                "symfony/console": "^4.2",
 -                "symfony/css-selector": "^4.2",
 -                "symfony/dom-crawler": "^4.2",
 -                "symfony/http-foundation": "^4.2",
 -                "symfony/http-kernel": "^4.2"
 -            },
 -            "require-dev": {
 -                "laravel/framework": "~5.7.0|~5.8.0|^6.0"
 -            },
 -            "type": "library",
 -            "extra": {
 -                "branch-alias": {
 -                    "dev-master": "5.0-dev"
 -                }
 -            },
 -            "autoload": {
 -                "psr-4": {
 -                    "Laravel\\BrowserKitTesting\\": "src/"
 -                }
 +            "support": {
 +                "issues": "https://github.com/justinrainbow/json-schema/issues",
 +                "source": "https://github.com/justinrainbow/json-schema/tree/5.2.11"
              },
 -            "notification-url": "https://packagist.org/downloads/",
 -            "license": [
 -                "MIT"
 -            ],
 -            "authors": [
 -                {
 -                    "name": "Taylor Otwell",
 -                    "email": "[email protected]"
 -                }
 -            ],
 -            "description": "Provides backwards compatibility for BrowserKit testing in the latest Laravel release.",
 -            "keywords": [
 -                "laravel",
 -                "testing"
 -            ],
 -            "time": "2019-07-30T14:57:44+00:00"
 +            "time": "2021-07-22T09:24:00+00:00"
          },
          {
              "name": "maximebf/debugbar",
 -            "version": "v1.16.3",
 +            "version": "v1.17.1",
              "source": {
                  "type": "git",
                  "url": "https://github.com/maximebf/php-debugbar.git",
 -                "reference": "1a1605b8e9bacb34cc0c6278206d699772e1d372"
 +                "reference": "0a3532556be0145603f8a9de23e76dc28eed7054"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/1a1605b8e9bacb34cc0c6278206d699772e1d372",
 -                "reference": "1a1605b8e9bacb34cc0c6278206d699772e1d372",
 +                "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/0a3532556be0145603f8a9de23e76dc28eed7054",
 +                "reference": "0a3532556be0145603f8a9de23e76dc28eed7054",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.1",
 +                "php": "^7.1|^8",
                  "psr/log": "^1.0",
                  "symfony/var-dumper": "^2.6|^3|^4|^5"
              },
              "require-dev": {
 -                "phpunit/phpunit": "^5"
 +                "phpunit/phpunit": "^7.5.20 || ^9.4.2"
              },
              "suggest": {
                  "kriswallsmith/assetic": "The best way to manage assets",
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "1.16-dev"
 +                    "dev-master": "1.17-dev"
                  }
              },
              "autoload": {
                  "debug",
                  "debugbar"
              ],
 -            "time": "2020-05-06T07:06:27+00:00"
 +            "support": {
 +                "issues": "https://github.com/maximebf/php-debugbar/issues",
 +                "source": "https://github.com/maximebf/php-debugbar/tree/v1.17.1"
 +            },
 +            "time": "2021-08-01T09:19:02+00:00"
          },
          {
              "name": "mockery/mockery",
 -            "version": "1.3.1",
 +            "version": "1.4.4",
              "source": {
                  "type": "git",
                  "url": "https://github.com/mockery/mockery.git",
 -                "reference": "f69bbde7d7a75d6b2862d9ca8fab1cd28014b4be"
 +                "reference": "e01123a0e847d52d186c5eb4b9bf58b0c6d00346"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/mockery/mockery/zipball/f69bbde7d7a75d6b2862d9ca8fab1cd28014b4be",
 -                "reference": "f69bbde7d7a75d6b2862d9ca8fab1cd28014b4be",
 +                "url": "https://api.github.com/repos/mockery/mockery/zipball/e01123a0e847d52d186c5eb4b9bf58b0c6d00346",
 +                "reference": "e01123a0e847d52d186c5eb4b9bf58b0c6d00346",
                  "shasum": ""
              },
              "require": {
 -                "hamcrest/hamcrest-php": "~2.0",
 +                "hamcrest/hamcrest-php": "^2.0.1",
                  "lib-pcre": ">=7.0",
 -                "php": ">=5.6.0"
 +                "php": "^7.3 || ^8.0"
 +            },
 +            "conflict": {
 +                "phpunit/phpunit": "<8.0"
              },
              "require-dev": {
 -                "phpunit/phpunit": "~5.7.10|~6.5|~7.0|~8.0"
 +                "phpunit/phpunit": "^8.5 || ^9.3"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "1.3.x-dev"
 +                    "dev-master": "1.4.x-dev"
                  }
              },
              "autoload": {
                  "test double",
                  "testing"
              ],
 -            "time": "2019-12-26T09:49:15+00:00"
 +            "support": {
 +                "issues": "https://github.com/mockery/mockery/issues",
 +                "source": "https://github.com/mockery/mockery/tree/1.4.4"
 +            },
 +            "time": "2021-09-13T15:28:59+00:00"
          },
          {
              "name": "myclabs/deep-copy",
 -            "version": "1.9.5",
 +            "version": "1.10.2",
              "source": {
                  "type": "git",
                  "url": "https://github.com/myclabs/DeepCopy.git",
 -                "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef"
 +                "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/b2c28789e80a97badd14145fda39b545d83ca3ef",
 -                "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef",
 +                "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220",
 +                "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.1"
 +                "php": "^7.1 || ^8.0"
              },
              "replace": {
                  "myclabs/deep-copy": "self.version"
                  "object",
                  "object graph"
              ],
 -            "time": "2020-01-17T21:11:47+00:00"
 +            "support": {
 +                "issues": "https://github.com/myclabs/DeepCopy/issues",
 +                "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
 +                    "type": "tidelift"
 +                }
 +            ],
 +            "time": "2020-11-13T09:40:50+00:00"
 +        },
 +        {
 +            "name": "nikic/php-parser",
 +            "version": "v4.12.0",
 +            "source": {
 +                "type": "git",
 +                "url": "https://github.com/nikic/PHP-Parser.git",
 +                "reference": "6608f01670c3cc5079e18c1dab1104e002579143"
 +            },
 +            "dist": {
 +                "type": "zip",
 +                "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6608f01670c3cc5079e18c1dab1104e002579143",
 +                "reference": "6608f01670c3cc5079e18c1dab1104e002579143",
 +                "shasum": ""
 +            },
 +            "require": {
 +                "ext-tokenizer": "*",
 +                "php": ">=7.0"
 +            },
 +            "require-dev": {
 +                "ircmaxell/php-yacc": "^0.0.7",
 +                "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
 +            },
 +            "bin": [
 +                "bin/php-parse"
 +            ],
 +            "type": "library",
 +            "extra": {
 +                "branch-alias": {
 +                    "dev-master": "4.9-dev"
 +                }
 +            },
 +            "autoload": {
 +                "psr-4": {
 +                    "PhpParser\\": "lib/PhpParser"
 +                }
 +            },
 +            "notification-url": "https://packagist.org/downloads/",
 +            "license": [
 +                "BSD-3-Clause"
 +            ],
 +            "authors": [
 +                {
 +                    "name": "Nikita Popov"
 +                }
 +            ],
 +            "description": "A PHP parser written in PHP",
 +            "keywords": [
 +                "parser",
 +                "php"
 +            ],
 +            "support": {
 +                "issues": "https://github.com/nikic/PHP-Parser/issues",
 +                "source": "https://github.com/nikic/PHP-Parser/tree/v4.12.0"
 +            },
 +            "time": "2021-07-21T10:44:31+00:00"
          },
          {
              "name": "phar-io/manifest",
 -            "version": "1.0.3",
 +            "version": "2.0.3",
              "source": {
                  "type": "git",
                  "url": "https://github.com/phar-io/manifest.git",
 -                "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4"
 +                "reference": "97803eca37d319dfa7826cc2437fc020857acb53"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
 -                "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
 +                "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53",
 +                "reference": "97803eca37d319dfa7826cc2437fc020857acb53",
                  "shasum": ""
              },
              "require": {
                  "ext-dom": "*",
                  "ext-phar": "*",
 -                "phar-io/version": "^2.0",
 -                "php": "^5.6 || ^7.0"
 +                "ext-xmlwriter": "*",
 +                "phar-io/version": "^3.0.1",
 +                "php": "^7.2 || ^8.0"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "1.0.x-dev"
 +                    "dev-master": "2.0.x-dev"
                  }
              },
              "autoload": {
              "authors": [
                  {
                      "name": "Arne Blankerts",
 -                    "role": "Developer",
 -                    "email": "[email protected]"
 +                    "email": "[email protected]",
 +                    "role": "Developer"
                  },
                  {
                      "name": "Sebastian Heuer",
 -                    "role": "Developer",
 -                    "email": "[email protected]"
 +                    "email": "[email protected]",
 +                    "role": "Developer"
                  },
                  {
                      "name": "Sebastian Bergmann",
 -                    "role": "Developer",
 -                    "email": "[email protected]"
 +                    "email": "[email protected]",
 +                    "role": "Developer"
                  }
              ],
              "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
 -            "time": "2018-07-08T19:23:20+00:00"
 +            "support": {
 +                "issues": "https://github.com/phar-io/manifest/issues",
 +                "source": "https://github.com/phar-io/manifest/tree/2.0.3"
 +            },
 +            "time": "2021-07-20T11:28:43+00:00"
          },
          {
              "name": "phar-io/version",
 -            "version": "2.0.1",
 +            "version": "3.1.0",
              "source": {
                  "type": "git",
                  "url": "https://github.com/phar-io/version.git",
 -                "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6"
 +                "reference": "bae7c545bef187884426f042434e561ab1ddb182"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6",
 -                "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6",
 +                "url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182",
 +                "reference": "bae7c545bef187884426f042434e561ab1ddb182",
                  "shasum": ""
              },
              "require": {
 -                "php": "^5.6 || ^7.0"
 +                "php": "^7.2 || ^8.0"
              },
              "type": "library",
              "autoload": {
                  }
              ],
              "description": "Library for handling version information and constraints",
 -            "time": "2018-07-08T19:19:57+00:00"
 +            "support": {
 +                "issues": "https://github.com/phar-io/version/issues",
 +                "source": "https://github.com/phar-io/version/tree/3.1.0"
 +            },
 +            "time": "2021-02-23T14:00:09+00:00"
          },
          {
              "name": "phpdocumentor/reflection-common",
 -            "version": "2.1.0",
 +            "version": "2.2.0",
              "source": {
                  "type": "git",
                  "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
 -                "reference": "6568f4687e5b41b054365f9ae03fcb1ed5f2069b"
 +                "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/6568f4687e5b41b054365f9ae03fcb1ed5f2069b",
 -                "reference": "6568f4687e5b41b054365f9ae03fcb1ed5f2069b",
 +                "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
 +                "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
                  "shasum": ""
              },
              "require": {
 -                "php": ">=7.1"
 +                "php": "^7.2 || ^8.0"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "2.x-dev"
 +                    "dev-2.x": "2.x-dev"
                  }
              },
              "autoload": {
                  "reflection",
                  "static analysis"
              ],
 -            "time": "2020-04-27T09:25:28+00:00"
 +            "support": {
 +                "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
 +                "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
 +            },
 +            "time": "2020-06-27T09:03:43+00:00"
          },
          {
              "name": "phpdocumentor/reflection-docblock",
 -            "version": "5.1.0",
 +            "version": "5.2.2",
              "source": {
                  "type": "git",
                  "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
 -                "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e"
 +                "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e",
 -                "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e",
 +                "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556",
 +                "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556",
                  "shasum": ""
              },
              "require": {
 -                "ext-filter": "^7.1",
 -                "php": "^7.2",
 -                "phpdocumentor/reflection-common": "^2.0",
 -                "phpdocumentor/type-resolver": "^1.0",
 -                "webmozart/assert": "^1"
 +                "ext-filter": "*",
 +                "php": "^7.2 || ^8.0",
 +                "phpdocumentor/reflection-common": "^2.2",
 +                "phpdocumentor/type-resolver": "^1.3",
 +                "webmozart/assert": "^1.9.1"
              },
              "require-dev": {
 -                "doctrine/instantiator": "^1",
 -                "mockery/mockery": "^1"
 +                "mockery/mockery": "~1.3.2"
              },
              "type": "library",
              "extra": {
                  }
              ],
              "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
 -            "time": "2020-02-22T12:28:44+00:00"
 +            "support": {
 +                "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
 +                "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master"
 +            },
 +            "time": "2020-09-03T19:13:55+00:00"
          },
          {
              "name": "phpdocumentor/type-resolver",
 -            "version": "1.1.0",
 +            "version": "1.5.0",
              "source": {
                  "type": "git",
                  "url": "https://github.com/phpDocumentor/TypeResolver.git",
 -                "reference": "7462d5f123dfc080dfdf26897032a6513644fc95"
 +                "reference": "30f38bffc6f24293dadd1823936372dfa9e86e2f"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/7462d5f123dfc080dfdf26897032a6513644fc95",
 -                "reference": "7462d5f123dfc080dfdf26897032a6513644fc95",
 +                "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/30f38bffc6f24293dadd1823936372dfa9e86e2f",
 +                "reference": "30f38bffc6f24293dadd1823936372dfa9e86e2f",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.2",
 +                "php": "^7.2 || ^8.0",
                  "phpdocumentor/reflection-common": "^2.0"
              },
              "require-dev": {
 -                "ext-tokenizer": "^7.2",
 -                "mockery/mockery": "~1"
 +                "ext-tokenizer": "*",
 +                "psalm/phar": "^4.8"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "1.x-dev"
 +                    "dev-1.x": "1.x-dev"
                  }
              },
              "autoload": {
                  }
              ],
              "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
 -            "time": "2020-02-18T18:59:58+00:00"
 +            "support": {
 +                "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
 +                "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.5.0"
 +            },
 +            "time": "2021-09-17T15:28:14+00:00"
          },
          {
 -            "name": "phploc/phploc",
 -            "version": "5.0.0",
 +            "name": "phpspec/prophecy",
 +            "version": "1.14.0",
              "source": {
                  "type": "git",
 -                "url": "https://github.com/sebastianbergmann/phploc.git",
 -                "reference": "5b714ccb7cb8ca29ccf9caf6eb1aed0131d3a884"
 +                "url": "https://github.com/phpspec/prophecy.git",
 +                "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/sebastianbergmann/phploc/zipball/5b714ccb7cb8ca29ccf9caf6eb1aed0131d3a884",
 -                "reference": "5b714ccb7cb8ca29ccf9caf6eb1aed0131d3a884",
 +                "url": "https://api.github.com/repos/phpspec/prophecy/zipball/d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e",
 +                "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.2",
 -                "sebastian/finder-facade": "^1.1",
 -                "sebastian/version": "^2.0",
 -                "symfony/console": "^4.0"
 +                "doctrine/instantiator": "^1.2",
 +                "php": "^7.2 || ~8.0, <8.2",
 +                "phpdocumentor/reflection-docblock": "^5.2",
 +                "sebastian/comparator": "^3.0 || ^4.0",
 +                "sebastian/recursion-context": "^3.0 || ^4.0"
 +            },
 +            "require-dev": {
 +                "phpspec/phpspec": "^6.0 || ^7.0",
 +                "phpunit/phpunit": "^8.0 || ^9.0"
              },
 -            "bin": [
 -                "phploc"
 -            ],
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "5.0-dev"
 -                }
 -            },
 -            "autoload": {
 -                "classmap": [
 -                    "src/"
 -                ]
 -            },
 -            "notification-url": "https://packagist.org/downloads/",
 -            "license": [
 -                "BSD-3-Clause"
 -            ],
 -            "authors": [
 -                {
 -                    "name": "Sebastian Bergmann",
 -                    "email": "[email protected]",
 -                    "role": "lead"
 -                }
 -            ],
 -            "description": "A tool for quickly measuring the size of a PHP project.",
 -            "homepage": "https://github.com/sebastianbergmann/phploc",
 -            "time": "2019-03-16T10:41:19+00:00"
 -        },
 -        {
 -            "name": "phpspec/prophecy",
 -            "version": "v1.10.3",
 -            "source": {
 -                "type": "git",
 -                "url": "https://github.com/phpspec/prophecy.git",
 -                "reference": "451c3cd1418cf640de218914901e51b064abb093"
 -            },
 -            "dist": {
 -                "type": "zip",
 -                "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093",
 -                "reference": "451c3cd1418cf640de218914901e51b064abb093",
 -                "shasum": ""
 -            },
 -            "require": {
 -                "doctrine/instantiator": "^1.0.2",
 -                "php": "^5.3|^7.0",
 -                "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0",
 -                "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0",
 -                "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0"
 -            },
 -            "require-dev": {
 -                "phpspec/phpspec": "^2.5 || ^3.2",
 -                "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1"
 -            },
 -            "type": "library",
 -            "extra": {
 -                "branch-alias": {
 -                    "dev-master": "1.10.x-dev"
 +                    "dev-master": "1.x-dev"
                  }
              },
              "autoload": {
                  "spy",
                  "stub"
              ],
 -            "time": "2020-03-05T15:02:03+00:00"
 +            "support": {
 +                "issues": "https://github.com/phpspec/prophecy/issues",
 +                "source": "https://github.com/phpspec/prophecy/tree/1.14.0"
 +            },
 +            "time": "2021-09-10T09:02:12+00:00"
          },
          {
              "name": "phpunit/php-code-coverage",
 -            "version": "7.0.10",
 +            "version": "9.2.7",
              "source": {
                  "type": "git",
                  "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
 -                "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf"
 +                "reference": "d4c798ed8d51506800b441f7a13ecb0f76f12218"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f1884187926fbb755a9aaf0b3836ad3165b478bf",
 -                "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf",
 +                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/d4c798ed8d51506800b441f7a13ecb0f76f12218",
 +                "reference": "d4c798ed8d51506800b441f7a13ecb0f76f12218",
                  "shasum": ""
              },
              "require": {
                  "ext-dom": "*",
 +                "ext-libxml": "*",
                  "ext-xmlwriter": "*",
 -                "php": "^7.2",
 -                "phpunit/php-file-iterator": "^2.0.2",
 -                "phpunit/php-text-template": "^1.2.1",
 -                "phpunit/php-token-stream": "^3.1.1",
 -                "sebastian/code-unit-reverse-lookup": "^1.0.1",
 -                "sebastian/environment": "^4.2.2",
 -                "sebastian/version": "^2.0.1",
 -                "theseer/tokenizer": "^1.1.3"
 +                "nikic/php-parser": "^4.12.0",
 +                "php": ">=7.3",
 +                "phpunit/php-file-iterator": "^3.0.3",
 +                "phpunit/php-text-template": "^2.0.2",
 +                "sebastian/code-unit-reverse-lookup": "^2.0.2",
 +                "sebastian/complexity": "^2.0",
 +                "sebastian/environment": "^5.1.2",
 +                "sebastian/lines-of-code": "^1.0.3",
 +                "sebastian/version": "^3.0.1",
 +                "theseer/tokenizer": "^1.2.0"
              },
              "require-dev": {
 -                "phpunit/phpunit": "^8.2.2"
 +                "phpunit/phpunit": "^9.3"
              },
              "suggest": {
 -                "ext-xdebug": "^2.7.2"
 +                "ext-pcov": "*",
 +                "ext-xdebug": "*"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "7.0-dev"
 +                    "dev-master": "9.2-dev"
                  }
              },
              "autoload": {
                  "testing",
                  "xunit"
              ],
 -            "time": "2019-11-20T13:55:58+00:00"
 +            "support": {
 +                "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
 +                "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.7"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/sebastianbergmann",
 +                    "type": "github"
 +                }
 +            ],
 +            "time": "2021-09-17T05:39:03+00:00"
          },
          {
              "name": "phpunit/php-file-iterator",
 -            "version": "2.0.2",
 +            "version": "3.0.5",
              "source": {
                  "type": "git",
                  "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
 -                "reference": "050bedf145a257b1ff02746c31894800e5122946"
 +                "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946",
 -                "reference": "050bedf145a257b1ff02746c31894800e5122946",
 +                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/aa4be8575f26070b100fccb67faabb28f21f66f8",
 +                "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.1"
 +                "php": ">=7.3"
              },
              "require-dev": {
 -                "phpunit/phpunit": "^7.1"
 +                "phpunit/phpunit": "^9.3"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "2.0.x-dev"
 +                    "dev-master": "3.0-dev"
                  }
              },
              "autoload": {
                  "filesystem",
                  "iterator"
              ],
 -            "time": "2018-09-13T20:33:42+00:00"
 +            "support": {
 +                "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
 +                "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.5"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/sebastianbergmann",
 +                    "type": "github"
 +                }
 +            ],
 +            "time": "2020-09-28T05:57:25+00:00"
          },
          {
 -            "name": "phpunit/php-text-template",
 -            "version": "1.2.1",
 +            "name": "phpunit/php-invoker",
 +            "version": "3.1.1",
              "source": {
                  "type": "git",
 -                "url": "https://github.com/sebastianbergmann/php-text-template.git",
 -                "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
 +                "url": "https://github.com/sebastianbergmann/php-invoker.git",
 +                "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
 -                "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
 +                "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
 +                "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
                  "shasum": ""
              },
              "require": {
 -                "php": ">=5.3.3"
 +                "php": ">=7.3"
 +            },
 +            "require-dev": {
 +                "ext-pcntl": "*",
 +                "phpunit/phpunit": "^9.3"
 +            },
 +            "suggest": {
 +                "ext-pcntl": "*"
              },
              "type": "library",
 +            "extra": {
 +                "branch-alias": {
 +                    "dev-master": "3.1-dev"
 +                }
 +            },
              "autoload": {
                  "classmap": [
                      "src/"
                      "role": "lead"
                  }
              ],
 -            "description": "Simple template engine.",
 -            "homepage": "https://github.com/sebastianbergmann/php-text-template/",
 +            "description": "Invoke callables with a timeout",
 +            "homepage": "https://github.com/sebastianbergmann/php-invoker/",
              "keywords": [
 -                "template"
 +                "process"
              ],
 -            "time": "2015-06-21T13:50:34+00:00"
 +            "support": {
 +                "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
 +                "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/sebastianbergmann",
 +                    "type": "github"
 +                }
 +            ],
 +            "time": "2020-09-28T05:58:55+00:00"
          },
          {
 -            "name": "phpunit/php-timer",
 -            "version": "2.1.2",
 +            "name": "phpunit/php-text-template",
 +            "version": "2.0.4",
              "source": {
                  "type": "git",
 -                "url": "https://github.com/sebastianbergmann/php-timer.git",
 -                "reference": "1038454804406b0b5f5f520358e78c1c2f71501e"
 +                "url": "https://github.com/sebastianbergmann/php-text-template.git",
 +                "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e",
 -                "reference": "1038454804406b0b5f5f520358e78c1c2f71501e",
 +                "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
 +                "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.1"
 +                "php": ">=7.3"
              },
              "require-dev": {
 -                "phpunit/phpunit": "^7.0"
 +                "phpunit/phpunit": "^9.3"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "2.1-dev"
 +                    "dev-master": "2.0-dev"
                  }
              },
              "autoload": {
                      "role": "lead"
                  }
              ],
 -            "description": "Utility class for timing",
 -            "homepage": "https://github.com/sebastianbergmann/php-timer/",
 +            "description": "Simple template engine.",
 +            "homepage": "https://github.com/sebastianbergmann/php-text-template/",
              "keywords": [
 -                "timer"
 +                "template"
              ],
 -            "time": "2019-06-07T04:22:29+00:00"
 +            "support": {
 +                "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
 +                "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/sebastianbergmann",
 +                    "type": "github"
 +                }
 +            ],
 +            "time": "2020-10-26T05:33:50+00:00"
          },
          {
 -            "name": "phpunit/php-token-stream",
 -            "version": "3.1.1",
 +            "name": "phpunit/php-timer",
 +            "version": "5.0.3",
              "source": {
                  "type": "git",
 -                "url": "https://github.com/sebastianbergmann/php-token-stream.git",
 -                "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff"
 +                "url": "https://github.com/sebastianbergmann/php-timer.git",
 +                "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff",
 -                "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff",
 +                "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
 +                "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
                  "shasum": ""
              },
              "require": {
 -                "ext-tokenizer": "*",
 -                "php": "^7.1"
 +                "php": ">=7.3"
              },
              "require-dev": {
 -                "phpunit/phpunit": "^7.0"
 +                "phpunit/phpunit": "^9.3"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "3.1-dev"
 +                    "dev-master": "5.0-dev"
                  }
              },
              "autoload": {
              "authors": [
                  {
                      "name": "Sebastian Bergmann",
 -                    "email": "[email protected]"
 +                    "email": "[email protected]",
 +                    "role": "lead"
                  }
              ],
 -            "description": "Wrapper around PHP's tokenizer extension.",
 -            "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
 +            "description": "Utility class for timing",
 +            "homepage": "https://github.com/sebastianbergmann/php-timer/",
              "keywords": [
 -                "tokenizer"
 +                "timer"
              ],
 -            "time": "2019-09-17T06:23:10+00:00"
 +            "support": {
 +                "issues": "https://github.com/sebastianbergmann/php-timer/issues",
 +                "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/sebastianbergmann",
 +                    "type": "github"
 +                }
 +            ],
 +            "time": "2020-10-26T13:16:10+00:00"
          },
          {
              "name": "phpunit/phpunit",
 -            "version": "8.5.5",
 +            "version": "9.5.9",
              "source": {
                  "type": "git",
                  "url": "https://github.com/sebastianbergmann/phpunit.git",
 -                "reference": "63dda3b212a0025d380a745f91bdb4d8c985adb7"
 +                "reference": "ea8c2dfb1065eb35a79b3681eee6e6fb0a6f273b"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/63dda3b212a0025d380a745f91bdb4d8c985adb7",
 -                "reference": "63dda3b212a0025d380a745f91bdb4d8c985adb7",
 +                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/ea8c2dfb1065eb35a79b3681eee6e6fb0a6f273b",
 +                "reference": "ea8c2dfb1065eb35a79b3681eee6e6fb0a6f273b",
                  "shasum": ""
              },
              "require": {
 -                "doctrine/instantiator": "^1.2.0",
 +                "doctrine/instantiator": "^1.3.1",
                  "ext-dom": "*",
                  "ext-json": "*",
                  "ext-libxml": "*",
                  "ext-mbstring": "*",
                  "ext-xml": "*",
                  "ext-xmlwriter": "*",
 -                "myclabs/deep-copy": "^1.9.1",
 -                "phar-io/manifest": "^1.0.3",
 -                "phar-io/version": "^2.0.1",
 -                "php": "^7.2",
 -                "phpspec/prophecy": "^1.8.1",
 -                "phpunit/php-code-coverage": "^7.0.7",
 -                "phpunit/php-file-iterator": "^2.0.2",
 -                "phpunit/php-text-template": "^1.2.1",
 -                "phpunit/php-timer": "^2.1.2",
 -                "sebastian/comparator": "^3.0.2",
 -                "sebastian/diff": "^3.0.2",
 -                "sebastian/environment": "^4.2.2",
 -                "sebastian/exporter": "^3.1.1",
 -                "sebastian/global-state": "^3.0.0",
 -                "sebastian/object-enumerator": "^3.0.3",
 -                "sebastian/resource-operations": "^2.0.1",
 -                "sebastian/type": "^1.1.3",
 -                "sebastian/version": "^2.0.1"
 +                "myclabs/deep-copy": "^1.10.1",
 +                "phar-io/manifest": "^2.0.3",
 +                "phar-io/version": "^3.0.2",
 +                "php": ">=7.3",
 +                "phpspec/prophecy": "^1.12.1",
 +                "phpunit/php-code-coverage": "^9.2.3",
 +                "phpunit/php-file-iterator": "^3.0.5",
 +                "phpunit/php-invoker": "^3.1.1",
 +                "phpunit/php-text-template": "^2.0.3",
 +                "phpunit/php-timer": "^5.0.2",
 +                "sebastian/cli-parser": "^1.0.1",
 +                "sebastian/code-unit": "^1.0.6",
 +                "sebastian/comparator": "^4.0.5",
 +                "sebastian/diff": "^4.0.3",
 +                "sebastian/environment": "^5.1.3",
 +                "sebastian/exporter": "^4.0.3",
 +                "sebastian/global-state": "^5.0.1",
 +                "sebastian/object-enumerator": "^4.0.3",
 +                "sebastian/resource-operations": "^3.0.3",
 +                "sebastian/type": "^2.3.4",
 +                "sebastian/version": "^3.0.2"
              },
              "require-dev": {
 -                "ext-pdo": "*"
 +                "ext-pdo": "*",
 +                "phpspec/prophecy-phpunit": "^2.0.1"
              },
              "suggest": {
                  "ext-soap": "*",
 -                "ext-xdebug": "*",
 -                "phpunit/php-invoker": "^2.0.0"
 +                "ext-xdebug": "*"
              },
              "bin": [
                  "phpunit"
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "8.5-dev"
 +                    "dev-master": "9.5-dev"
                  }
              },
              "autoload": {
                  "classmap": [
                      "src/"
 +                ],
 +                "files": [
 +                    "src/Framework/Assert/Functions.php"
                  ]
              },
              "notification-url": "https://packagist.org/downloads/",
                  "testing",
                  "xunit"
              ],
 +            "support": {
 +                "issues": "https://github.com/sebastianbergmann/phpunit/issues",
 +                "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.9"
 +            },
              "funding": [
                  {
                      "url": "https://phpunit.de/donate.html",
                      "type": "github"
                  }
              ],
 -            "time": "2020-05-22T13:51:52+00:00"
 +            "time": "2021-08-31T06:47:40+00:00"
          },
          {
 -            "name": "sebastian/code-unit-reverse-lookup",
 +            "name": "react/promise",
 +            "version": "v2.8.0",
 +            "source": {
 +                "type": "git",
 +                "url": "https://github.com/reactphp/promise.git",
 +                "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4"
 +            },
 +            "dist": {
 +                "type": "zip",
 +                "url": "https://api.github.com/repos/reactphp/promise/zipball/f3cff96a19736714524ca0dd1d4130de73dbbbc4",
 +                "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4",
 +                "shasum": ""
 +            },
 +            "require": {
 +                "php": ">=5.4.0"
 +            },
 +            "require-dev": {
 +                "phpunit/phpunit": "^7.0 || ^6.5 || ^5.7 || ^4.8.36"
 +            },
 +            "type": "library",
 +            "autoload": {
 +                "psr-4": {
 +                    "React\\Promise\\": "src/"
 +                },
 +                "files": [
 +                    "src/functions_include.php"
 +                ]
 +            },
 +            "notification-url": "https://packagist.org/downloads/",
 +            "license": [
 +                "MIT"
 +            ],
 +            "authors": [
 +                {
 +                    "name": "Jan Sorgalla",
 +                    "email": "[email protected]"
 +                }
 +            ],
 +            "description": "A lightweight implementation of CommonJS Promises/A for PHP",
 +            "keywords": [
 +                "promise",
 +                "promises"
 +            ],
 +            "support": {
 +                "issues": "https://github.com/reactphp/promise/issues",
 +                "source": "https://github.com/reactphp/promise/tree/v2.8.0"
 +            },
 +            "time": "2020-05-12T15:16:56+00:00"
 +        },
 +        {
 +            "name": "sebastian/cli-parser",
              "version": "1.0.1",
 +            "source": {
 +                "type": "git",
 +                "url": "https://github.com/sebastianbergmann/cli-parser.git",
 +                "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2"
 +            },
 +            "dist": {
 +                "type": "zip",
 +                "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2",
 +                "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2",
 +                "shasum": ""
 +            },
 +            "require": {
 +                "php": ">=7.3"
 +            },
 +            "require-dev": {
 +                "phpunit/phpunit": "^9.3"
 +            },
 +            "type": "library",
 +            "extra": {
 +                "branch-alias": {
 +                    "dev-master": "1.0-dev"
 +                }
 +            },
 +            "autoload": {
 +                "classmap": [
 +                    "src/"
 +                ]
 +            },
 +            "notification-url": "https://packagist.org/downloads/",
 +            "license": [
 +                "BSD-3-Clause"
 +            ],
 +            "authors": [
 +                {
 +                    "name": "Sebastian Bergmann",
 +                    "email": "[email protected]",
 +                    "role": "lead"
 +                }
 +            ],
 +            "description": "Library for parsing CLI options",
 +            "homepage": "https://github.com/sebastianbergmann/cli-parser",
 +            "support": {
 +                "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
 +                "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/sebastianbergmann",
 +                    "type": "github"
 +                }
 +            ],
 +            "time": "2020-09-28T06:08:49+00:00"
 +        },
 +        {
 +            "name": "sebastian/code-unit",
 +            "version": "1.0.8",
 +            "source": {
 +                "type": "git",
 +                "url": "https://github.com/sebastianbergmann/code-unit.git",
 +                "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
 +            },
 +            "dist": {
 +                "type": "zip",
 +                "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
 +                "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
 +                "shasum": ""
 +            },
 +            "require": {
 +                "php": ">=7.3"
 +            },
 +            "require-dev": {
 +                "phpunit/phpunit": "^9.3"
 +            },
 +            "type": "library",
 +            "extra": {
 +                "branch-alias": {
 +                    "dev-master": "1.0-dev"
 +                }
 +            },
 +            "autoload": {
 +                "classmap": [
 +                    "src/"
 +                ]
 +            },
 +            "notification-url": "https://packagist.org/downloads/",
 +            "license": [
 +                "BSD-3-Clause"
 +            ],
 +            "authors": [
 +                {
 +                    "name": "Sebastian Bergmann",
 +                    "email": "[email protected]",
 +                    "role": "lead"
 +                }
 +            ],
 +            "description": "Collection of value objects that represent the PHP code units",
 +            "homepage": "https://github.com/sebastianbergmann/code-unit",
 +            "support": {
 +                "issues": "https://github.com/sebastianbergmann/code-unit/issues",
 +                "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/sebastianbergmann",
 +                    "type": "github"
 +                }
 +            ],
 +            "time": "2020-10-26T13:08:54+00:00"
 +        },
 +        {
 +            "name": "sebastian/code-unit-reverse-lookup",
 +            "version": "2.0.3",
              "source": {
                  "type": "git",
                  "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
 -                "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18"
 +                "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
 -                "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
 +                "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
 +                "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
                  "shasum": ""
              },
              "require": {
 -                "php": "^5.6 || ^7.0"
 +                "php": ">=7.3"
              },
              "require-dev": {
 -                "phpunit/phpunit": "^5.7 || ^6.0"
 +                "phpunit/phpunit": "^9.3"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "1.0.x-dev"
 +                    "dev-master": "2.0-dev"
                  }
              },
              "autoload": {
              ],
              "description": "Looks up which function or method a line of code belongs to",
              "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
 -            "time": "2017-03-04T06:30:41+00:00"
 +            "support": {
 +                "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
 +                "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/sebastianbergmann",
 +                    "type": "github"
 +                }
 +            ],
 +            "time": "2020-09-28T05:30:19+00:00"
          },
          {
              "name": "sebastian/comparator",
 -            "version": "3.0.2",
 +            "version": "4.0.6",
              "source": {
                  "type": "git",
                  "url": "https://github.com/sebastianbergmann/comparator.git",
 -                "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da"
 +                "reference": "55f4261989e546dc112258c7a75935a81a7ce382"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da",
 -                "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da",
 +                "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382",
 +                "reference": "55f4261989e546dc112258c7a75935a81a7ce382",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.1",
 -                "sebastian/diff": "^3.0",
 -                "sebastian/exporter": "^3.1"
 +                "php": ">=7.3",
 +                "sebastian/diff": "^4.0",
 +                "sebastian/exporter": "^4.0"
              },
              "require-dev": {
 -                "phpunit/phpunit": "^7.1"
 +                "phpunit/phpunit": "^9.3"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "3.0-dev"
 +                    "dev-master": "4.0-dev"
                  }
              },
              "autoload": {
                  "BSD-3-Clause"
              ],
              "authors": [
 +                {
 +                    "name": "Sebastian Bergmann",
 +                    "email": "[email protected]"
 +                },
                  {
                      "name": "Jeff Welch",
                      "email": "[email protected]"
                  {
                      "name": "Bernhard Schussek",
                      "email": "[email protected]"
 -                },
 -                {
 -                    "name": "Sebastian Bergmann",
 -                    "email": "[email protected]"
                  }
              ],
              "description": "Provides the functionality to compare PHP values for equality",
                  "compare",
                  "equality"
              ],
 -            "time": "2018-07-12T15:12:46+00:00"
 +            "support": {
 +                "issues": "https://github.com/sebastianbergmann/comparator/issues",
 +                "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/sebastianbergmann",
 +                    "type": "github"
 +                }
 +            ],
 +            "time": "2020-10-26T15:49:45+00:00"
 +        },
 +        {
 +            "name": "sebastian/complexity",
 +            "version": "2.0.2",
 +            "source": {
 +                "type": "git",
 +                "url": "https://github.com/sebastianbergmann/complexity.git",
 +                "reference": "739b35e53379900cc9ac327b2147867b8b6efd88"
 +            },
 +            "dist": {
 +                "type": "zip",
 +                "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88",
 +                "reference": "739b35e53379900cc9ac327b2147867b8b6efd88",
 +                "shasum": ""
 +            },
 +            "require": {
 +                "nikic/php-parser": "^4.7",
 +                "php": ">=7.3"
 +            },
 +            "require-dev": {
 +                "phpunit/phpunit": "^9.3"
 +            },
 +            "type": "library",
 +            "extra": {
 +                "branch-alias": {
 +                    "dev-master": "2.0-dev"
 +                }
 +            },
 +            "autoload": {
 +                "classmap": [
 +                    "src/"
 +                ]
 +            },
 +            "notification-url": "https://packagist.org/downloads/",
 +            "license": [
 +                "BSD-3-Clause"
 +            ],
 +            "authors": [
 +                {
 +                    "name": "Sebastian Bergmann",
 +                    "email": "[email protected]",
 +                    "role": "lead"
 +                }
 +            ],
 +            "description": "Library for calculating the complexity of PHP code units",
 +            "homepage": "https://github.com/sebastianbergmann/complexity",
 +            "support": {
 +                "issues": "https://github.com/sebastianbergmann/complexity/issues",
 +                "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/sebastianbergmann",
 +                    "type": "github"
 +                }
 +            ],
 +            "time": "2020-10-26T15:52:27+00:00"
          },
          {
              "name": "sebastian/diff",
 -            "version": "3.0.2",
 +            "version": "4.0.4",
              "source": {
                  "type": "git",
                  "url": "https://github.com/sebastianbergmann/diff.git",
 -                "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29"
 +                "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29",
 -                "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29",
 +                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d",
 +                "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.1"
 +                "php": ">=7.3"
              },
              "require-dev": {
 -                "phpunit/phpunit": "^7.5 || ^8.0",
 -                "symfony/process": "^2 || ^3.3 || ^4"
 +                "phpunit/phpunit": "^9.3",
 +                "symfony/process": "^4.2 || ^5"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "3.0-dev"
 +                    "dev-master": "4.0-dev"
                  }
              },
              "autoload": {
                  "BSD-3-Clause"
              ],
              "authors": [
 -                {
 -                    "name": "Kore Nordmann",
 -                    "email": "[email protected]"
 -                },
                  {
                      "name": "Sebastian Bergmann",
                      "email": "[email protected]"
 +                },
 +                {
 +                    "name": "Kore Nordmann",
 +                    "email": "[email protected]"
                  }
              ],
              "description": "Diff implementation",
                  "unidiff",
                  "unified diff"
              ],
 -            "time": "2019-02-04T06:01:07+00:00"
 +            "support": {
 +                "issues": "https://github.com/sebastianbergmann/diff/issues",
 +                "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/sebastianbergmann",
 +                    "type": "github"
 +                }
 +            ],
 +            "time": "2020-10-26T13:10:38+00:00"
          },
          {
              "name": "sebastian/environment",
 -            "version": "4.2.3",
 +            "version": "5.1.3",
              "source": {
                  "type": "git",
                  "url": "https://github.com/sebastianbergmann/environment.git",
 -                "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368"
 +                "reference": "388b6ced16caa751030f6a69e588299fa09200ac"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368",
 -                "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368",
 +                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac",
 +                "reference": "388b6ced16caa751030f6a69e588299fa09200ac",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.1"
 +                "php": ">=7.3"
              },
              "require-dev": {
 -                "phpunit/phpunit": "^7.5"
 +                "phpunit/phpunit": "^9.3"
              },
              "suggest": {
                  "ext-posix": "*"
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "4.2-dev"
 +                    "dev-master": "5.1-dev"
                  }
              },
              "autoload": {
                  "environment",
                  "hhvm"
              ],
 -            "time": "2019-11-20T08:46:58+00:00"
 +            "support": {
 +                "issues": "https://github.com/sebastianbergmann/environment/issues",
 +                "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/sebastianbergmann",
 +                    "type": "github"
 +                }
 +            ],
 +            "time": "2020-09-28T05:52:38+00:00"
          },
          {
              "name": "sebastian/exporter",
 -            "version": "3.1.2",
 +            "version": "4.0.3",
              "source": {
                  "type": "git",
                  "url": "https://github.com/sebastianbergmann/exporter.git",
 -                "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e"
 +                "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e",
 -                "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e",
 +                "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/d89cc98761b8cb5a1a235a6b703ae50d34080e65",
 +                "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.0",
 -                "sebastian/recursion-context": "^3.0"
 +                "php": ">=7.3",
 +                "sebastian/recursion-context": "^4.0"
              },
              "require-dev": {
                  "ext-mbstring": "*",
 -                "phpunit/phpunit": "^6.0"
 +                "phpunit/phpunit": "^9.3"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "3.1.x-dev"
 +                    "dev-master": "4.0-dev"
                  }
              },
              "autoload": {
                  "export",
                  "exporter"
              ],
 -            "time": "2019-09-14T09:02:43+00:00"
 +            "support": {
 +                "issues": "https://github.com/sebastianbergmann/exporter/issues",
 +                "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.3"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/sebastianbergmann",
 +                    "type": "github"
 +                }
 +            ],
 +            "time": "2020-09-28T05:24:23+00:00"
          },
          {
 -            "name": "sebastian/finder-facade",
 -            "version": "1.2.3",
 +            "name": "sebastian/global-state",
 +            "version": "5.0.3",
              "source": {
                  "type": "git",
 -                "url": "https://github.com/sebastianbergmann/finder-facade.git",
 -                "reference": "167c45d131f7fc3d159f56f191a0a22228765e16"
 +                "url": "https://github.com/sebastianbergmann/global-state.git",
 +                "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/sebastianbergmann/finder-facade/zipball/167c45d131f7fc3d159f56f191a0a22228765e16",
 -                "reference": "167c45d131f7fc3d159f56f191a0a22228765e16",
 +                "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/23bd5951f7ff26f12d4e3242864df3e08dec4e49",
 +                "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.1",
 -                "symfony/finder": "^2.3|^3.0|^4.0|^5.0",
 -                "theseer/fdomdocument": "^1.6"
 +                "php": ">=7.3",
 +                "sebastian/object-reflector": "^2.0",
 +                "sebastian/recursion-context": "^4.0"
 +            },
 +            "require-dev": {
 +                "ext-dom": "*",
 +                "phpunit/phpunit": "^9.3"
 +            },
 +            "suggest": {
 +                "ext-uopz": "*"
              },
              "type": "library",
              "extra": {
 -                "branch-alias": []
 +                "branch-alias": {
 +                    "dev-master": "5.0-dev"
 +                }
              },
              "autoload": {
                  "classmap": [
              "authors": [
                  {
                      "name": "Sebastian Bergmann",
 -                    "email": "[email protected]",
 -                    "role": "lead"
 +                    "email": "[email protected]"
 +                }
 +            ],
 +            "description": "Snapshotting of global state",
 +            "homepage": "http://www.github.com/sebastianbergmann/global-state",
 +            "keywords": [
 +                "global state"
 +            ],
 +            "support": {
 +                "issues": "https://github.com/sebastianbergmann/global-state/issues",
 +                "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.3"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/sebastianbergmann",
 +                    "type": "github"
                  }
              ],
 -            "description": "FinderFacade is a convenience wrapper for Symfony's Finder component.",
 -            "homepage": "https://github.com/sebastianbergmann/finder-facade",
 -            "time": "2020-01-16T08:08:45+00:00"
 +            "time": "2021-06-11T13:31:12+00:00"
          },
          {
 -            "name": "sebastian/global-state",
 -            "version": "3.0.0",
 +            "name": "sebastian/lines-of-code",
 +            "version": "1.0.3",
              "source": {
                  "type": "git",
 -                "url": "https://github.com/sebastianbergmann/global-state.git",
 -                "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4"
 +                "url": "https://github.com/sebastianbergmann/lines-of-code.git",
 +                "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4",
 -                "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4",
 +                "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc",
 +                "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.2",
 -                "sebastian/object-reflector": "^1.1.1",
 -                "sebastian/recursion-context": "^3.0"
 +                "nikic/php-parser": "^4.6",
 +                "php": ">=7.3"
              },
              "require-dev": {
 -                "ext-dom": "*",
 -                "phpunit/phpunit": "^8.0"
 -            },
 -            "suggest": {
 -                "ext-uopz": "*"
 +                "phpunit/phpunit": "^9.3"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "3.0-dev"
 +                    "dev-master": "1.0-dev"
                  }
              },
              "autoload": {
              "authors": [
                  {
                      "name": "Sebastian Bergmann",
 -                    "email": "[email protected]"
 +                    "email": "[email protected]",
 +                    "role": "lead"
                  }
              ],
 -            "description": "Snapshotting of global state",
 -            "homepage": "http://www.github.com/sebastianbergmann/global-state",
 -            "keywords": [
 -                "global state"
 +            "description": "Library for counting the lines of code in PHP source code",
 +            "homepage": "https://github.com/sebastianbergmann/lines-of-code",
 +            "support": {
 +                "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
 +                "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/sebastianbergmann",
 +                    "type": "github"
 +                }
              ],
 -            "time": "2019-02-01T05:30:01+00:00"
 +            "time": "2020-11-28T06:42:11+00:00"
          },
          {
              "name": "sebastian/object-enumerator",
 -            "version": "3.0.3",
 +            "version": "4.0.4",
              "source": {
                  "type": "git",
                  "url": "https://github.com/sebastianbergmann/object-enumerator.git",
 -                "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5"
 +                "reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5",
 -                "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5",
 +                "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
 +                "reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.0",
 -                "sebastian/object-reflector": "^1.1.1",
 -                "sebastian/recursion-context": "^3.0"
 +                "php": ">=7.3",
 +                "sebastian/object-reflector": "^2.0",
 +                "sebastian/recursion-context": "^4.0"
              },
              "require-dev": {
 -                "phpunit/phpunit": "^6.0"
 +                "phpunit/phpunit": "^9.3"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "3.0.x-dev"
 +                    "dev-master": "4.0-dev"
                  }
              },
              "autoload": {
              ],
              "description": "Traverses array structures and object graphs to enumerate all referenced objects",
              "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
 -            "time": "2017-08-03T12:35:26+00:00"
 +            "support": {
 +                "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
 +                "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/sebastianbergmann",
 +                    "type": "github"
 +                }
 +            ],
 +            "time": "2020-10-26T13:12:34+00:00"
          },
          {
              "name": "sebastian/object-reflector",
 -            "version": "1.1.1",
 +            "version": "2.0.4",
              "source": {
                  "type": "git",
                  "url": "https://github.com/sebastianbergmann/object-reflector.git",
 -                "reference": "773f97c67f28de00d397be301821b06708fca0be"
 +                "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be",
 -                "reference": "773f97c67f28de00d397be301821b06708fca0be",
 +                "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
 +                "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.0"
 +                "php": ">=7.3"
              },
              "require-dev": {
 -                "phpunit/phpunit": "^6.0"
 +                "phpunit/phpunit": "^9.3"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "1.1-dev"
 +                    "dev-master": "2.0-dev"
                  }
              },
              "autoload": {
              ],
              "description": "Allows reflection of object attributes, including inherited and non-public ones",
              "homepage": "https://github.com/sebastianbergmann/object-reflector/",
 -            "time": "2017-03-29T09:07:27+00:00"
 +            "support": {
 +                "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
 +                "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/sebastianbergmann",
 +                    "type": "github"
 +                }
 +            ],
 +            "time": "2020-10-26T13:14:26+00:00"
          },
          {
              "name": "sebastian/recursion-context",
 -            "version": "3.0.0",
 +            "version": "4.0.4",
              "source": {
                  "type": "git",
                  "url": "https://github.com/sebastianbergmann/recursion-context.git",
 -                "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8"
 +                "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8",
 -                "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8",
 +                "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172",
 +                "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.0"
 +                "php": ">=7.3"
              },
              "require-dev": {
 -                "phpunit/phpunit": "^6.0"
 +                "phpunit/phpunit": "^9.3"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "3.0.x-dev"
 +                    "dev-master": "4.0-dev"
                  }
              },
              "autoload": {
                  "BSD-3-Clause"
              ],
              "authors": [
 -                {
 -                    "name": "Jeff Welch",
 -                    "email": "[email protected]"
 -                },
                  {
                      "name": "Sebastian Bergmann",
                      "email": "[email protected]"
                  },
 +                {
 +                    "name": "Jeff Welch",
 +                    "email": "[email protected]"
 +                },
                  {
                      "name": "Adam Harvey",
                      "email": "[email protected]"
              ],
              "description": "Provides functionality to recursively process PHP variables",
              "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
 -            "time": "2017-03-03T06:23:57+00:00"
 +            "support": {
 +                "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
 +                "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/sebastianbergmann",
 +                    "type": "github"
 +                }
 +            ],
 +            "time": "2020-10-26T13:17:30+00:00"
          },
          {
              "name": "sebastian/resource-operations",
 -            "version": "2.0.1",
 +            "version": "3.0.3",
              "source": {
                  "type": "git",
                  "url": "https://github.com/sebastianbergmann/resource-operations.git",
 -                "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9"
 +                "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9",
 -                "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9",
 +                "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
 +                "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.1"
 +                "php": ">=7.3"
 +            },
 +            "require-dev": {
 +                "phpunit/phpunit": "^9.0"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "2.0-dev"
 +                    "dev-master": "3.0-dev"
                  }
              },
              "autoload": {
              ],
              "description": "Provides a list of PHP built-in functions that operate on resources",
              "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
 -            "time": "2018-10-04T04:07:39+00:00"
 +            "support": {
 +                "issues": "https://github.com/sebastianbergmann/resource-operations/issues",
 +                "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/sebastianbergmann",
 +                    "type": "github"
 +                }
 +            ],
 +            "time": "2020-09-28T06:45:17+00:00"
          },
          {
              "name": "sebastian/type",
 -            "version": "1.1.3",
 +            "version": "2.3.4",
              "source": {
                  "type": "git",
                  "url": "https://github.com/sebastianbergmann/type.git",
 -                "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3"
 +                "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/3aaaa15fa71d27650d62a948be022fe3b48541a3",
 -                "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3",
 +                "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b8cd8a1c753c90bc1a0f5372170e3e489136f914",
 +                "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.2"
 +                "php": ">=7.3"
              },
              "require-dev": {
 -                "phpunit/phpunit": "^8.2"
 +                "phpunit/phpunit": "^9.3"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "1.1-dev"
 +                    "dev-master": "2.3-dev"
                  }
              },
              "autoload": {
              ],
              "description": "Collection of value objects that represent the types of the PHP type system",
              "homepage": "https://github.com/sebastianbergmann/type",
 -            "time": "2019-07-02T08:10:15+00:00"
 +            "support": {
 +                "issues": "https://github.com/sebastianbergmann/type/issues",
 +                "source": "https://github.com/sebastianbergmann/type/tree/2.3.4"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/sebastianbergmann",
 +                    "type": "github"
 +                }
 +            ],
 +            "time": "2021-06-15T12:49:02+00:00"
          },
          {
              "name": "sebastian/version",
 -            "version": "2.0.1",
 +            "version": "3.0.2",
              "source": {
                  "type": "git",
                  "url": "https://github.com/sebastianbergmann/version.git",
 -                "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
 +                "reference": "c6c1022351a901512170118436c764e473f6de8c"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
 -                "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
 +                "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
 +                "reference": "c6c1022351a901512170118436c764e473f6de8c",
                  "shasum": ""
              },
              "require": {
 -                "php": ">=5.6"
 +                "php": ">=7.3"
              },
              "type": "library",
              "extra": {
                  "branch-alias": {
 -                    "dev-master": "2.0.x-dev"
 +                    "dev-master": "3.0-dev"
                  }
              },
              "autoload": {
              ],
              "description": "Library that helps with managing the version number of Git-hosted PHP projects",
              "homepage": "https://github.com/sebastianbergmann/version",
 -            "time": "2016-10-03T07:35:21+00:00"
 +            "support": {
 +                "issues": "https://github.com/sebastianbergmann/version/issues",
 +                "source": "https://github.com/sebastianbergmann/version/tree/3.0.2"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/sebastianbergmann",
 +                    "type": "github"
 +                }
 +            ],
 +            "time": "2020-09-28T06:39:44+00:00"
          },
          {
              "name": "seld/jsonlint",
 -            "version": "1.8.0",
 +            "version": "1.8.3",
              "source": {
                  "type": "git",
                  "url": "https://github.com/Seldaek/jsonlint.git",
 -                "reference": "ff2aa5420bfbc296cf6a0bc785fa5b35736de7c1"
 +                "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/ff2aa5420bfbc296cf6a0bc785fa5b35736de7c1",
 -                "reference": "ff2aa5420bfbc296cf6a0bc785fa5b35736de7c1",
 +                "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9ad6ce79c342fbd44df10ea95511a1b24dee5b57",
 +                "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57",
                  "shasum": ""
              },
              "require": {
                  "parser",
                  "validator"
              ],
 +            "support": {
 +                "issues": "https://github.com/Seldaek/jsonlint/issues",
 +                "source": "https://github.com/Seldaek/jsonlint/tree/1.8.3"
 +            },
              "funding": [
                  {
                      "url": "https://github.com/Seldaek",
                      "type": "tidelift"
                  }
              ],
 -            "time": "2020-04-30T19:05:18+00:00"
 +            "time": "2020-11-11T09:19:24+00:00"
          },
          {
              "name": "seld/phar-utils",
 -            "version": "1.1.0",
 +            "version": "1.1.2",
              "source": {
                  "type": "git",
                  "url": "https://github.com/Seldaek/phar-utils.git",
 -                "reference": "8800503d56b9867d43d9c303b9cbcc26016e82f0"
 +                "reference": "749042a2315705d2dfbbc59234dd9ceb22bf3ff0"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/8800503d56b9867d43d9c303b9cbcc26016e82f0",
 -                "reference": "8800503d56b9867d43d9c303b9cbcc26016e82f0",
 +                "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/749042a2315705d2dfbbc59234dd9ceb22bf3ff0",
 +                "reference": "749042a2315705d2dfbbc59234dd9ceb22bf3ff0",
                  "shasum": ""
              },
              "require": {
              "keywords": [
                  "phar"
              ],
 -            "time": "2020-02-14T15:25:33+00:00"
 -        },
 -        {
 -            "name": "squizlabs/php_codesniffer",
 -            "version": "3.5.5",
 -            "source": {
 -                "type": "git",
 -                "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
 -                "reference": "73e2e7f57d958e7228fce50dc0c61f58f017f9f6"
 -            },
 -            "dist": {
 -                "type": "zip",
 -                "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/73e2e7f57d958e7228fce50dc0c61f58f017f9f6",
 -                "reference": "73e2e7f57d958e7228fce50dc0c61f58f017f9f6",
 -                "shasum": ""
 -            },
 -            "require": {
 -                "ext-simplexml": "*",
 -                "ext-tokenizer": "*",
 -                "ext-xmlwriter": "*",
 -                "php": ">=5.4.0"
 -            },
 -            "require-dev": {
 -                "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
 +            "support": {
 +                "issues": "https://github.com/Seldaek/phar-utils/issues",
 +                "source": "https://github.com/Seldaek/phar-utils/tree/1.1.2"
              },
 -            "bin": [
 -                "bin/phpcs",
 -                "bin/phpcbf"
 -            ],
 -            "type": "library",
 -            "extra": {
 -                "branch-alias": {
 -                    "dev-master": "3.x-dev"
 -                }
 -            },
 -            "notification-url": "https://packagist.org/downloads/",
 -            "license": [
 -                "BSD-3-Clause"
 -            ],
 -            "authors": [
 -                {
 -                    "name": "Greg Sherwood",
 -                    "role": "lead"
 -                }
 -            ],
 -            "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
 -            "homepage": "https://github.com/squizlabs/PHP_CodeSniffer",
 -            "keywords": [
 -                "phpcs",
 -                "standards"
 -            ],
 -            "time": "2020-04-17T01:09:41+00:00"
 +            "time": "2021-08-19T21:01:38+00:00"
          },
          {
              "name": "symfony/dom-crawler",
 -            "version": "v4.4.8",
 +            "version": "v5.3.7",
              "source": {
                  "type": "git",
                  "url": "https://github.com/symfony/dom-crawler.git",
 -                "reference": "4d0fb3374324071ecdd94898367a3fa4b5563162"
 +                "reference": "c7eef3a60ccfdd8eafe07f81652e769ac9c7146c"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/4d0fb3374324071ecdd94898367a3fa4b5563162",
 -                "reference": "4d0fb3374324071ecdd94898367a3fa4b5563162",
 +                "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/c7eef3a60ccfdd8eafe07f81652e769ac9c7146c",
 +                "reference": "c7eef3a60ccfdd8eafe07f81652e769ac9c7146c",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.1.3",
 +                "php": ">=7.2.5",
 +                "symfony/deprecation-contracts": "^2.1",
                  "symfony/polyfill-ctype": "~1.8",
 -                "symfony/polyfill-mbstring": "~1.0"
 +                "symfony/polyfill-mbstring": "~1.0",
 +                "symfony/polyfill-php80": "^1.16"
              },
              "conflict": {
                  "masterminds/html5": "<2.6"
              },
              "require-dev": {
                  "masterminds/html5": "^2.6",
 -                "symfony/css-selector": "^3.4|^4.0|^5.0"
 +                "symfony/css-selector": "^4.4|^5.0"
              },
              "suggest": {
                  "symfony/css-selector": ""
              },
              "type": "library",
 -            "extra": {
 -                "branch-alias": {
 -                    "dev-master": "4.4-dev"
 -                }
 -            },
              "autoload": {
                  "psr-4": {
                      "Symfony\\Component\\DomCrawler\\": ""
                      "homepage": "https://symfony.com/contributors"
                  }
              ],
 -            "description": "Symfony DomCrawler Component",
 +            "description": "Eases DOM navigation for HTML and XML documents",
              "homepage": "https://symfony.com",
 +            "support": {
 +                "source": "https://github.com/symfony/dom-crawler/tree/v5.3.7"
 +            },
              "funding": [
                  {
                      "url": "https://symfony.com/sponsor",
                      "type": "tidelift"
                  }
              ],
 -            "time": "2020-03-29T19:12:22+00:00"
 +            "time": "2021-08-29T19:32:13+00:00"
          },
          {
              "name": "symfony/filesystem",
 -            "version": "v4.4.8",
 +            "version": "v5.3.4",
              "source": {
                  "type": "git",
                  "url": "https://github.com/symfony/filesystem.git",
 -                "reference": "a3ebf3bfd8a98a147c010a568add5a8aa4edea0f"
 +                "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/symfony/filesystem/zipball/a3ebf3bfd8a98a147c010a568add5a8aa4edea0f",
 -                "reference": "a3ebf3bfd8a98a147c010a568add5a8aa4edea0f",
 +                "url": "https://api.github.com/repos/symfony/filesystem/zipball/343f4fe324383ca46792cae728a3b6e2f708fb32",
 +                "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32",
                  "shasum": ""
              },
              "require": {
 -                "php": "^7.1.3",
 -                "symfony/polyfill-ctype": "~1.8"
 +                "php": ">=7.2.5",
 +                "symfony/polyfill-ctype": "~1.8",
 +                "symfony/polyfill-php80": "^1.16"
              },
              "type": "library",
 -            "extra": {
 -                "branch-alias": {
 -                    "dev-master": "4.4-dev"
 -                }
 -            },
              "autoload": {
                  "psr-4": {
                      "Symfony\\Component\\Filesystem\\": ""
                      "homepage": "https://symfony.com/contributors"
                  }
              ],
 -            "description": "Symfony Filesystem Component",
 +            "description": "Provides basic utilities for the filesystem",
              "homepage": "https://symfony.com",
 +            "support": {
 +                "source": "https://github.com/symfony/filesystem/tree/v5.3.4"
 +            },
              "funding": [
                  {
                      "url": "https://symfony.com/sponsor",
                      "type": "tidelift"
                  }
              ],
 -            "time": "2020-04-12T14:39:55+00:00"
 -        },
 -        {
 -            "name": "theseer/fdomdocument",
 -            "version": "1.6.6",
 -            "source": {
 -                "type": "git",
 -                "url": "https://github.com/theseer/fDOMDocument.git",
 -                "reference": "6e8203e40a32a9c770bcb62fe37e68b948da6dca"
 -            },
 -            "dist": {
 -                "type": "zip",
 -                "url": "https://api.github.com/repos/theseer/fDOMDocument/zipball/6e8203e40a32a9c770bcb62fe37e68b948da6dca",
 -                "reference": "6e8203e40a32a9c770bcb62fe37e68b948da6dca",
 -                "shasum": ""
 -            },
 -            "require": {
 -                "ext-dom": "*",
 -                "lib-libxml": "*",
 -                "php": ">=5.3.3"
 -            },
 -            "type": "library",
 -            "autoload": {
 -                "classmap": [
 -                    "src/"
 -                ]
 -            },
 -            "notification-url": "https://packagist.org/downloads/",
 -            "license": [
 -                "BSD-3-Clause"
 -            ],
 -            "authors": [
 -                {
 -                    "name": "Arne Blankerts",
 -                    "role": "lead",
 -                    "email": "[email protected]"
 -                }
 -            ],
 -            "description": "The classes contained within this repository extend the standard DOM to use exceptions at all occasions of errors instead of PHP warnings or notices. They also add various custom methods and shortcuts for convenience and to simplify the usage of DOM.",
 -            "homepage": "https://github.com/theseer/fDOMDocument",
 -            "time": "2017-06-30T11:53:12+00:00"
 +            "time": "2021-07-21T12:40:44+00:00"
          },
          {
              "name": "theseer/tokenizer",
 -            "version": "1.1.3",
 +            "version": "1.2.1",
              "source": {
                  "type": "git",
                  "url": "https://github.com/theseer/tokenizer.git",
 -                "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9"
 +                "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/theseer/tokenizer/zipball/11336f6f84e16a720dae9d8e6ed5019efa85a0f9",
 -                "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9",
 +                "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e",
 +                "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e",
                  "shasum": ""
              },
              "require": {
                  "ext-dom": "*",
                  "ext-tokenizer": "*",
                  "ext-xmlwriter": "*",
 -                "php": "^7.0"
 +                "php": "^7.2 || ^8.0"
              },
              "type": "library",
              "autoload": {
              "authors": [
                  {
                      "name": "Arne Blankerts",
 -                    "role": "Developer",
 -                    "email": "[email protected]"
 +                    "email": "[email protected]",
 +                    "role": "Developer"
                  }
              ],
              "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
 -            "time": "2019-06-13T22:48:21+00:00"
 +            "support": {
 +                "issues": "https://github.com/theseer/tokenizer/issues",
 +                "source": "https://github.com/theseer/tokenizer/tree/1.2.1"
 +            },
 +            "funding": [
 +                {
 +                    "url": "https://github.com/theseer",
 +                    "type": "github"
 +                }
 +            ],
 +            "time": "2021-07-28T10:34:58+00:00"
          },
          {
              "name": "webmozart/assert",
 -            "version": "1.8.0",
 +            "version": "1.10.0",
              "source": {
                  "type": "git",
 -                "url": "https://github.com/webmozart/assert.git",
 -                "reference": "ab2cb0b3b559010b75981b1bdce728da3ee90ad6"
 +                "url": "https://github.com/webmozarts/assert.git",
 +                "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25"
              },
              "dist": {
                  "type": "zip",
 -                "url": "https://api.github.com/repos/webmozart/assert/zipball/ab2cb0b3b559010b75981b1bdce728da3ee90ad6",
 -                "reference": "ab2cb0b3b559010b75981b1bdce728da3ee90ad6",
 +                "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25",
 +                "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25",
                  "shasum": ""
              },
              "require": {
 -                "php": "^5.3.3 || ^7.0",
 +                "php": "^7.2 || ^8.0",
                  "symfony/polyfill-ctype": "^1.8"
              },
              "conflict": {
 -                "vimeo/psalm": "<3.9.1"
 +                "phpstan/phpstan": "<0.12.20",
 +                "vimeo/psalm": "<4.6.1 || 4.6.2"
              },
              "require-dev": {
 -                "phpunit/phpunit": "^4.8.36 || ^7.5.13"
 +                "phpunit/phpunit": "^8.5.13"
              },
              "type": "library",
 +            "extra": {
 +                "branch-alias": {
 +                    "dev-master": "1.10-dev"
 +                }
 +            },
              "autoload": {
                  "psr-4": {
                      "Webmozart\\Assert\\": "src/"
                  "check",
                  "validate"
              ],
 -            "time": "2020-04-18T12:12:48+00:00"
 -        },
 -        {
 -            "name": "wnx/laravel-stats",
 -            "version": "v2.0.2",
 -            "source": {
 -                "type": "git",
 -                "url": "https://github.com/stefanzweifel/laravel-stats.git",
 -                "reference": "e86ebfdd149383b18a41fe3efa1601d82d447140"
 -            },
 -            "dist": {
 -                "type": "zip",
 -                "url": "https://api.github.com/repos/stefanzweifel/laravel-stats/zipball/e86ebfdd149383b18a41fe3efa1601d82d447140",
 -                "reference": "e86ebfdd149383b18a41fe3efa1601d82d447140",
 -                "shasum": ""
 -            },
 -            "require": {
 -                "illuminate/console": "~5.8.0|^6.0|^7.0",
 -                "illuminate/support": "~5.8.0|^6.0|^7.0",
 -                "php": ">=7.2.0",
 -                "phploc/phploc": "~5.0|~6.0",
 -                "symfony/finder": "~4.0"
 -            },
 -            "require-dev": {
 -                "friendsofphp/php-cs-fixer": "^2.15",
 -                "laravel/browser-kit-testing": "~5.0",
 -                "laravel/dusk": "~5.0",
 -                "mockery/mockery": "^1.1",
 -                "orchestra/testbench": "^3.8|^4.0|^5.0",
 -                "phpunit/phpunit": "8.*|9.*"
 -            },
 -            "type": "library",
 -            "extra": {
 -                "laravel": {
 -                    "providers": [
 -                        "Wnx\\LaravelStats\\StatsServiceProvider"
 -                    ]
 -                }
 +            "support": {
 +                "issues": "https://github.com/webmozarts/assert/issues",
 +                "source": "https://github.com/webmozarts/assert/tree/1.10.0"
              },
 -            "autoload": {
 -                "psr-4": {
 -                    "Wnx\\LaravelStats\\": "src/"
 -                }
 -            },
 -            "notification-url": "https://packagist.org/downloads/",
 -            "license": [
 -                "MIT"
 -            ],
 -            "authors": [
 -                {
 -                    "name": "Stefan Zweifel",
 -                    "email": "[email protected]",
 -                    "homepage": "https://stefanzweifel.io",
 -                    "role": "Developer"
 -                }
 -            ],
 -            "description": "Get insights about your Laravel Project",
 -            "homepage": "https://github.com/stefanzweifel/laravel-stats",
 -            "keywords": [
 -                "laravel",
 -                "statistics",
 -                "stats",
 -                "wnx"
 -            ],
 -            "time": "2020-02-22T19:09:14+00:00"
 +            "time": "2021-03-09T10:59:23+00:00"
          }
      ],
      "aliases": [],
      "prefer-stable": true,
      "prefer-lowest": false,
      "platform": {
 -        "php": "^7.2",
 +        "php": "^7.3|^8.0",
          "ext-curl": "*",
          "ext-dom": "*",
 +        "ext-fileinfo": "*",
          "ext-gd": "*",
          "ext-json": "*",
          "ext-mbstring": "*",
 -        "ext-tidy": "*",
          "ext-xml": "*"
      },
      "platform-dev": [],
      "platform-overrides": {
 -        "php": "7.2.0"
 +        "php": "7.3.0"
      },
 -    "plugin-api-version": "1.1.0"
 +    "plugin-api-version": "2.1.0"
  }
index eb8ba54ea81506519a4958769d54086cc3b3d7be,ec4ce813ea67c3e58d407d753a43bbe6710d2a67..44f0c25a0d600990503d631e9dfc5d401e4e7cd8
@@@ -23,6 -23,10 +23,10 @@@ return 
      'saml_no_email_address' => 'Could not find an email address, for this user, in the data provided by the external authentication system',
      'saml_invalid_response_id' => 'The request from the external authentication system is not recognised by a process started by this application. Navigating back after a login could cause this issue.',
      'saml_fail_authed' => 'Login using :system failed, system did not provide successful authorization',
+     'openid_already_logged_in' => 'Already logged in',
+     'openid_user_not_registered' => 'The user :name is not registered and automatic registration is disabled',
+     'openid_no_email_address' => 'Could not find an email address, for this user, in the data provided by the external authentication system',
+     'openid_fail_authed' => 'Login using :system failed, system did not provide successful authorization',
      'social_no_action_defined' => 'No action defined',
      'social_login_bad_response' => "Error received during :socialAccount login: \n:error",
      'social_account_in_use' => 'This :socialAccount account is already in use, Try logging in via the :socialAccount option.',
@@@ -46,6 -50,7 +50,6 @@@
      'file_upload_timeout' => 'The file upload has timed out.',
  
      // Attachments
 -    'attachment_page_mismatch' => 'Page mismatch during attachment update',
      'attachment_not_found' => 'Attachment not found',
  
      // Pages
@@@ -83,9 -88,6 +87,9 @@@
      '404_page_not_found' => 'Page Not Found',
      'sorry_page_not_found' => 'Sorry, The page you were looking for could not be found.',
      'sorry_page_not_found_permission_warning' => 'If you expected this page to exist, you might not have permission to view it.',
 +    'image_not_found' => 'Image Not Found',
 +    'image_not_found_subtitle' => 'Sorry, The image file you were looking for could not be found.',
 +    'image_not_found_details' => 'If you expected this image to exist it might have been deleted.',
      'return_home' => 'Return to home',
      'error_occurred' => 'An Error Occurred',
      'app_down' => ':appName is down right now',
index 0000000000000000000000000000000000000000,b1ef51d1363a7c44a122c7774163868a1818484a..ba975ebf4e914e7bd76324a0f62bb456b7730536
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,11 +1,11 @@@
 -</form>
+ <form action="{{ url('/openid/login') }}" method="POST" id="login-form" class="mt-l">
+     {!! csrf_field() !!}
+     <div>
+         <button id="saml-login" class="button outline block svg">
+             @icon('saml2')
+             <span>{{ trans('auth.log_in_with', ['socialDriver' => config('openid.name')]) }}</span>
+         </button>
+     </div>
++</form>
index 2311ce3e019e9f529ef2fbde6569a518db4f11c6,996d44d27a2f635f31a8a47d0518cbe34abe4b4b..cac585a65bb3c76f1ca22c2b1225fe450a6e817a
@@@ -1,4 -1,4 +1,4 @@@
 -<header id="header" header-mobile-toggle class="primary-background">
 +<header id="header" component="header-mobile-toggle" class="primary-background">
      <div class="grid mx-l">
  
          <div>
                      <span class="logo-text">{{ setting('app-name') }}</span>
                  @endif
              </a>
 -            <div class="mobile-menu-toggle hide-over-l">@icon('more')</div>
 +            <button type="button"
 +                    refs="header-mobile-toggle@toggle"
 +                    title="{{ trans('common.header_menu_expand') }}"
 +                    aria-expanded="false"
 +                    class="mobile-menu-toggle hide-over-l">@icon('more')</button>
          </div>
  
 -        <div class="header-search hide-under-l">
 +        <div class="flex-container-row justify-center hide-under-l">
              @if (hasAppAccess())
              <form action="{{ url('/search') }}" method="GET" class="search-box" role="search">
                  <button id="header-search-box-button" type="submit" aria-label="{{ trans('common.search') }}" tabindex="-1">@icon('search') </button>
          </div>
  
          <div class="text-right">
 -            <nav class="header-links">
 +            <nav refs="header-mobile-toggle@menu" class="header-links">
                  <div class="links text-center">
                      @if (hasAppAccess())
                          <a class="hide-over-l" href="{{ url('/search') }}">@icon('search'){{ trans('common.search') }}</a>
 -                        @if(userCanOnAny('view', \BookStack\Entities\Bookshelf::class) || userCan('bookshelf-view-all') || userCan('bookshelf-view-own'))
 +                        @if(userCanOnAny('view', \BookStack\Entities\Models\Bookshelf::class) || userCan('bookshelf-view-all') || userCan('bookshelf-view-own'))
                              <a href="{{ url('/shelves') }}">@icon('bookshelf'){{ trans('entities.shelves') }}</a>
                          @endif
                          <a href="{{ url('/books') }}">@icon('books'){{ trans('entities.books') }}</a>
@@@ -54,7 -50,7 +54,7 @@@
                  </div>
                  @if(signedInUser())
                      <?php $currentUser = user(); ?>
 -                    <div class="dropdown-container" component="dropdown">
 +                    <div class="dropdown-container" component="dropdown" option:dropdown:bubble-escapes="true">
                          <span class="user-name py-s hide-under-l" refs="dropdown@toggle"
                                aria-haspopup="true" aria-expanded="false" aria-label="{{ trans('common.profile_menu') }}" tabindex="0">
                              <img class="avatar" src="{{$currentUser->getAvatar(30)}}" alt="{{ $currentUser->name }}">
                          </span>
                          <ul refs="dropdown@menu" class="dropdown-menu" role="menu">
                              <li>
 -                                <a href="{{ url("/user/{$currentUser->id}") }}">@icon('user'){{ trans('common.view_profile') }}</a>
 +                                <a href="{{ url('/favourites') }}">@icon('star'){{ trans('entities.my_favourites') }}</a>
                              </li>
                              <li>
 -                                <a href="{{ url("/settings/users/{$currentUser->id}") }}">@icon('edit'){{ trans('common.edit_profile') }}</a>
 +                                <a href="{{ $currentUser->getProfileUrl() }}">@icon('user'){{ trans('common.view_profile') }}</a>
 +                            </li>
 +                            <li>
 +                                <a href="{{ $currentUser->getEditUrl() }}">@icon('edit'){{ trans('common.edit_profile') }}</a>
                              </li>
                              <li>
                                  @if(config('auth.method') === 'saml2')
                                      <a href="{{ url('/saml2/logout') }}">@icon('logout'){{ trans('auth.logout') }}</a>
+                                 @elseif(config('auth.method') === 'openid')
+                                     <a href="{{ url('/openid/logout') }}">@icon('logout'){{ trans('auth.logout') }}</a>
                                  @else
                                      <a href="{{ url('/logout') }}">@icon('logout'){{ trans('auth.logout') }}</a>
                                  @endif
                              </li>
                              <li><hr></li>
                              <li>
 -                                @include('partials.dark-mode-toggle')
 +                                @include('common.dark-mode-toggle')
                              </li>
                          </ul>
                      </div>
index c87d84c5ef24eeee8252003721317c6b142b51b5,500db64e6554dac4fcb0856f68f4b02d0cb2b2da..8d63244e19bf5b8fa9af6ac8d6a41123f1d860f9
@@@ -1,9 -1,18 +1,9 @@@
 -@extends('simple-layout')
 +@extends('layouts.simple')
  
  @section('body')
      <div class="container small">
  
 -        <div class="grid left-focus v-center no-row-gap">
 -            <div class="py-m">
 -                @include('settings.navbar', ['selected' => 'settings'])
 -            </div>
 -            <div class="text-right p-m">
 -                <a target="_blank" rel="noopener noreferrer" href="https://github.com/BookStackApp/BookStack/releases">
 -                    BookStack @if(strpos($version, 'v') !== 0) version @endif {{ $version }}
 -                </a>
 -            </div>
 -        </div>
 +        @include('settings.parts.navbar-with-version', ['selected' => 'settings'])
  
          <div class="card content-wrap auto-height">
              <h2 id="features" class="list-heading">{{ trans('settings.app_features_security') }}</h2>
@@@ -25,7 -34,7 +25,7 @@@
                              @endif
                          </div>
                          <div>
 -                            @include('components.toggle-switch', [
 +                            @include('form.toggle-switch', [
                                  'name' => 'setting-app-public',
                                  'value' => setting('app-public'),
                                  'label' => trans('settings.app_public_access_toggle'),
@@@ -39,7 -48,7 +39,7 @@@
                              <p class="small">{{ trans('settings.app_secure_images_desc') }}</p>
                          </div>
                          <div>
 -                            @include('components.toggle-switch', [
 +                            @include('form.toggle-switch', [
                                  'name' => 'setting-app-secure-images',
                                  'value' => setting('app-secure-images'),
                                  'label' => trans('settings.app_secure_images_toggle'),
@@@ -53,7 -62,7 +53,7 @@@
                              <p class="small">{!! trans('settings.app_disable_comments_desc') !!}</p>
                          </div>
                          <div>
 -                            @include('components.toggle-switch', [
 +                            @include('form.toggle-switch', [
                                  'name' => 'setting-app-disable-comments',
                                  'value' => setting('app-disable-comments'),
                                  'label' => trans('settings.app_disable_comments_toggle'),
@@@ -85,7 -94,7 +85,7 @@@
                          </div>
                          <div class="pt-xs">
                              <input type="text" value="{{ setting('app-name', 'BookStack') }}" name="setting-app-name" id="setting-app-name">
 -                            @include('components.toggle-switch', [
 +                            @include('form.toggle-switch', [
                                  'name' => 'setting-app-name-header',
                                  'value' => setting('app-name-header'),
                                  'label' => trans('settings.app_name_header'),
                              <p class="small">{!! trans('settings.app_logo_desc') !!}</p>
                          </div>
                          <div class="pt-xs">
 -                            @include('components.image-picker', [
 +                            @include('form.image-picker', [
                                       'removeName' => 'setting-app-logo',
                                       'removeValue' => 'none',
                                       'defaultImage' => url('/logo.png'),
                          </div>
                          <div class="grid half pt-m">
                              <div>
 -                                @include('components.setting-entity-color-picker', ['type' => 'bookshelf'])
 -                                @include('components.setting-entity-color-picker', ['type' => 'book'])
 -                                @include('components.setting-entity-color-picker', ['type' => 'chapter'])
 +                                @include('settings.parts.setting-entity-color-picker', ['type' => 'bookshelf'])
 +                                @include('settings.parts.setting-entity-color-picker', ['type' => 'book'])
 +                                @include('settings.parts.setting-entity-color-picker', ['type' => 'chapter'])
                              </div>
                              <div>
 -                                @include('components.setting-entity-color-picker', ['type' => 'page'])
 -                                @include('components.setting-entity-color-picker', ['type' => 'page-draft'])
 +                                @include('settings.parts.setting-entity-color-picker', ['type' => 'page'])
 +                                @include('settings.parts.setting-entity-color-picker', ['type' => 'page-draft'])
                              </div>
                          </div>
                      </div>
                              </select>
  
                              <div page-picker-container style="display: none;" class="mt-m">
 -                                @include('components.page-picker', ['name' => 'setting-app-homepage', 'placeholder' => trans('settings.app_homepage_select'), 'value' => setting('app-homepage')])
 +                                @include('settings.parts.page-picker', ['name' => 'setting-app-homepage', 'placeholder' => trans('settings.app_homepage_select'), 'value' => setting('app-homepage')])
                              </div>
                          </div>
                      </div>
  
 +                    <div>
 +                        <label for="setting-app-privacy-link" class="setting-list-label">{{ trans('settings.app_footer_links') }}</label>
 +                        <p class="small mb-m">{{ trans('settings.app_footer_links_desc') }}</p>
 +                        @include('settings.parts.footer-links', ['name' => 'setting-app-footer-links', 'value' => setting('app-footer-links', [])])
 +                    </div>
 +
  
                      <div>
                          <label for="setting-app-custom-head" class="setting-list-label">{{ trans('settings.app_custom_html') }}</label>
                              <p class="small">{!! trans('settings.reg_enable_desc') !!}</p>
                          </div>
                          <div>
 -                            @include('components.toggle-switch', [
 +                            @include('form.toggle-switch', [
                                  'name' => 'setting-registration-enabled',
                                  'value' => setting('registration-enabled'),
                                  'label' => trans('settings.reg_enable_toggle')
                              ])
  
-                             @if(in_array(config('auth.method'), ['ldap', 'saml2']))
+                             @if(in_array(config('auth.method'), ['ldap', 'saml2', 'openid']))
                                  <div class="text-warn text-small mb-l">{{ trans('settings.reg_enable_external_warning') }}</div>
                              @endif
  
                              <label for="setting-registration-role">{{ trans('settings.reg_default_role') }}</label>
                              <select id="setting-registration-role" name="setting-registration-role" @if($errors->has('setting-registration-role')) class="neg" @endif>
                                  @foreach(\BookStack\Auth\Role::all() as $role)
 -                                    <option value="{{$role->id}}" data-role-name="{{ $role->name }}"
 +                                    <option value="{{$role->id}}"
 +                                            data-system-role-name="{{ $role->system_name ?? '' }}"
                                              @if(setting('registration-role', \BookStack\Auth\Role::first()->id) == $role->id) selected @endif
                                      >
                                          {{ $role->display_name }}
                              <p class="small">{{ trans('settings.reg_confirm_email_desc') }}</p>
                          </div>
                          <div>
 -                            @include('components.toggle-switch', [
 +                            @include('form.toggle-switch', [
                                  'name' => 'setting-registration-confirmation',
                                  'value' => setting('registration-confirmation'),
                                  'label' => trans('settings.reg_email_confirmation_toggle')
  
      </div>
  
 -    @include('components.image-manager', ['imageType' => 'system'])
 -    @include('components.entity-selector-popup', ['entityTypes' => 'page'])
 +    @include('entities.selector-popup', ['entityTypes' => 'page'])
  @stop
index 0000000000000000000000000000000000000000,b5aa96911e36e699e893fed8d9a3c81d0689d6fa..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,259 +1,0 @@@
 -{!! csrf_field() !!}
 -
 -<div class="card content-wrap">
 -    <h1 class="list-heading">{{ $title }}</h1>
 -
 -    <div class="setting-list">
 -
 -        <div class="grid half">
 -            <div>
 -                <label class="setting-list-label">{{ trans('settings.role_details') }}</label>
 -            </div>
 -            <div>
 -                <div class="form-group">
 -                    <label for="name">{{ trans('settings.role_name') }}</label>
 -                    @include('form.text', ['name' => 'display_name'])
 -                </div>
 -                <div class="form-group">
 -                    <label for="name">{{ trans('settings.role_desc') }}</label>
 -                    @include('form.text', ['name' => 'description'])
 -                </div>
 -
 -                @if(config('auth.method') === 'ldap' || config('auth.method') === 'saml2' || config('auth.method') === 'openid')
 -                    <div class="form-group">
 -                        <label for="name">{{ trans('settings.role_external_auth_id') }}</label>
 -                        @include('form.text', ['name' => 'external_auth_id'])
 -                    </div>
 -                @endif
 -            </div>
 -        </div>
 -
 -        <div class="grid half" permissions-table>
 -            <div>
 -                <label class="setting-list-label">{{ trans('settings.role_system') }}</label>
 -                <a href="#" permissions-table-toggle-all class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
 -            </div>
 -            <div class="toggle-switch-list">
 -                <div>@include('settings.roles.checkbox', ['permission' => 'settings-manage', 'label' => trans('settings.role_manage_settings')])</div>
 -                <div>@include('settings.roles.checkbox', ['permission' => 'users-manage', 'label' => trans('settings.role_manage_users')])</div>
 -                <div>@include('settings.roles.checkbox', ['permission' => 'user-roles-manage', 'label' => trans('settings.role_manage_roles')])</div>
 -                <div>@include('settings.roles.checkbox', ['permission' => 'restrictions-manage-all', 'label' => trans('settings.role_manage_entity_permissions')])</div>
 -                <div>@include('settings.roles.checkbox', ['permission' => 'restrictions-manage-own', 'label' => trans('settings.role_manage_own_entity_permissions')])</div>
 -                <div>@include('settings.roles.checkbox', ['permission' => 'templates-manage', 'label' => trans('settings.role_manage_page_templates')])</div>
 -                <div>@include('settings.roles.checkbox', ['permission' => 'access-api', 'label' => trans('settings.role_access_api')])</div>
 -            </div>
 -        </div>
 -
 -        <div>
 -            <label class="setting-list-label">{{ trans('settings.role_asset') }}</label>
 -            <p>{{ trans('settings.role_asset_desc') }}</p>
 -
 -            @if (isset($role) && $role->system_name === 'admin')
 -                <p class="text-warn">{{ trans('settings.role_asset_admins') }}</p>
 -            @endif
 -
 -            <table permissions-table class="table toggle-switch-list compact permissions-table">
 -                <tr>
 -                    <th width="20%">
 -                        <a href="#" permissions-table-toggle-all class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
 -                    </th>
 -                    <th width="20%" permissions-table-toggle-all-in-column>{{ trans('common.create') }}</th>
 -                    <th width="20%" permissions-table-toggle-all-in-column>{{ trans('common.view') }}</th>
 -                    <th width="20%" permissions-table-toggle-all-in-column>{{ trans('common.edit') }}</th>
 -                    <th width="20%" permissions-table-toggle-all-in-column>{{ trans('common.delete') }}</th>
 -                </tr>
 -                <tr>
 -                    <td>
 -                        <div>{{ trans('entities.shelves_long') }}</div>
 -                        <a href="#" permissions-table-toggle-all-in-row class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
 -                    </td>
 -                    <td>
 -                        @include('settings.roles.checkbox', ['permission' => 'bookshelf-create-all', 'label' => trans('settings.role_all')])
 -                    </td>
 -                    <td>
 -                        @include('settings.roles.checkbox', ['permission' => 'bookshelf-view-own', 'label' => trans('settings.role_own')])
 -                        <br>
 -                        @include('settings.roles.checkbox', ['permission' => 'bookshelf-view-all', 'label' => trans('settings.role_all')])
 -                    </td>
 -                    <td>
 -                        @include('settings.roles.checkbox', ['permission' => 'bookshelf-update-own', 'label' => trans('settings.role_own')])
 -                        <br>
 -                        @include('settings.roles.checkbox', ['permission' => 'bookshelf-update-all', 'label' => trans('settings.role_all')])
 -                    </td>
 -                    <td>
 -                        @include('settings.roles.checkbox', ['permission' => 'bookshelf-delete-own', 'label' => trans('settings.role_own')])
 -                        <br>
 -                        @include('settings.roles.checkbox', ['permission' => 'bookshelf-delete-all', 'label' => trans('settings.role_all')])
 -                    </td>
 -                </tr>
 -                <tr>
 -                    <td>
 -                        <div>{{ trans('entities.books') }}</div>
 -                        <a href="#" permissions-table-toggle-all-in-row class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
 -                    </td>
 -                    <td>
 -                        @include('settings.roles.checkbox', ['permission' => 'book-create-all', 'label' => trans('settings.role_all')])
 -                    </td>
 -                    <td>
 -                        @include('settings.roles.checkbox', ['permission' => 'book-view-own', 'label' => trans('settings.role_own')])
 -                        <br>
 -                        @include('settings.roles.checkbox', ['permission' => 'book-view-all', 'label' => trans('settings.role_all')])
 -                    </td>
 -                    <td>
 -                        @include('settings.roles.checkbox', ['permission' => 'book-update-own', 'label' => trans('settings.role_own')])
 -                        <br>
 -                        @include('settings.roles.checkbox', ['permission' => 'book-update-all', 'label' => trans('settings.role_all')])
 -                    </td>
 -                    <td>
 -                        @include('settings.roles.checkbox', ['permission' => 'book-delete-own', 'label' => trans('settings.role_own')])
 -                        <br>
 -                        @include('settings.roles.checkbox', ['permission' => 'book-delete-all', 'label' => trans('settings.role_all')])
 -                    </td>
 -                </tr>
 -                <tr>
 -                    <td>
 -                        <div>{{ trans('entities.chapters') }}</div>
 -                        <a href="#" permissions-table-toggle-all-in-row class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
 -                    </td>
 -                    <td>
 -                        @include('settings.roles.checkbox', ['permission' => 'chapter-create-own', 'label' => trans('settings.role_own')])
 -                        <br>
 -                        @include('settings.roles.checkbox', ['permission' => 'chapter-create-all', 'label' => trans('settings.role_all')])
 -                    </td>
 -                    <td>
 -                        @include('settings.roles.checkbox', ['permission' => 'chapter-view-own', 'label' => trans('settings.role_own')])
 -                        <br>
 -                        @include('settings.roles.checkbox', ['permission' => 'chapter-view-all', 'label' => trans('settings.role_all')])
 -                    </td>
 -                    <td>
 -                        @include('settings.roles.checkbox', ['permission' => 'chapter-update-own', 'label' => trans('settings.role_own')])
 -                        <br>
 -                        @include('settings.roles.checkbox', ['permission' => 'chapter-update-all', 'label' => trans('settings.role_all')])
 -                    </td>
 -                    <td>
 -                        @include('settings.roles.checkbox', ['permission' => 'chapter-delete-own', 'label' => trans('settings.role_own')])
 -                        <br>
 -                        @include('settings.roles.checkbox', ['permission' => 'chapter-delete-all', 'label' => trans('settings.role_all')])
 -                    </td>
 -                </tr>
 -                <tr>
 -                    <td>
 -                        <div>{{ trans('entities.pages') }}</div>
 -                        <a href="#" permissions-table-toggle-all-in-row class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
 -                    </td>
 -                    <td>
 -                        @include('settings.roles.checkbox', ['permission' => 'page-create-own', 'label' => trans('settings.role_own')])
 -                        <br>
 -                        @include('settings.roles.checkbox', ['permission' => 'page-create-all', 'label' => trans('settings.role_all')])
 -                    </td>
 -                    <td>
 -                        @include('settings.roles.checkbox', ['permission' => 'page-view-own', 'label' => trans('settings.role_own')])
 -                        <br>
 -                        @include('settings.roles.checkbox', ['permission' => 'page-view-all', 'label' => trans('settings.role_all')])
 -                    </td>
 -                    <td>
 -                        @include('settings.roles.checkbox', ['permission' => 'page-update-own', 'label' => trans('settings.role_own')])
 -                        <br>
 -                        @include('settings.roles.checkbox', ['permission' => 'page-update-all', 'label' => trans('settings.role_all')])
 -                    </td>
 -                    <td>
 -                        @include('settings.roles.checkbox', ['permission' => 'page-delete-own', 'label' => trans('settings.role_own')])
 -                        <br>
 -                        @include('settings.roles.checkbox', ['permission' => 'page-delete-all', 'label' => trans('settings.role_all')])
 -                    </td>
 -                </tr>
 -                <tr>
 -                    <td>
 -                        <div>{{ trans('entities.images') }}</div>
 -                        <a href="#" permissions-table-toggle-all-in-row class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
 -                    </td>
 -                    <td>@include('settings.roles.checkbox', ['permission' => 'image-create-all', 'label' => ''])</td>
 -                    <td style="line-height:1.2;"><small class="faded">{{ trans('settings.role_controlled_by_asset') }}</small></td>
 -                    <td>
 -                        @include('settings.roles.checkbox', ['permission' => 'image-update-own', 'label' => trans('settings.role_own')])
 -                        <br>
 -                        @include('settings.roles.checkbox', ['permission' => 'image-update-all', 'label' => trans('settings.role_all')])
 -                    </td>
 -                    <td>
 -                        @include('settings.roles.checkbox', ['permission' => 'image-delete-own', 'label' => trans('settings.role_own')])
 -                        <br>
 -                        @include('settings.roles.checkbox', ['permission' => 'image-delete-all', 'label' => trans('settings.role_all')])
 -                    </td>
 -                </tr>
 -                <tr>
 -                    <td>
 -                        <div>{{ trans('entities.attachments') }}</div>
 -                        <a href="#" permissions-table-toggle-all-in-row class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
 -                    </td>
 -                    <td>@include('settings.roles.checkbox', ['permission' => 'attachment-create-all', 'label' => ''])</td>
 -                    <td style="line-height:1.2;"><small class="faded">{{ trans('settings.role_controlled_by_asset') }}</small></td>
 -                    <td>
 -                        @include('settings.roles.checkbox', ['permission' => 'attachment-update-own', 'label' => trans('settings.role_own')])
 -                        <br>
 -                        @include('settings.roles.checkbox', ['permission' => 'attachment-update-all', 'label' => trans('settings.role_all')])
 -                    </td>
 -                    <td>
 -                        @include('settings.roles.checkbox', ['permission' => 'attachment-delete-own', 'label' => trans('settings.role_own')])
 -                        <br>
 -                        @include('settings.roles.checkbox', ['permission' => 'attachment-delete-all', 'label' => trans('settings.role_all')])
 -                    </td>
 -                </tr>
 -                <tr>
 -                    <td>
 -                        <div>{{ trans('entities.comments') }}</div>
 -                        <a href="#" permissions-table-toggle-all-in-row class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
 -                    </td>
 -                    <td>@include('settings.roles.checkbox', ['permission' => 'comment-create-all', 'label' => ''])</td>
 -                    <td style="line-height:1.2;"><small class="faded">{{ trans('settings.role_controlled_by_asset') }}</small></td>
 -                    <td>
 -                        @include('settings.roles.checkbox', ['permission' => 'comment-update-own', 'label' => trans('settings.role_own')])
 -                        <br>
 -                        @include('settings.roles.checkbox', ['permission' => 'comment-update-all', 'label' => trans('settings.role_all')])
 -                    </td>
 -                    <td>
 -                        @include('settings.roles.checkbox', ['permission' => 'comment-delete-own', 'label' => trans('settings.role_own')])
 -                        <br>
 -                        @include('settings.roles.checkbox', ['permission' => 'comment-delete-all', 'label' => trans('settings.role_all')])
 -                    </td>
 -                </tr>
 -            </table>
 -        </div>
 -    </div>
 -
 -    <div class="form-group text-right">
 -        <a href="{{ url("/settings/roles") }}" class="button outline">{{ trans('common.cancel') }}</a>
 -        @if (isset($role) && $role->id)
 -            <a href="{{ url("/settings/roles/delete/{$role->id}") }}" class="button outline">{{ trans('settings.role_delete') }}</a>
 -        @endif
 -        <button type="submit" class="button">{{ trans('settings.role_save') }}</button>
 -    </div>
 -
 -</div>
 -
 -<div class="card content-wrap auto-height">
 -    <h2 class="list-heading">{{ trans('settings.role_users') }}</h2>
 -    @if(isset($role) && count($role->users) > 0)
 -        <div class="grid third">
 -            @foreach($role->users as $user)
 -                <div class="user-list-item">
 -                    <div>
 -                        <img class="avatar small" src="{{ $user->getAvatar(40) }}" alt="{{ $user->name }}">
 -                    </div>
 -                    <div>
 -                        @if(userCan('users-manage') || $currentUser->id == $user->id)
 -                            <a href="{{ url("/settings/users/{$user->id}") }}">
 -                                @endif
 -                                {{ $user->name }}
 -                                @if(userCan('users-manage') || $currentUser->id == $user->id)
 -                            </a>
 -                        @endif
 -                    </div>
 -                </div>
 -            @endforeach
 -        </div>
 -    @else
 -        <p class="text-muted">
 -            {{ trans('settings.role_users_none') }}
 -        </p>
 -    @endif
 -</div>
index 2f94398b5449846b89c57b3b7686bbe3369686ee,0000000000000000000000000000000000000000..3f7f8fd1fc982d63c5f0989f64f21e43e5fbb5f0
mode 100644,000000..100644
--- /dev/null
@@@ -1,267 -1,0 +1,267 @@@
-                 @if(config('auth.method') === 'ldap' || config('auth.method') === 'saml2')
 +{!! csrf_field() !!}
 +
 +<div class="card content-wrap">
 +    <h1 class="list-heading">{{ $title }}</h1>
 +
 +    <div class="setting-list">
 +
 +        <div class="grid half">
 +            <div>
 +                <label class="setting-list-label">{{ trans('settings.role_details') }}</label>
 +            </div>
 +            <div>
 +                <div class="form-group">
 +                    <label for="display_name">{{ trans('settings.role_name') }}</label>
 +                    @include('form.text', ['name' => 'display_name'])
 +                </div>
 +                <div class="form-group">
 +                    <label for="description">{{ trans('settings.role_desc') }}</label>
 +                    @include('form.text', ['name' => 'description'])
 +                </div>
 +                <div class="form-group">
 +                    @include('form.checkbox', ['name' => 'mfa_enforced', 'label' => trans('settings.role_mfa_enforced') ])
 +                </div>
 +
++                @if(in_array(config('auth.method'), ['ldap', 'saml2', 'openid']))
 +                    <div class="form-group">
 +                        <label for="name">{{ trans('settings.role_external_auth_id') }}</label>
 +                        @include('form.text', ['name' => 'external_auth_id'])
 +                    </div>
 +                @endif
 +            </div>
 +        </div>
 +
 +        <div permissions-table>
 +            <label class="setting-list-label">{{ trans('settings.role_system') }}</label>
 +            <a href="#" permissions-table-toggle-all class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
 +
 +            <div class="toggle-switch-list grid half mt-m">
 +                <div>
 +                    <div>@include('settings.roles.parts.checkbox', ['permission' => 'restrictions-manage-all', 'label' => trans('settings.role_manage_entity_permissions')])</div>
 +                    <div>@include('settings.roles.parts.checkbox', ['permission' => 'restrictions-manage-own', 'label' => trans('settings.role_manage_own_entity_permissions')])</div>
 +                    <div>@include('settings.roles.parts.checkbox', ['permission' => 'templates-manage', 'label' => trans('settings.role_manage_page_templates')])</div>
 +                    <div>@include('settings.roles.parts.checkbox', ['permission' => 'access-api', 'label' => trans('settings.role_access_api')])</div>
 +                    <div>@include('settings.roles.parts.checkbox', ['permission' => 'content-export', 'label' => trans('settings.role_export_content')])</div>
 +                </div>
 +                <div>
 +                    <div>@include('settings.roles.parts.checkbox', ['permission' => 'settings-manage', 'label' => trans('settings.role_manage_settings')])</div>
 +                    <div>@include('settings.roles.parts.checkbox', ['permission' => 'users-manage', 'label' => trans('settings.role_manage_users')])</div>
 +                    <div>@include('settings.roles.parts.checkbox', ['permission' => 'user-roles-manage', 'label' => trans('settings.role_manage_roles')])</div>
 +                    <p class="text-warn text-small mt-s mb-none">{{ trans('settings.roles_system_warning') }}</p>
 +                </div>
 +            </div>
 +        </div>
 +
 +        <div>
 +            <label class="setting-list-label">{{ trans('settings.role_asset') }}</label>
 +            <p>{{ trans('settings.role_asset_desc') }}</p>
 +
 +            @if (isset($role) && $role->system_name === 'admin')
 +                <p class="text-warn">{{ trans('settings.role_asset_admins') }}</p>
 +            @endif
 +
 +            <table permissions-table class="table toggle-switch-list compact permissions-table">
 +                <tr>
 +                    <th width="20%">
 +                        <a href="#" permissions-table-toggle-all class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
 +                    </th>
 +                    <th width="20%" permissions-table-toggle-all-in-column>{{ trans('common.create') }}</th>
 +                    <th width="20%" permissions-table-toggle-all-in-column>{{ trans('common.view') }}</th>
 +                    <th width="20%" permissions-table-toggle-all-in-column>{{ trans('common.edit') }}</th>
 +                    <th width="20%" permissions-table-toggle-all-in-column>{{ trans('common.delete') }}</th>
 +                </tr>
 +                <tr>
 +                    <td>
 +                        <div>{{ trans('entities.shelves_long') }}</div>
 +                        <a href="#" permissions-table-toggle-all-in-row class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
 +                    </td>
 +                    <td>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'bookshelf-create-all', 'label' => trans('settings.role_all')])
 +                    </td>
 +                    <td>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'bookshelf-view-own', 'label' => trans('settings.role_own')])
 +                        <br>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'bookshelf-view-all', 'label' => trans('settings.role_all')])
 +                    </td>
 +                    <td>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'bookshelf-update-own', 'label' => trans('settings.role_own')])
 +                        <br>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'bookshelf-update-all', 'label' => trans('settings.role_all')])
 +                    </td>
 +                    <td>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'bookshelf-delete-own', 'label' => trans('settings.role_own')])
 +                        <br>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'bookshelf-delete-all', 'label' => trans('settings.role_all')])
 +                    </td>
 +                </tr>
 +                <tr>
 +                    <td>
 +                        <div>{{ trans('entities.books') }}</div>
 +                        <a href="#" permissions-table-toggle-all-in-row class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
 +                    </td>
 +                    <td>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'book-create-all', 'label' => trans('settings.role_all')])
 +                    </td>
 +                    <td>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'book-view-own', 'label' => trans('settings.role_own')])
 +                        <br>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'book-view-all', 'label' => trans('settings.role_all')])
 +                    </td>
 +                    <td>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'book-update-own', 'label' => trans('settings.role_own')])
 +                        <br>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'book-update-all', 'label' => trans('settings.role_all')])
 +                    </td>
 +                    <td>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'book-delete-own', 'label' => trans('settings.role_own')])
 +                        <br>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'book-delete-all', 'label' => trans('settings.role_all')])
 +                    </td>
 +                </tr>
 +                <tr>
 +                    <td>
 +                        <div>{{ trans('entities.chapters') }}</div>
 +                        <a href="#" permissions-table-toggle-all-in-row class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
 +                    </td>
 +                    <td>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'chapter-create-own', 'label' => trans('settings.role_own')])
 +                        <br>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'chapter-create-all', 'label' => trans('settings.role_all')])
 +                    </td>
 +                    <td>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'chapter-view-own', 'label' => trans('settings.role_own')])
 +                        <br>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'chapter-view-all', 'label' => trans('settings.role_all')])
 +                    </td>
 +                    <td>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'chapter-update-own', 'label' => trans('settings.role_own')])
 +                        <br>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'chapter-update-all', 'label' => trans('settings.role_all')])
 +                    </td>
 +                    <td>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'chapter-delete-own', 'label' => trans('settings.role_own')])
 +                        <br>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'chapter-delete-all', 'label' => trans('settings.role_all')])
 +                    </td>
 +                </tr>
 +                <tr>
 +                    <td>
 +                        <div>{{ trans('entities.pages') }}</div>
 +                        <a href="#" permissions-table-toggle-all-in-row class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
 +                    </td>
 +                    <td>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'page-create-own', 'label' => trans('settings.role_own')])
 +                        <br>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'page-create-all', 'label' => trans('settings.role_all')])
 +                    </td>
 +                    <td>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'page-view-own', 'label' => trans('settings.role_own')])
 +                        <br>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'page-view-all', 'label' => trans('settings.role_all')])
 +                    </td>
 +                    <td>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'page-update-own', 'label' => trans('settings.role_own')])
 +                        <br>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'page-update-all', 'label' => trans('settings.role_all')])
 +                    </td>
 +                    <td>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'page-delete-own', 'label' => trans('settings.role_own')])
 +                        <br>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'page-delete-all', 'label' => trans('settings.role_all')])
 +                    </td>
 +                </tr>
 +                <tr>
 +                    <td>
 +                        <div>{{ trans('entities.images') }}</div>
 +                        <a href="#" permissions-table-toggle-all-in-row class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
 +                    </td>
 +                    <td>@include('settings.roles.parts.checkbox', ['permission' => 'image-create-all', 'label' => ''])</td>
 +                    <td style="line-height:1.2;"><small class="faded">{{ trans('settings.role_controlled_by_asset') }}</small></td>
 +                    <td>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'image-update-own', 'label' => trans('settings.role_own')])
 +                        <br>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'image-update-all', 'label' => trans('settings.role_all')])
 +                    </td>
 +                    <td>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'image-delete-own', 'label' => trans('settings.role_own')])
 +                        <br>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'image-delete-all', 'label' => trans('settings.role_all')])
 +                    </td>
 +                </tr>
 +                <tr>
 +                    <td>
 +                        <div>{{ trans('entities.attachments') }}</div>
 +                        <a href="#" permissions-table-toggle-all-in-row class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
 +                    </td>
 +                    <td>@include('settings.roles.parts.checkbox', ['permission' => 'attachment-create-all', 'label' => ''])</td>
 +                    <td style="line-height:1.2;"><small class="faded">{{ trans('settings.role_controlled_by_asset') }}</small></td>
 +                    <td>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'attachment-update-own', 'label' => trans('settings.role_own')])
 +                        <br>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'attachment-update-all', 'label' => trans('settings.role_all')])
 +                    </td>
 +                    <td>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'attachment-delete-own', 'label' => trans('settings.role_own')])
 +                        <br>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'attachment-delete-all', 'label' => trans('settings.role_all')])
 +                    </td>
 +                </tr>
 +                <tr>
 +                    <td>
 +                        <div>{{ trans('entities.comments') }}</div>
 +                        <a href="#" permissions-table-toggle-all-in-row class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
 +                    </td>
 +                    <td>@include('settings.roles.parts.checkbox', ['permission' => 'comment-create-all', 'label' => ''])</td>
 +                    <td style="line-height:1.2;"><small class="faded">{{ trans('settings.role_controlled_by_asset') }}</small></td>
 +                    <td>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'comment-update-own', 'label' => trans('settings.role_own')])
 +                        <br>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'comment-update-all', 'label' => trans('settings.role_all')])
 +                    </td>
 +                    <td>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'comment-delete-own', 'label' => trans('settings.role_own')])
 +                        <br>
 +                        @include('settings.roles.parts.checkbox', ['permission' => 'comment-delete-all', 'label' => trans('settings.role_all')])
 +                    </td>
 +                </tr>
 +            </table>
 +        </div>
 +    </div>
 +
 +    <div class="form-group text-right">
 +        <a href="{{ url("/settings/roles") }}" class="button outline">{{ trans('common.cancel') }}</a>
 +        @if (isset($role) && $role->id)
 +            <a href="{{ url("/settings/roles/delete/{$role->id}") }}" class="button outline">{{ trans('settings.role_delete') }}</a>
 +        @endif
 +        <button type="submit" class="button">{{ trans('settings.role_save') }}</button>
 +    </div>
 +
 +</div>
 +
 +<div class="card content-wrap auto-height">
 +    <h2 class="list-heading">{{ trans('settings.role_users') }}</h2>
 +    @if(count($role->users ?? []) > 0)
 +        <div class="grid third">
 +            @foreach($role->users as $user)
 +                <div class="user-list-item">
 +                    <div>
 +                        <img class="avatar small" src="{{ $user->getAvatar(40) }}" alt="{{ $user->name }}">
 +                    </div>
 +                    <div>
 +                        @if(userCan('users-manage') || user()->id == $user->id)
 +                            <a href="{{ url("/settings/users/{$user->id}") }}">
 +                                @endif
 +                                {{ $user->name }}
 +                                @if(userCan('users-manage') || user()->id == $user->id)
 +                            </a>
 +                        @endif
 +                    </div>
 +                </div>
 +            @endforeach
 +        </div>
 +    @else
 +        <p class="text-muted">
 +            {{ trans('settings.role_users_none') }}
 +        </p>
 +    @endif
 +</div>
index 7105e2ff14458578f978249728879bb1667b6c8d,f3e8cedff7f4fb151a908669efab605a26226ca5..ef8c611ef0610ed6ff674a5021d82510a9bfbb5c
@@@ -25,7 -25,7 +25,7 @@@
      </div>
  </div>
  
- @if(($authMethod === 'ldap' || $authMethod === 'saml2') && userCan('users-manage'))
 -@if(($authMethod === 'ldap' || $authMethod === 'saml2' || $authMethod === 'openid') && userCan('users-manage'))
++@if(in_array($authMethod, ['ldap', 'saml2', 'openid']) && userCan('users-manage'))
      <div class="grid half gap-xl v-center">
          <div>
              <label class="setting-list-label">{{ trans('settings.users_external_auth_id') }}</label>
@@@ -56,7 -56,7 +56,7 @@@
                  {{ trans('settings.users_send_invite_text') }}
              </p>
  
 -            @include('components.toggle-switch', [
 +            @include('form.toggle-switch', [
                  'name' => 'send_invite',
                  'value' => old('send_invite', 'true') === 'true',
                  'label' => trans('settings.users_send_invite_option')
@@@ -74,7 -74,7 +74,7 @@@
              <div class="grid half mt-m gap-xl">
                  <div>
                      <label for="password">{{ trans('auth.password') }}</label>
 -                    @include('form.password', ['name' => 'password'])
 +                    @include('form.password', ['name' => 'password', 'autocomplete' => 'new-password'])
                  </div>
                  <div>
                      <label for="password-confirm">{{ trans('auth.password_confirm') }}</label>
diff --combined routes/web.php
index 08adeceb947318a9f017f55424e4b5e91e09ccb7,a47080e8e1516906a4ade8c294afe939fd3b4098..fb4282539d24360d4b2426cae1455c6b3f5a5355
@@@ -1,7 -1,6 +1,7 @@@
  <?php
  
 -Route::get('/robots.txt', 'HomeController@getRobots');
 +Route::get('/status', 'StatusController@show');
 +Route::get('/robots.txt', 'HomeController@robots');
  
  // Authenticated routes...
  Route::group(['middleware' => 'auth'], function () {
      Route::get('/uploads/images/{path}', 'Images\ImageController@showImage')
          ->where('path', '.*$');
  
 +    // API docs routes
 +    Route::get('/api/docs', 'Api\ApiDocsController@display');
 +
      Route::get('/pages/recently-updated', 'PageController@showRecentlyUpdated');
  
      // Shelves
      Route::get('/create-shelf', 'BookshelfController@create');
 -    Route::group(['prefix' => 'shelves'], function() {
 +    Route::group(['prefix' => 'shelves'], function () {
          Route::get('/', 'BookshelfController@index');
          Route::post('/', 'BookshelfController@store');
          Route::get('/{slug}/edit', 'BookshelfController@edit');
@@@ -51,8 -47,6 +51,8 @@@
          Route::put('/{bookSlug}/sort', 'BookSortController@update');
          Route::get('/{bookSlug}/export/html', 'BookExportController@html');
          Route::get('/{bookSlug}/export/pdf', 'BookExportController@pdf');
 +        Route::get('/{bookSlug}/export/markdown', 'BookExportController@markdown');
 +        Route::get('/{bookSlug}/export/zip', 'BookExportController@zip');
          Route::get('/{bookSlug}/export/plaintext', 'BookExportController@plainText');
  
          // Pages
@@@ -63,7 -57,6 +63,7 @@@
          Route::get('/{bookSlug}/page/{pageSlug}', 'PageController@show');
          Route::get('/{bookSlug}/page/{pageSlug}/export/pdf', 'PageExportController@pdf');
          Route::get('/{bookSlug}/page/{pageSlug}/export/html', 'PageExportController@html');
 +        Route::get('/{bookSlug}/page/{pageSlug}/export/markdown', 'PageExportController@markdown');
          Route::get('/{bookSlug}/page/{pageSlug}/export/plaintext', 'PageExportController@plainText');
          Route::get('/{bookSlug}/page/{pageSlug}/edit', 'PageController@edit');
          Route::get('/{bookSlug}/page/{pageSlug}/move', 'PageController@showMove');
@@@ -98,7 -91,6 +98,7 @@@
          Route::get('/{bookSlug}/chapter/{chapterSlug}/permissions', 'ChapterController@showPermissions');
          Route::get('/{bookSlug}/chapter/{chapterSlug}/export/pdf', 'ChapterExportController@pdf');
          Route::get('/{bookSlug}/chapter/{chapterSlug}/export/html', 'ChapterExportController@html');
 +        Route::get('/{bookSlug}/chapter/{chapterSlug}/export/markdown', 'ChapterExportController@markdown');
          Route::get('/{bookSlug}/chapter/{chapterSlug}/export/plaintext', 'ChapterExportController@plainText');
          Route::put('/{bookSlug}/chapter/{chapterSlug}/permissions', 'ChapterController@permissions');
          Route::get('/{bookSlug}/chapter/{chapterSlug}/delete', 'ChapterController@showDelete');
      });
  
      // User Profile routes
 -    Route::get('/user/{userId}', 'UserController@showProfilePage');
 +    Route::get('/user/{slug}', 'UserProfileController@show');
  
      // Image routes
 -    Route::group(['prefix' => 'images'], function () {
 -
 -        // Gallery
 -        Route::get('/gallery', 'Images\GalleryImageController@list');
 -        Route::post('/gallery', 'Images\GalleryImageController@create');
 -
 -        // Drawio
 -        Route::get('/drawio', 'Images\DrawioImageController@list');
 -        Route::get('/drawio/base64/{id}', 'Images\DrawioImageController@getAsBase64');
 -        Route::post('/drawio', 'Images\DrawioImageController@create');
 -
 -        // Shared gallery & draw.io endpoint
 -        Route::get('/usage/{id}', 'Images\ImageController@usage');
 -        Route::put('/{id}', 'Images\ImageController@update');
 -        Route::delete('/{id}', 'Images\ImageController@destroy');
 -    });
 +    Route::get('/images/gallery', 'Images\GalleryImageController@list');
 +    Route::post('/images/gallery', 'Images\GalleryImageController@create');
 +    Route::get('/images/drawio', 'Images\DrawioImageController@list');
 +    Route::get('/images/drawio/base64/{id}', 'Images\DrawioImageController@getAsBase64');
 +    Route::post('/images/drawio', 'Images\DrawioImageController@create');
 +    Route::get('/images/edit/{id}', 'Images\ImageController@edit');
 +    Route::put('/images/{id}', 'Images\ImageController@update');
 +    Route::delete('/images/{id}', 'Images\ImageController@destroy');
  
      // Attachments routes
      Route::get('/attachments/{id}', 'AttachmentController@get');
      Route::post('/attachments/upload/{id}', 'AttachmentController@uploadUpdate');
      Route::post('/attachments/link', 'AttachmentController@attachLink');
      Route::put('/attachments/{id}', 'AttachmentController@update');
 +    Route::get('/attachments/edit/{id}', 'AttachmentController@getUpdateForm');
      Route::get('/attachments/get/page/{pageId}', 'AttachmentController@listForPage');
      Route::put('/attachments/sort/page/{pageId}', 'AttachmentController@sortForPage');
      Route::delete('/attachments/{id}', 'AttachmentController@delete');
      Route::get('/ajax/search/entities', 'SearchController@searchEntitiesAjax');
  
      // Comments
 -    Route::post('/ajax/page/{pageId}/comment', 'CommentController@savePageComment');
 -    Route::put('/ajax/comment/{id}', 'CommentController@update');
 -    Route::delete('/ajax/comment/{id}', 'CommentController@destroy');
 +    Route::post('/comment/{pageId}', 'CommentController@savePageComment');
 +    Route::put('/comment/{id}', 'CommentController@update');
 +    Route::delete('/comment/{id}', 'CommentController@destroy');
  
      // Links
      Route::get('/link/{id}', 'PageController@redirectFromLink');
      Route::get('/search/chapter/{bookId}', 'SearchController@searchChapter');
      Route::get('/search/entity/siblings', 'SearchController@searchSiblings');
  
 +    // User Search
 +    Route::get('/search/users/select', 'UserSearchController@forSelect');
 +
 +    // Template System
      Route::get('/templates', 'PageTemplateController@list');
      Route::get('/templates/{templateId}', 'PageTemplateController@get');
  
 +    // Favourites
 +    Route::get('/favourites', 'FavouriteController@index');
 +    Route::post('/favourites/add', 'FavouriteController@add');
 +    Route::post('/favourites/remove', 'FavouriteController@remove');
 +
      // Other Pages
      Route::get('/', 'HomeController@index');
      Route::get('/home', 'HomeController@index');
      Route::get('/custom-head-content', 'HomeController@customHeadContent');
  
      // Settings
 -    Route::group(['prefix' => 'settings'], function() {
 +    Route::group(['prefix' => 'settings'], function () {
          Route::get('/', 'SettingController@index')->name('settings');
          Route::post('/', 'SettingController@update');
  
          // Maintenance
 -        Route::get('/maintenance', 'SettingController@showMaintenance');
 -        Route::delete('/maintenance/cleanup-images', 'SettingController@cleanupImages');
 -        Route::post('/maintenance/send-test-email', 'SettingController@sendTestEmail');
 +        Route::get('/maintenance', 'MaintenanceController@index');
 +        Route::delete('/maintenance/cleanup-images', 'MaintenanceController@cleanupImages');
 +        Route::post('/maintenance/send-test-email', 'MaintenanceController@sendTestEmail');
 +
 +        // Recycle Bin
 +        Route::get('/recycle-bin', 'RecycleBinController@index');
 +        Route::post('/recycle-bin/empty', 'RecycleBinController@empty');
 +        Route::get('/recycle-bin/{id}/destroy', 'RecycleBinController@showDestroy');
 +        Route::delete('/recycle-bin/{id}', 'RecycleBinController@destroy');
 +        Route::get('/recycle-bin/{id}/restore', 'RecycleBinController@showRestore');
 +        Route::post('/recycle-bin/{id}/restore', 'RecycleBinController@restore');
 +
 +        // Audit Log
 +        Route::get('/audit', 'AuditLogController@index');
  
          // Users
          Route::get('/users', 'UserController@index');
          Route::delete('/users/{userId}/api-tokens/{tokenId}', 'UserApiTokenController@destroy');
  
          // Roles
 -        Route::get('/roles', 'PermissionController@listRoles');
 -        Route::get('/roles/new', 'PermissionController@createRole');
 -        Route::post('/roles/new', 'PermissionController@storeRole');
 -        Route::get('/roles/delete/{id}', 'PermissionController@showDeleteRole');
 -        Route::delete('/roles/delete/{id}', 'PermissionController@deleteRole');
 -        Route::get('/roles/{id}', 'PermissionController@editRole');
 -        Route::put('/roles/{id}', 'PermissionController@updateRole');
 +        Route::get('/roles', 'RoleController@list');
 +        Route::get('/roles/new', 'RoleController@create');
 +        Route::post('/roles/new', 'RoleController@store');
 +        Route::get('/roles/delete/{id}', 'RoleController@showDelete');
 +        Route::delete('/roles/delete/{id}', 'RoleController@delete');
 +        Route::get('/roles/{id}', 'RoleController@edit');
 +        Route::put('/roles/{id}', 'RoleController@update');
      });
 +});
  
 +// MFA routes
 +Route::group(['middleware' => 'mfa-setup'], function () {
 +    Route::get('/mfa/setup', 'Auth\MfaController@setup');
 +    Route::get('/mfa/totp/generate', 'Auth\MfaTotpController@generate');
 +    Route::post('/mfa/totp/confirm', 'Auth\MfaTotpController@confirm');
 +    Route::get('/mfa/backup_codes/generate', 'Auth\MfaBackupCodesController@generate');
 +    Route::post('/mfa/backup_codes/confirm', 'Auth\MfaBackupCodesController@confirm');
  });
 +Route::group(['middleware' => 'guest'], function () {
 +    Route::get('/mfa/verify', 'Auth\MfaController@verify');
 +    Route::post('/mfa/totp/verify', 'Auth\MfaTotpController@verify');
 +    Route::post('/mfa/backup_codes/verify', 'Auth\MfaBackupCodesController@verify');
 +});
 +Route::delete('/mfa/{method}/remove', 'Auth\MfaController@remove')->middleware('auth');
  
  // Social auth routes
 -Route::get('/login/service/{socialDriver}', 'Auth\SocialController@getSocialLogin');
 -Route::get('/login/service/{socialDriver}/callback', 'Auth\SocialController@socialCallback');
 -Route::group(['middleware' => 'auth'], function () {
 -    Route::get('/login/service/{socialDriver}/detach', 'Auth\SocialController@detachSocialAccount');
 -});
 -Route::get('/register/service/{socialDriver}', 'Auth\SocialController@socialRegister');
 +Route::get('/login/service/{socialDriver}', 'Auth\SocialController@login');
 +Route::get('/login/service/{socialDriver}/callback', 'Auth\SocialController@callback');
 +Route::post('/login/service/{socialDriver}/detach', 'Auth\SocialController@detach')->middleware('auth');
 +Route::get('/register/service/{socialDriver}', 'Auth\SocialController@register');
  
  // Login/Logout routes
  Route::get('/login', 'Auth\LoginController@getLogin');
@@@ -267,6 -234,11 +267,11 @@@ Route::get('/saml2/metadata', 'Auth\Sam
  Route::get('/saml2/sls', 'Auth\Saml2Controller@sls');
  Route::post('/saml2/acs', 'Auth\Saml2Controller@acs');
  
+ // OpenId routes
+ Route::post('/openid/login', 'Auth\OpenIdController@login');
+ Route::get('/openid/logout', 'Auth\OpenIdController@logout');
+ Route::get('/openid/redirect', 'Auth\OpenIdController@redirect');
  // User invitation routes
  Route::get('/register/invite/{token}', 'Auth\UserInviteController@showSetPassword');
  Route::post('/register/invite/{token}', 'Auth\UserInviteController@setPassword');
@@@ -279,4 -251,4 +284,4 @@@ Route::post('/password/email', 'Auth\Fo
  Route::get('/password/reset/{token}', 'Auth\ResetPasswordController@showResetForm');
  Route::post('/password/reset', 'Auth\ResetPasswordController@reset');
  
 -Route::fallback('HomeController@getNotFound');
 +Route::fallback('HomeController@notFound')->name('fallback');
diff --combined tests/Auth/AuthTest.php
index d037b57011fada64a1c1755ab9418b9ea03af828,779d5e70fc228ba3c631c014160b8e01347c4ce5..1ffcc0815097bea1d78c1a5556292af5032f4d45
@@@ -1,43 -1,48 +1,43 @@@
 -<?php namespace Tests\Auth;
 +<?php
  
 -use BookStack\Auth\Role;
 +namespace Tests\Auth;
 +
 +use BookStack\Auth\Access\Mfa\MfaSession;
  use BookStack\Auth\User;
 -use BookStack\Entities\Page;
 +use BookStack\Entities\Models\Page;
  use BookStack\Notifications\ConfirmEmail;
  use BookStack\Notifications\ResetPassword;
 -use BookStack\Settings\SettingService;
 -use DB;
 -use Hash;
 +use Illuminate\Support\Facades\DB;
  use Illuminate\Support\Facades\Notification;
 -use Tests\BrowserKitTest;
 +use Tests\TestCase;
 +use Tests\TestResponse;
  
 -class AuthTest extends BrowserKitTest
 +class AuthTest extends TestCase
  {
 -
      public function test_auth_working()
      {
 -        $this->visit('/')
 -            ->seePageIs('/login');
 +        $this->get('/')->assertRedirect('/login');
      }
  
      public function test_login()
      {
 -        $this->login('[email protected]', 'password')
 -            ->seePageIs('/');
 +        $this->login('[email protected]', 'password')->assertRedirect('/');
      }
  
      public function test_public_viewing()
      {
 -        $settings = app(SettingService::class);
 -        $settings->put('app-public', 'true');
 -        $this->visit('/')
 -            ->seePageIs('/')
 -            ->see('Log In');
 +        $this->setSettings(['app-public' => 'true']);
 +        $this->get('/')
 +            ->assertOk()
 +            ->assertSee('Log in');
      }
  
      public function test_registration_showing()
      {
          // Ensure registration form is showing
          $this->setSettings(['registration-enabled' => 'true']);
 -        $this->visit('/login')
 -            ->see('Sign up')
 -            ->click('Sign up')
 -            ->seePageIs('/register');
 +        $this->get('/login')
 +            ->assertElementContains('a[href="' . url('/register') . '"]', 'Sign up');
      }
  
      public function test_normal_registration()
          $user = factory(User::class)->make();
  
          // Test form and ensure user is created
 -        $this->visit('/register')
 -            ->see('Sign Up')
 -            ->type($user->name, '#name')
 -            ->type($user->email, '#email')
 -            ->type($user->password, '#password')
 -            ->press('Create Account')
 -            ->seePageIs('/')
 -            ->see($user->name)
 -            ->seeInDatabase('users', ['name' => $user->name, 'email' => $user->email]);
 +        $this->get('/register')
 +            ->assertSee('Sign Up')
 +            ->assertElementContains('form[action="' . url('/register') . '"]', 'Create Account');
 +
 +        $resp = $this->post('/register', $user->only('password', 'name', 'email'));
 +        $resp->assertRedirect('/');
 +
 +        $resp = $this->get('/');
 +        $resp->assertOk();
 +        $resp->assertSee($user->name);
 +        $this->assertDatabaseHas('users', ['name' => $user->name, 'email' => $user->email]);
      }
  
      public function test_empty_registration_redirects_back_with_errors()
          $this->setSettings(['registration-enabled' => 'true']);
  
          // Test form and ensure user is created
 -        $this->visit('/register')
 -            ->press('Create Account')
 -            ->see('The name field is required')
 -            ->seePageIs('/register');
 +        $this->get('/register');
 +        $this->post('/register', [])->assertRedirect('/register');
 +        $this->get('/register')->assertSee('The name field is required');
      }
  
      public function test_registration_validation()
      {
          $this->setSettings(['registration-enabled' => 'true']);
  
 -        $this->visit('/register')
 -            ->type('1', '#name')
 -            ->type('1', '#email')
 -            ->type('1', '#password')
 -            ->press('Create Account')
 -            ->see('The name must be at least 2 characters.')
 -            ->see('The email must be a valid email address.')
 -            ->see('The password must be at least 8 characters.')
 -            ->seePageIs('/register');
 +        $this->get('/register');
 +        $resp = $this->followingRedirects()->post('/register', [
 +            'name'     => '1',
 +            'email'    => '1',
 +            'password' => '1',
 +        ]);
 +        $resp->assertSee('The name must be at least 2 characters.');
 +        $resp->assertSee('The email must be a valid email address.');
 +        $resp->assertSee('The password must be at least 8 characters.');
      }
  
      public function test_sign_up_link_on_login()
      {
 -        $this->visit('/login')
 -            ->dontSee('Sign up');
 +        $this->get('/login')->assertDontSee('Sign up');
  
          $this->setSettings(['registration-enabled' => 'true']);
  
 -        $this->visit('/login')
 -            ->see('Sign up');
 +        $this->get('/login')->assertSee('Sign up');
      }
  
      public function test_confirmed_registration()
          $user = factory(User::class)->make();
  
          // Go through registration process
 -        $this->visit('/register')
 -            ->see('Sign Up')
 -            ->type($user->name, '#name')
 -            ->type($user->email, '#email')
 -            ->type($user->password, '#password')
 -            ->press('Create Account')
 -            ->seePageIs('/register/confirm')
 -            ->seeInDatabase('users', ['name' => $user->name, 'email' => $user->email, 'email_confirmed' => false]);
 +        $resp = $this->post('/register', $user->only('name', 'email', 'password'));
 +        $resp->assertRedirect('/register/confirm');
 +        $this->assertDatabaseHas('users', ['name' => $user->name, 'email' => $user->email, 'email_confirmed' => false]);
  
          // Ensure notification sent
 -        $dbUser = User::where('email', '=', $user->email)->first();
 +        /** @var User $dbUser */
 +        $dbUser = User::query()->where('email', '=', $user->email)->first();
          Notification::assertSentTo($dbUser, ConfirmEmail::class);
  
          // Test access and resend confirmation email
 -        $this->login($user->email, $user->password)
 -            ->seePageIs('/register/confirm/awaiting')
 -            ->see('Resend')
 -            ->visit('/books')
 -            ->seePageIs('/register/confirm/awaiting')
 -            ->press('Resend Confirmation Email');
 +        $resp = $this->login($user->email, $user->password);
 +        $resp->assertRedirect('/register/confirm/awaiting');
 +
 +        $resp = $this->get('/register/confirm/awaiting');
 +        $resp->assertElementContains('form[action="' . url('/register/confirm/resend') . '"]', 'Resend');
 +
 +        $this->get('/books')->assertRedirect('/login');
 +        $this->post('/register/confirm/resend', $user->only('email'));
  
          // Get confirmation and confirm notification matches
          $emailConfirmation = DB::table('email_confirmations')->where('user_id', '=', $dbUser->id)->first();
 -        Notification::assertSentTo($dbUser, ConfirmEmail::class, function($notification, $channels) use ($emailConfirmation) {
 +        Notification::assertSentTo($dbUser, ConfirmEmail::class, function ($notification, $channels) use ($emailConfirmation) {
              return $notification->token === $emailConfirmation->token;
          });
 -        
 +
          // Check confirmation email confirmation activation.
 -        $this->visit('/register/confirm/' . $emailConfirmation->token)
 -            ->seePageIs('/')
 -            ->see($user->name)
 -            ->notSeeInDatabase('email_confirmations', ['token' => $emailConfirmation->token])
 -            ->seeInDatabase('users', ['name' => $dbUser->name, 'email' => $dbUser->email, 'email_confirmed' => true]);
 +        $this->get('/register/confirm/' . $emailConfirmation->token)->assertRedirect('/');
 +        $this->get('/')->assertSee($user->name);
 +        $this->assertDatabaseMissing('email_confirmations', ['token' => $emailConfirmation->token]);
 +        $this->assertDatabaseHas('users', ['name' => $dbUser->name, 'email' => $dbUser->email, 'email_confirmed' => true]);
      }
  
      public function test_restricted_registration()
      {
          $this->setSettings(['registration-enabled' => 'true', 'registration-confirmation' => 'true', 'registration-restrict' => 'example.com']);
          $user = factory(User::class)->make();
 +
          // Go through registration process
 -        $this->visit('/register')
 -            ->type($user->name, '#name')
 -            ->type($user->email, '#email')
 -            ->type($user->password, '#password')
 -            ->press('Create Account')
 -            ->seePageIs('/register')
 -            ->dontSeeInDatabase('users', ['email' => $user->email])
 -            ->see('That email domain does not have access to this application');
 +        $this->post('/register', $user->only('name', 'email', 'password'))
 +            ->assertRedirect('/register');
 +        $resp = $this->get('/register');
 +        $resp->assertSee('That email domain does not have access to this application');
 +        $this->assertDatabaseMissing('users', $user->only('email'));
  
          $user->email = '[email protected]';
  
 -        $this->visit('/register')
 -            ->type($user->name, '#name')
 -            ->type($user->email, '#email')
 -            ->type($user->password, '#password')
 -            ->press('Create Account')
 -            ->seePageIs('/register/confirm')
 -            ->seeInDatabase('users', ['name' => $user->name, 'email' => $user->email, 'email_confirmed' => false]);
 -
 -        $this->visit('/')->seePageIs('/login')
 -            ->type($user->email, '#email')
 -            ->type($user->password, '#password')
 -            ->press('Log In')
 -            ->seePageIs('/register/confirm/awaiting')
 -            ->seeText('Email Address Not Confirmed');
 +        $this->post('/register', $user->only('name', 'email', 'password'))
 +            ->assertRedirect('/register/confirm');
 +        $this->assertDatabaseHas('users', ['name' => $user->name, 'email' => $user->email, 'email_confirmed' => false]);
 +
 +        $this->assertNull(auth()->user());
 +
 +        $this->get('/')->assertRedirect('/login');
 +        $resp = $this->followingRedirects()->post('/login', $user->only('email', 'password'));
 +        $resp->assertSee('Email Address Not Confirmed');
 +        $this->assertNull(auth()->user());
      }
  
      public function test_restricted_registration_with_confirmation_disabled()
      {
          $this->setSettings(['registration-enabled' => 'true', 'registration-confirmation' => 'false', 'registration-restrict' => 'example.com']);
          $user = factory(User::class)->make();
 +
          // Go through registration process
 -        $this->visit('/register')
 -            ->type($user->name, '#name')
 -            ->type($user->email, '#email')
 -            ->type($user->password, '#password')
 -            ->press('Create Account')
 -            ->seePageIs('/register')
 -            ->dontSeeInDatabase('users', ['email' => $user->email])
 -            ->see('That email domain does not have access to this application');
 +        $this->post('/register', $user->only('name', 'email', 'password'))
 +            ->assertRedirect('/register');
 +        $this->assertDatabaseMissing('users', $user->only('email'));
 +        $this->get('/register')->assertSee('That email domain does not have access to this application');
  
          $user->email = '[email protected]';
  
 -        $this->visit('/register')
 -            ->type($user->name, '#name')
 -            ->type($user->email, '#email')
 -            ->type($user->password, '#password')
 -            ->press('Create Account')
 -            ->seePageIs('/register/confirm')
 -            ->seeInDatabase('users', ['name' => $user->name, 'email' => $user->email, 'email_confirmed' => false]);
 -
 -        $this->visit('/')->seePageIs('/login')
 -            ->type($user->email, '#email')
 -            ->type($user->password, '#password')
 -            ->press('Log In')
 -            ->seePageIs('/register/confirm/awaiting')
 -            ->seeText('Email Address Not Confirmed');
 -    }
 -
 -    public function test_user_creation()
 -    {
 -        $user = factory(User::class)->make();
 +        $this->post('/register', $user->only('name', 'email', 'password'))
 +            ->assertRedirect('/register/confirm');
 +        $this->assertDatabaseHas('users', ['name' => $user->name, 'email' => $user->email, 'email_confirmed' => false]);
  
 -        $this->asAdmin()
 -            ->visit('/settings/users')
 -            ->click('Add New User')
 -            ->type($user->name, '#name')
 -            ->type($user->email, '#email')
 -            ->check('roles[admin]')
 -            ->type($user->password, '#password')
 -            ->type($user->password, '#password-confirm')
 -            ->press('Save')
 -            ->seePageIs('/settings/users')
 -            ->seeInDatabase('users', $user->toArray())
 -            ->see($user->name);
 -    }
 +        $this->assertNull(auth()->user());
  
 -    public function test_user_updating()
 -    {
 -        $user = $this->getNormalUser();
 -        $password = $user->password;
 -        $this->asAdmin()
 -            ->visit('/settings/users')
 -            ->click($user->name)
 -            ->seePageIs('/settings/users/' . $user->id)
 -            ->see($user->email)
 -            ->type('Barry Scott', '#name')
 -            ->press('Save')
 -            ->seePageIs('/settings/users')
 -            ->seeInDatabase('users', ['id' => $user->id, 'name' => 'Barry Scott', 'password' => $password])
 -            ->notSeeInDatabase('users', ['name' => $user->name]);
 +        $this->get('/')->assertRedirect('/login');
 +        $resp = $this->post('/login', $user->only('email', 'password'));
 +        $resp->assertRedirect('/register/confirm/awaiting');
 +        $this->get('/register/confirm/awaiting')->assertSee('Email Address Not Confirmed');
 +        $this->assertNull(auth()->user());
      }
  
 -    public function test_user_password_update()
 +    public function test_logout()
      {
 -        $user = $this->getNormalUser();
 -        $userProfilePage = '/settings/users/' . $user->id;
 -        $this->asAdmin()
 -            ->visit($userProfilePage)
 -            ->type('newpassword', '#password')
 -            ->press('Save')
 -            ->seePageIs($userProfilePage)
 -            ->see('Password confirmation required')
 -
 -            ->type('newpassword', '#password')
 -            ->type('newpassword', '#password-confirm')
 -            ->press('Save')
 -            ->seePageIs('/settings/users');
 -
 -            $userPassword = User::find($user->id)->password;
 -            $this->assertTrue(Hash::check('newpassword', $userPassword));
 +        $this->asAdmin()->get('/')->assertOk();
 +        $this->get('/logout')->assertRedirect('/');
 +        $this->get('/')->assertRedirect('/login');
      }
  
 -    public function test_user_deletion()
 +    public function test_mfa_session_cleared_on_logout()
      {
 -        $userDetails = factory(User::class)->make();
 -        $user = $this->getEditor($userDetails->toArray());
 -
 -        $this->asAdmin()
 -            ->visit('/settings/users/' . $user->id)
 -            ->click('Delete User')
 -            ->see($user->name)
 -            ->press('Confirm')
 -            ->seePageIs('/settings/users')
 -            ->notSeeInDatabase('users', ['name' => $user->name]);
 -    }
 +        $user = $this->getEditor();
 +        $mfaSession = $this->app->make(MfaSession::class);
  
 -    public function test_user_cannot_be_deleted_if_last_admin()
 -    {
 -        $adminRole = Role::getRole('admin');
 -
 -        // Delete all but one admin user if there are more than one
 -        $adminUsers = $adminRole->users;
 -        if (count($adminUsers) > 1) {
 -            foreach ($adminUsers->splice(1) as $user) {
 -                $user->delete();
 -            }
 -        }
 -
 -        // Ensure we currently only have 1 admin user
 -        $this->assertEquals(1, $adminRole->users()->count());
 -        $user = $adminRole->users->first();
 -
 -        $this->asAdmin()->visit('/settings/users/' . $user->id)
 -            ->click('Delete User')
 -            ->press('Confirm')
 -            ->seePageIs('/settings/users/' . $user->id)
 -            ->see('You cannot delete the only admin');
 -    }
 +        $mfaSession->markVerifiedForUser($user);
 +        $this->assertTrue($mfaSession->isVerifiedForUser($user));
  
 -    public function test_logout()
 -    {
 -        $this->asAdmin()
 -            ->visit('/')
 -            ->seePageIs('/')
 -            ->visit('/logout')
 -            ->visit('/')
 -            ->seePageIs('/login');
 +        $this->asAdmin()->get('/logout');
 +        $this->assertFalse($mfaSession->isVerifiedForUser($user));
      }
  
      public function test_reset_password_flow()
      {
          Notification::fake();
  
 -        $this->visit('/login')->click('Forgot Password?')
 -            ->seePageIs('/password/email')
 -            ->type('[email protected]', 'email')
 -            ->press('Send Reset Link')
 -            ->see('A password reset link will be sent to [email protected] if that email address is found in the system.');
 +        $this->get('/login')
 +            ->assertElementContains('a[href="' . url('/password/email') . '"]', 'Forgot Password?');
 +
 +        $this->get('/password/email')
 +            ->assertElementContains('form[action="' . url('/password/email') . '"]', 'Send Reset Link');
 +
 +        $resp = $this->post('/password/email', [
 +            'email' => '[email protected]',
 +        ]);
 +        $resp->assertRedirect('/password/email');
 +
 +        $resp = $this->get('/password/email');
 +        $resp->assertSee('A password reset link will be sent to [email protected] if that email address is found in the system.');
  
 -        $this->seeInDatabase('password_resets', [
 -            'email' => '[email protected]'
 +        $this->assertDatabaseHas('password_resets', [
 +            'email' => '[email protected]',
          ]);
  
 -        $user = User::where('email', '=', '[email protected]')->first();
 +        /** @var User $user */
 +        $user = User::query()->where('email', '=', '[email protected]')->first();
  
          Notification::assertSentTo($user, ResetPassword::class);
          $n = Notification::sent($user, ResetPassword::class);
  
 -        $this->visit('/password/reset/' . $n->first()->token)
 -            ->see('Reset Password')
 -            ->submitForm('Reset Password', [
 -                'email' => '[email protected]',
 -                'password' => 'randompass',
 -                'password_confirmation' => 'randompass'
 -            ])->seePageIs('/')
 -            ->see('Your password has been successfully reset');
 +        $this->get('/password/reset/' . $n->first()->token)
 +            ->assertOk()
 +            ->assertSee('Reset Password');
 +
 +        $resp = $this->post('/password/reset', [
 +            'email'                 => '[email protected]',
 +            'password'              => 'randompass',
 +            'password_confirmation' => 'randompass',
 +            'token'                 => $n->first()->token,
 +        ]);
 +        $resp->assertRedirect('/');
 +
 +        $this->get('/')->assertSee('Your password has been successfully reset');
      }
  
      public function test_reset_password_flow_shows_success_message_even_if_wrong_password_to_prevent_user_discovery()
      {
 -        $this->visit('/login')->click('Forgot Password?')
 -            ->seePageIs('/password/email')
 -            ->type('[email protected]', 'email')
 -            ->press('Send Reset Link')
 -            ->see('A password reset link will be sent to [email protected] if that email address is found in the system.')
 -            ->dontSee('We can\'t find a user');
 -
 -
 -        $this->visit('/password/reset/arandometokenvalue')
 -            ->see('Reset Password')
 -            ->submitForm('Reset Password', [
 -                'email' => '[email protected]',
 -                'password' => 'randompass',
 -                'password_confirmation' => 'randompass'
 -            ])->followRedirects()
 -            ->seePageIs('/password/reset/arandometokenvalue')
 -            ->dontSee('We can\'t find a user')
 -            ->see('The password reset token is invalid for this email address.');
 +        $this->get('/password/email');
 +        $resp = $this->followingRedirects()->post('/password/email', [
 +            'email' => '[email protected]',
 +        ]);
 +        $resp->assertSee('A password reset link will be sent to [email protected] if that email address is found in the system.');
 +        $resp->assertDontSee('We can\'t find a user');
 +
 +        $this->get('/password/reset/arandometokenvalue')->assertSee('Reset Password');
 +        $resp = $this->post('/password/reset', [
 +            'email'                 => '[email protected]',
 +            'password'              => 'randompass',
 +            'password_confirmation' => 'randompass',
 +            'token'                 => 'arandometokenvalue',
 +        ]);
 +        $resp->assertRedirect('/password/reset/arandometokenvalue');
 +
 +        $this->get('/password/reset/arandometokenvalue')
 +            ->assertDontSee('We can\'t find a user')
 +            ->assertSee('The password reset token is invalid for this email address.');
      }
  
      public function test_reset_password_page_shows_sign_links()
      {
          $this->setSettings(['registration-enabled' => 'true']);
 -        $this->visit('/password/email')
 -            ->seeLink('Log in')
 -            ->seeLink('Sign up');
 +        $this->get('/password/email')
 +            ->assertElementContains('a', 'Log in')
 +            ->assertElementContains('a', 'Sign up');
      }
  
      public function test_login_redirects_to_initially_requested_url_correctly()
      {
          config()->set('app.url', 'http://localhost');
 +        /** @var Page $page */
          $page = Page::query()->first();
  
 -        $this->visit($page->getUrl())
 -            ->seePageUrlIs(url('/login'));
 +        $this->get($page->getUrl())->assertRedirect(url('/login'));
          $this->login('[email protected]', 'password')
 -            ->seePageUrlIs($page->getUrl());
 +            ->assertRedirect($page->getUrl());
 +    }
 +
 +    public function test_login_intended_redirect_does_not_redirect_to_external_pages()
 +    {
 +        config()->set('app.url', 'http://localhost');
 +        $this->setSettings(['app-public' => true]);
 +
 +        $this->get('/login', ['referer' => 'https://example.com']);
 +        $login = $this->post('/login', ['email' => '[email protected]', 'password' => 'password']);
 +
 +        $login->assertRedirect('http://localhost');
 +    }
 +
 +    public function test_login_intended_redirect_does_not_factor_mfa_routes()
 +    {
 +        $this->get('/books')->assertRedirect('/login');
 +        $this->get('/mfa/setup')->assertRedirect('/login');
 +        $login = $this->post('/login', ['email' => '[email protected]', 'password' => 'password']);
 +        $login->assertRedirect('/books');
      }
  
      public function test_login_authenticates_admins_on_all_guards()
          $this->assertTrue(auth()->check());
          $this->assertTrue(auth('ldap')->check());
          $this->assertTrue(auth('saml2')->check());
+         $this->assertTrue(auth('openid')->check());
      }
  
      public function test_login_authenticates_nonadmins_on_default_guard_only()
          $this->assertTrue(auth()->check());
          $this->assertFalse(auth('ldap')->check());
          $this->assertFalse(auth('saml2')->check());
+         $this->assertFalse(auth('openid')->check());
      }
  
 +    public function test_failed_logins_are_logged_when_message_configured()
 +    {
 +        $log = $this->withTestLogger();
 +        config()->set(['logging.failed_login.message' => 'Failed login for %u']);
 +
 +        $this->post('/login', ['email' => '[email protected]', 'password' => 'cattreedog']);
 +        $this->assertTrue($log->hasWarningThatContains('Failed login for [email protected]'));
 +
 +        $this->post('/login', ['email' => '[email protected]', 'password' => 'password']);
 +        $this->assertFalse($log->hasWarningThatContains('Failed login for [email protected]'));
 +    }
 +
 +    public function test_logged_in_user_with_unconfirmed_email_is_logged_out()
 +    {
 +        $this->setSettings(['registration-confirmation' => 'true']);
 +        $user = $this->getEditor();
 +        $user->email_confirmed = false;
 +        $user->save();
 +
 +        auth()->login($user);
 +        $this->assertTrue(auth()->check());
 +
 +        $this->get('/books')->assertRedirect('/');
 +        $this->assertFalse(auth()->check());
 +    }
 +
      /**
 -     * Perform a login
 +     * Perform a login.
       */
 -    protected function login(string $email, string $password): AuthTest
 +    protected function login(string $email, string $password): TestResponse
      {
 -        return $this->visit('/login')
 -            ->type($email, '#email')
 -            ->type($password, '#password')
 -            ->press('Log In');
 +        return $this->post('/login', compact('email', 'password'));
      }
  }