diff --git a/composer.json b/composer.json
index 346f35a5a4db607cea6f30367551dfadae21f8be..b386a368694d1ebb66061658821cfea2fd3848d0 100644
--- a/composer.json
+++ b/composer.json
@@ -23,7 +23,7 @@
         "drupal/administerusersbyrole": "3.4",
         "drupal/anchor_link": "^3.0@beta",
         "drupal/better_exposed_filters": "6.0.6",
-        "drupal/block_field": "1.0.0-rc4",
+        "drupal/block_field": "1.0.0-rc5",
         "drupal/block_permissions": "1.3",
         "drupal/block_region_permissions": "1.5",
         "drupal/bootstrap": "3.32",
@@ -38,7 +38,7 @@
         "drupal/edit_media_modal": "^2.0",
         "drupal/editor_advanced_link": "2.2.6",
         "drupal/editoria11y": "^2.1",
-        "drupal/entity_browser": "2.10",
+        "drupal/entity_browser": "2.11",
         "drupal/entity_clone": "2.1.0-beta1",
         "drupal/entity_reference_revisions": "1.12",
         "drupal/exif_orientation": "^1.1",
@@ -69,9 +69,9 @@
         "drupal/queue_mail": "^1.4",
         "drupal/realname": "^2.0@beta",
         "drupal/rebuild_cache_access": "^1.8",
-        "drupal/recaptcha": "3.3",
-        "drupal/recaptcha_v3": "^2.0",
-        "drupal/redirect": "^1.8",
+        "drupal/recaptcha": "3.4",
+        "drupal/recaptcha_v3": "2.0.3",
+        "drupal/redirect": "1.10",
         "drupal/roleassign": "2.0.2",
         "drupal/scheduler": "2.0.4",
         "drupal/simple_gmap": "3.1.0",
diff --git a/composer.lock b/composer.lock
index 201938f0aeaa3a8b8ebdd655b32801dfc544fea3..ce4e8760d15a2996f6927814e7afcd05a16333e6 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "3e45b610627033921201a46e94337749",
+    "content-hash": "882ed77c36368349d5c96317f0177a79",
     "packages": [
         {
             "name": "algolia/places",
@@ -1679,26 +1679,26 @@
         },
         {
             "name": "drupal/block_field",
-            "version": "1.0.0-rc4",
+            "version": "1.0.0-rc5",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/block_field.git",
-                "reference": "8.x-1.0-rc4"
+                "reference": "8.x-1.0-rc5"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/block_field-8.x-1.0-rc4.zip",
-                "reference": "8.x-1.0-rc4",
-                "shasum": "97958ceace8ca80852f40b734ff7197e172d726e"
+                "url": "https://ftp.drupal.org/files/projects/block_field-8.x-1.0-rc5.zip",
+                "reference": "8.x-1.0-rc5",
+                "shasum": "b87e43e9bbaaf6cff6d8946d5e45db492978cbb6"
             },
             "require": {
-                "drupal/core": "^9 || ^10"
+                "drupal/core": "^9 || ^10 || ^11"
             },
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "8.x-1.0-rc4",
-                    "datestamp": "1667511464",
+                    "version": "8.x-1.0-rc5",
+                    "datestamp": "1723550576",
                     "security-coverage": {
                         "status": "not-covered",
                         "message": "RC releases are not covered by Drupal security advisories."
@@ -1715,7 +1715,7 @@
                     "homepage": "https://www.drupal.org/user/1036766"
                 },
                 {
-                    "name": "Berdir",
+                    "name": "berdir",
                     "homepage": "https://www.drupal.org/user/214652"
                 },
                 {
@@ -2823,20 +2823,20 @@
         },
         {
             "name": "drupal/entity_browser",
-            "version": "2.10.0",
+            "version": "2.11.0",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/entity_browser.git",
-                "reference": "8.x-2.10"
+                "reference": "8.x-2.11"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/entity_browser-8.x-2.10.zip",
-                "reference": "8.x-2.10",
-                "shasum": "d52548ea66dc56108c2e211aeaff6e1cc0522e85"
+                "url": "https://ftp.drupal.org/files/projects/entity_browser-8.x-2.11.zip",
+                "reference": "8.x-2.11",
+                "shasum": "4ead3d3f9f6365fbc25cfbd0edcc5e0a9cc52e02"
             },
             "require": {
-                "drupal/core": "^9.5 || ^10"
+                "drupal/core": "^10.2 || ^11"
             },
             "conflict": {
                 "drupal/media_entity": "1.*"
@@ -2849,13 +2849,14 @@
                 "drupal/entityqueue": "^1.0",
                 "drupal/inline_entity_form": "^1.0@rc",
                 "drupal/paragraphs": "^1.0",
+                "drupal/search_api": "^1.0",
                 "drupal/token": "^1.0"
             },
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "8.x-2.10",
-                    "datestamp": "1702325310",
+                    "version": "8.x-2.11",
+                    "datestamp": "1723378138",
                     "security-coverage": {
                         "status": "covered",
                         "message": "Covered by Drupal's security advisory policy"
@@ -5401,17 +5402,17 @@
         },
         {
             "name": "drupal/recaptcha",
-            "version": "3.3.0",
+            "version": "3.4.0",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/recaptcha.git",
-                "reference": "8.x-3.3"
+                "reference": "8.x-3.4"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/recaptcha-8.x-3.3.zip",
-                "reference": "8.x-3.3",
-                "shasum": "376331ed5a0761d5414d294d6778bce4c308d6d5"
+                "url": "https://ftp.drupal.org/files/projects/recaptcha-8.x-3.4.zip",
+                "reference": "8.x-3.4",
+                "shasum": "95fa7ac5dd064ea6a1c14fc4881778bf68200598"
             },
             "require": {
                 "drupal/captcha": "^1.15 || ^2.0",
@@ -5421,8 +5422,8 @@
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "8.x-3.3",
-                    "datestamp": "1720755549",
+                    "version": "8.x-3.4",
+                    "datestamp": "1723563033",
                     "security-coverage": {
                         "status": "covered",
                         "message": "Covered by Drupal's security advisory policy"
@@ -5463,11 +5464,11 @@
                     "homepage": "https://www.drupal.org/user/395439"
                 },
                 {
-                    "name": "Liam Morland",
+                    "name": "liam morland",
                     "homepage": "https://www.drupal.org/user/493050"
                 },
                 {
-                    "name": "RobLoach",
+                    "name": "robloach",
                     "homepage": "https://www.drupal.org/user/61114"
                 },
                 {
@@ -5488,28 +5489,28 @@
         },
         {
             "name": "drupal/recaptcha_v3",
-            "version": "2.0.2",
+            "version": "2.0.3",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/recaptcha_v3.git",
-                "reference": "2.0.2"
+                "reference": "2.0.3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/recaptcha_v3-2.0.2.zip",
-                "reference": "2.0.2",
-                "shasum": "239e04bdb74179997e422c13cd76cfaac68bdf00"
+                "url": "https://ftp.drupal.org/files/projects/recaptcha_v3-2.0.3.zip",
+                "reference": "2.0.3",
+                "shasum": "51bdbfd4602550fb4822ba8725e8899e23d4568a"
             },
             "require": {
                 "drupal/captcha": "^2.0",
-                "drupal/core": "^9.5 || ^10",
+                "drupal/core": "^10 || ^11",
                 "google/recaptcha": "^1.3"
             },
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "2.0.2",
-                    "datestamp": "1692590086",
+                    "version": "2.0.3",
+                    "datestamp": "1723447296",
                     "security-coverage": {
                         "status": "covered",
                         "message": "Covered by Drupal's security advisory policy"
@@ -5542,26 +5543,26 @@
         },
         {
             "name": "drupal/redirect",
-            "version": "1.9.0",
+            "version": "1.10.0",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/redirect.git",
-                "reference": "8.x-1.9"
+                "reference": "8.x-1.10"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/redirect-8.x-1.9.zip",
-                "reference": "8.x-1.9",
-                "shasum": "2987de20f509e9f7cec8a0f81d3a6774f9b0ba3e"
+                "url": "https://ftp.drupal.org/files/projects/redirect-8.x-1.10.zip",
+                "reference": "8.x-1.10",
+                "shasum": "9d72d7e0717dbdea3ab3306c5d6840da5bd3024c"
             },
             "require": {
-                "drupal/core": "^9.2 || ^10"
+                "drupal/core": "^9.2 || ^10 || ^11"
             },
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "8.x-1.9",
-                    "datestamp": "1693393506",
+                    "version": "8.x-1.10",
+                    "datestamp": "1723277641",
                     "security-coverage": {
                         "status": "covered",
                         "message": "Covered by Drupal's security advisory policy"
@@ -5578,7 +5579,7 @@
                     "homepage": "https://www.drupal.org/user/214652"
                 },
                 {
-                    "name": "Dave Reid",
+                    "name": "dave reid",
                     "homepage": "https://www.drupal.org/user/53892"
                 },
                 {
@@ -10736,16 +10737,16 @@
         },
         {
             "name": "symfony/console",
-            "version": "v6.4.10",
+            "version": "v6.4.11",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/console.git",
-                "reference": "504974cbe43d05f83b201d6498c206f16fc0cdbc"
+                "reference": "42686880adaacdad1835ee8fc2a9ec5b7bd63998"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/console/zipball/504974cbe43d05f83b201d6498c206f16fc0cdbc",
-                "reference": "504974cbe43d05f83b201d6498c206f16fc0cdbc",
+                "url": "https://api.github.com/repos/symfony/console/zipball/42686880adaacdad1835ee8fc2a9ec5b7bd63998",
+                "reference": "42686880adaacdad1835ee8fc2a9ec5b7bd63998",
                 "shasum": ""
             },
             "require": {
@@ -10810,7 +10811,7 @@
                 "terminal"
             ],
             "support": {
-                "source": "https://github.com/symfony/console/tree/v6.4.10"
+                "source": "https://github.com/symfony/console/tree/v6.4.11"
             },
             "funding": [
                 {
@@ -10826,20 +10827,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-07-26T12:30:32+00:00"
+            "time": "2024-08-15T22:48:29+00:00"
         },
         {
             "name": "symfony/dependency-injection",
-            "version": "v6.4.10",
+            "version": "v6.4.11",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/dependency-injection.git",
-                "reference": "5caf9c5f6085f13b27d70a236b776c07e4a1c3eb"
+                "reference": "e93c8368dc9915c2fe12018ff22fcbbdd32c9a9e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/5caf9c5f6085f13b27d70a236b776c07e4a1c3eb",
-                "reference": "5caf9c5f6085f13b27d70a236b776c07e4a1c3eb",
+                "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/e93c8368dc9915c2fe12018ff22fcbbdd32c9a9e",
+                "reference": "e93c8368dc9915c2fe12018ff22fcbbdd32c9a9e",
                 "shasum": ""
             },
             "require": {
@@ -10891,7 +10892,7 @@
             "description": "Allows you to standardize and centralize the way objects are constructed in your application",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/dependency-injection/tree/v6.4.10"
+                "source": "https://github.com/symfony/dependency-injection/tree/v6.4.11"
             },
             "funding": [
                 {
@@ -10907,7 +10908,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-07-26T07:32:07+00:00"
+            "time": "2024-08-29T08:15:38+00:00"
         },
         {
             "name": "symfony/deprecation-contracts",
@@ -11275,16 +11276,16 @@
         },
         {
             "name": "symfony/finder",
-            "version": "v6.4.10",
+            "version": "v6.4.11",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/finder.git",
-                "reference": "af29198d87112bebdd397bd7735fbd115997824c"
+                "reference": "d7eb6daf8cd7e9ac4976e9576b32042ef7253453"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/finder/zipball/af29198d87112bebdd397bd7735fbd115997824c",
-                "reference": "af29198d87112bebdd397bd7735fbd115997824c",
+                "url": "https://api.github.com/repos/symfony/finder/zipball/d7eb6daf8cd7e9ac4976e9576b32042ef7253453",
+                "reference": "d7eb6daf8cd7e9ac4976e9576b32042ef7253453",
                 "shasum": ""
             },
             "require": {
@@ -11319,7 +11320,7 @@
             "description": "Finds files and directories via an intuitive fluent interface",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/finder/tree/v6.4.10"
+                "source": "https://github.com/symfony/finder/tree/v6.4.11"
             },
             "funding": [
                 {
@@ -11335,7 +11336,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-07-24T07:06:38+00:00"
+            "time": "2024-08-13T14:27:37+00:00"
         },
         {
             "name": "symfony/framework-bundle",
@@ -11564,16 +11565,16 @@
         },
         {
             "name": "symfony/http-kernel",
-            "version": "v6.4.10",
+            "version": "v6.4.11",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/http-kernel.git",
-                "reference": "147e0daf618d7575b5007055340d09aece5cf068"
+                "reference": "1ba6b89d781cb47448155cc70dd2e0f1b0584c79"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/147e0daf618d7575b5007055340d09aece5cf068",
-                "reference": "147e0daf618d7575b5007055340d09aece5cf068",
+                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/1ba6b89d781cb47448155cc70dd2e0f1b0584c79",
+                "reference": "1ba6b89d781cb47448155cc70dd2e0f1b0584c79",
                 "shasum": ""
             },
             "require": {
@@ -11658,7 +11659,7 @@
             "description": "Provides a structured process for converting a Request into a Response",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/http-kernel/tree/v6.4.10"
+                "source": "https://github.com/symfony/http-kernel/tree/v6.4.11"
             },
             "funding": [
                 {
@@ -11674,7 +11675,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-07-26T14:52:04+00:00"
+            "time": "2024-08-30T16:57:20+00:00"
         },
         {
             "name": "symfony/intl",
@@ -11841,16 +11842,16 @@
         },
         {
             "name": "symfony/mime",
-            "version": "v6.4.9",
+            "version": "v6.4.11",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/mime.git",
-                "reference": "7d048964877324debdcb4e0549becfa064a20d43"
+                "reference": "dba5d5f6073baf7a3576b580cc4a208b4ca00553"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/mime/zipball/7d048964877324debdcb4e0549becfa064a20d43",
-                "reference": "7d048964877324debdcb4e0549becfa064a20d43",
+                "url": "https://api.github.com/repos/symfony/mime/zipball/dba5d5f6073baf7a3576b580cc4a208b4ca00553",
+                "reference": "dba5d5f6073baf7a3576b580cc4a208b4ca00553",
                 "shasum": ""
             },
             "require": {
@@ -11906,7 +11907,7 @@
                 "mime-type"
             ],
             "support": {
-                "source": "https://github.com/symfony/mime/tree/v6.4.9"
+                "source": "https://github.com/symfony/mime/tree/v6.4.11"
             },
             "funding": [
                 {
@@ -11922,7 +11923,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-06-28T09:49:33+00:00"
+            "time": "2024-08-13T12:15:02+00:00"
         },
         {
             "name": "symfony/password-hasher",
@@ -12931,16 +12932,16 @@
         },
         {
             "name": "symfony/psr-http-message-bridge",
-            "version": "v6.4.10",
+            "version": "v6.4.11",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/psr-http-message-bridge.git",
-                "reference": "89a24648d73e4eee30893b0da16abc454a65c53b"
+                "reference": "74835ba54eca99a38f374f7a6d932fa510124773"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/89a24648d73e4eee30893b0da16abc454a65c53b",
-                "reference": "89a24648d73e4eee30893b0da16abc454a65c53b",
+                "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/74835ba54eca99a38f374f7a6d932fa510124773",
+                "reference": "74835ba54eca99a38f374f7a6d932fa510124773",
                 "shasum": ""
             },
             "require": {
@@ -12994,7 +12995,7 @@
                 "psr-7"
             ],
             "support": {
-                "source": "https://github.com/symfony/psr-http-message-bridge/tree/v6.4.10"
+                "source": "https://github.com/symfony/psr-http-message-bridge/tree/v6.4.11"
             },
             "funding": [
                 {
@@ -13010,20 +13011,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-07-15T09:36:38+00:00"
+            "time": "2024-08-14T13:55:58+00:00"
         },
         {
             "name": "symfony/routing",
-            "version": "v6.4.10",
+            "version": "v6.4.11",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/routing.git",
-                "reference": "aad19fe10753ba842f0d653a8db819c4b3affa87"
+                "reference": "8ee0c24c1bf61c263a26f1b9b6d19e83b1121f2a"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/routing/zipball/aad19fe10753ba842f0d653a8db819c4b3affa87",
-                "reference": "aad19fe10753ba842f0d653a8db819c4b3affa87",
+                "url": "https://api.github.com/repos/symfony/routing/zipball/8ee0c24c1bf61c263a26f1b9b6d19e83b1121f2a",
+                "reference": "8ee0c24c1bf61c263a26f1b9b6d19e83b1121f2a",
                 "shasum": ""
             },
             "require": {
@@ -13077,7 +13078,7 @@
                 "url"
             ],
             "support": {
-                "source": "https://github.com/symfony/routing/tree/v6.4.10"
+                "source": "https://github.com/symfony/routing/tree/v6.4.11"
             },
             "funding": [
                 {
@@ -13093,20 +13094,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-07-15T09:26:24+00:00"
+            "time": "2024-08-29T08:15:38+00:00"
         },
         {
             "name": "symfony/serializer",
-            "version": "v6.4.10",
+            "version": "v6.4.11",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/serializer.git",
-                "reference": "9a67fcf320561e96f94d62bbe0e169ac534a5718"
+                "reference": "a75d03d7720417f8a654e73e8f02acdea8779cd0"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/serializer/zipball/9a67fcf320561e96f94d62bbe0e169ac534a5718",
-                "reference": "9a67fcf320561e96f94d62bbe0e169ac534a5718",
+                "url": "https://api.github.com/repos/symfony/serializer/zipball/a75d03d7720417f8a654e73e8f02acdea8779cd0",
+                "reference": "a75d03d7720417f8a654e73e8f02acdea8779cd0",
                 "shasum": ""
             },
             "require": {
@@ -13175,7 +13176,7 @@
             "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/serializer/tree/v6.4.10"
+                "source": "https://github.com/symfony/serializer/tree/v6.4.11"
             },
             "funding": [
                 {
@@ -13191,7 +13192,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-07-26T13:13:26+00:00"
+            "time": "2024-08-17T07:51:47+00:00"
         },
         {
             "name": "symfony/service-contracts",
@@ -13278,16 +13279,16 @@
         },
         {
             "name": "symfony/string",
-            "version": "v6.4.10",
+            "version": "v6.4.11",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/string.git",
-                "reference": "ccf9b30251719567bfd46494138327522b9a9446"
+                "reference": "5bc3eb632cf9c8dbfd6529d89be9950d1518883b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/string/zipball/ccf9b30251719567bfd46494138327522b9a9446",
-                "reference": "ccf9b30251719567bfd46494138327522b9a9446",
+                "url": "https://api.github.com/repos/symfony/string/zipball/5bc3eb632cf9c8dbfd6529d89be9950d1518883b",
+                "reference": "5bc3eb632cf9c8dbfd6529d89be9950d1518883b",
                 "shasum": ""
             },
             "require": {
@@ -13344,7 +13345,7 @@
                 "utf8"
             ],
             "support": {
-                "source": "https://github.com/symfony/string/tree/v6.4.10"
+                "source": "https://github.com/symfony/string/tree/v6.4.11"
             },
             "funding": [
                 {
@@ -13360,7 +13361,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-07-22T10:21:14+00:00"
+            "time": "2024-08-12T09:55:28+00:00"
         },
         {
             "name": "symfony/translation-contracts",
@@ -13551,16 +13552,16 @@
         },
         {
             "name": "symfony/validator",
-            "version": "v6.4.10",
+            "version": "v6.4.11",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/validator.git",
-                "reference": "bcf939a9d1acd7d2912e9474c0c3d7840a03cbcd"
+                "reference": "4ff41cf10af1de99ad92895411b55c9f309bc2d8"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/validator/zipball/bcf939a9d1acd7d2912e9474c0c3d7840a03cbcd",
-                "reference": "bcf939a9d1acd7d2912e9474c0c3d7840a03cbcd",
+                "url": "https://api.github.com/repos/symfony/validator/zipball/4ff41cf10af1de99ad92895411b55c9f309bc2d8",
+                "reference": "4ff41cf10af1de99ad92895411b55c9f309bc2d8",
                 "shasum": ""
             },
             "require": {
@@ -13628,7 +13629,7 @@
             "description": "Provides tools to validate values",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/validator/tree/v6.4.10"
+                "source": "https://github.com/symfony/validator/tree/v6.4.11"
             },
             "funding": [
                 {
@@ -13644,20 +13645,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-07-26T12:30:32+00:00"
+            "time": "2024-08-30T15:57:55+00:00"
         },
         {
             "name": "symfony/var-dumper",
-            "version": "v6.4.10",
+            "version": "v6.4.11",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/var-dumper.git",
-                "reference": "a71cc3374f5fb9759da1961d28c452373b343dd4"
+                "reference": "ee14c8254a480913268b1e3b1cba8045ed122694"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/a71cc3374f5fb9759da1961d28c452373b343dd4",
-                "reference": "a71cc3374f5fb9759da1961d28c452373b343dd4",
+                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/ee14c8254a480913268b1e3b1cba8045ed122694",
+                "reference": "ee14c8254a480913268b1e3b1cba8045ed122694",
                 "shasum": ""
             },
             "require": {
@@ -13713,7 +13714,7 @@
                 "dump"
             ],
             "support": {
-                "source": "https://github.com/symfony/var-dumper/tree/v6.4.10"
+                "source": "https://github.com/symfony/var-dumper/tree/v6.4.11"
             },
             "funding": [
                 {
@@ -13729,7 +13730,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-07-26T12:30:32+00:00"
+            "time": "2024-08-30T16:03:21+00:00"
         },
         {
             "name": "symfony/var-exporter",
@@ -13810,16 +13811,16 @@
         },
         {
             "name": "symfony/yaml",
-            "version": "v6.4.7",
+            "version": "v6.4.11",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/yaml.git",
-                "reference": "53e8b1ef30a65f78eac60fddc5ee7ebbbdb1dee0"
+                "reference": "be37e7f13195e05ab84ca5269365591edd240335"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/yaml/zipball/53e8b1ef30a65f78eac60fddc5ee7ebbbdb1dee0",
-                "reference": "53e8b1ef30a65f78eac60fddc5ee7ebbbdb1dee0",
+                "url": "https://api.github.com/repos/symfony/yaml/zipball/be37e7f13195e05ab84ca5269365591edd240335",
+                "reference": "be37e7f13195e05ab84ca5269365591edd240335",
                 "shasum": ""
             },
             "require": {
@@ -13862,7 +13863,7 @@
             "description": "Loads and dumps YAML files",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/yaml/tree/v6.4.7"
+                "source": "https://github.com/symfony/yaml/tree/v6.4.11"
             },
             "funding": [
                 {
@@ -13878,7 +13879,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-04-28T10:28:08+00:00"
+            "time": "2024-08-12T09:55:28+00:00"
         },
         {
             "name": "tabby/tabby",
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index c823156ffdaa27b1301f1175558152ebfb26286a..1903e11f929a0b2accf19e13a5a7738045ba7c59 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -1763,27 +1763,27 @@
         },
         {
             "name": "drupal/block_field",
-            "version": "1.0.0-rc4",
-            "version_normalized": "1.0.0.0-RC4",
+            "version": "1.0.0-rc5",
+            "version_normalized": "1.0.0.0-RC5",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/block_field.git",
-                "reference": "8.x-1.0-rc4"
+                "reference": "8.x-1.0-rc5"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/block_field-8.x-1.0-rc4.zip",
-                "reference": "8.x-1.0-rc4",
-                "shasum": "97958ceace8ca80852f40b734ff7197e172d726e"
+                "url": "https://ftp.drupal.org/files/projects/block_field-8.x-1.0-rc5.zip",
+                "reference": "8.x-1.0-rc5",
+                "shasum": "b87e43e9bbaaf6cff6d8946d5e45db492978cbb6"
             },
             "require": {
-                "drupal/core": "^9 || ^10"
+                "drupal/core": "^9 || ^10 || ^11"
             },
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "8.x-1.0-rc4",
-                    "datestamp": "1667511464",
+                    "version": "8.x-1.0-rc5",
+                    "datestamp": "1723550576",
                     "security-coverage": {
                         "status": "not-covered",
                         "message": "RC releases are not covered by Drupal security advisories."
@@ -1801,7 +1801,7 @@
                     "homepage": "https://www.drupal.org/user/1036766"
                 },
                 {
-                    "name": "Berdir",
+                    "name": "berdir",
                     "homepage": "https://www.drupal.org/user/214652"
                 },
                 {
@@ -2960,21 +2960,21 @@
         },
         {
             "name": "drupal/entity_browser",
-            "version": "2.10.0",
-            "version_normalized": "2.10.0.0",
+            "version": "2.11.0",
+            "version_normalized": "2.11.0.0",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/entity_browser.git",
-                "reference": "8.x-2.10"
+                "reference": "8.x-2.11"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/entity_browser-8.x-2.10.zip",
-                "reference": "8.x-2.10",
-                "shasum": "d52548ea66dc56108c2e211aeaff6e1cc0522e85"
+                "url": "https://ftp.drupal.org/files/projects/entity_browser-8.x-2.11.zip",
+                "reference": "8.x-2.11",
+                "shasum": "4ead3d3f9f6365fbc25cfbd0edcc5e0a9cc52e02"
             },
             "require": {
-                "drupal/core": "^9.5 || ^10"
+                "drupal/core": "^10.2 || ^11"
             },
             "conflict": {
                 "drupal/media_entity": "1.*"
@@ -2987,13 +2987,14 @@
                 "drupal/entityqueue": "^1.0",
                 "drupal/inline_entity_form": "^1.0@rc",
                 "drupal/paragraphs": "^1.0",
+                "drupal/search_api": "^1.0",
                 "drupal/token": "^1.0"
             },
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "8.x-2.10",
-                    "datestamp": "1702325310",
+                    "version": "8.x-2.11",
+                    "datestamp": "1723378138",
                     "security-coverage": {
                         "status": "covered",
                         "message": "Covered by Drupal's security advisory policy"
@@ -5671,18 +5672,18 @@
         },
         {
             "name": "drupal/recaptcha",
-            "version": "3.3.0",
-            "version_normalized": "3.3.0.0",
+            "version": "3.4.0",
+            "version_normalized": "3.4.0.0",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/recaptcha.git",
-                "reference": "8.x-3.3"
+                "reference": "8.x-3.4"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/recaptcha-8.x-3.3.zip",
-                "reference": "8.x-3.3",
-                "shasum": "376331ed5a0761d5414d294d6778bce4c308d6d5"
+                "url": "https://ftp.drupal.org/files/projects/recaptcha-8.x-3.4.zip",
+                "reference": "8.x-3.4",
+                "shasum": "95fa7ac5dd064ea6a1c14fc4881778bf68200598"
             },
             "require": {
                 "drupal/captcha": "^1.15 || ^2.0",
@@ -5692,8 +5693,8 @@
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "8.x-3.3",
-                    "datestamp": "1720755549",
+                    "version": "8.x-3.4",
+                    "datestamp": "1723563033",
                     "security-coverage": {
                         "status": "covered",
                         "message": "Covered by Drupal's security advisory policy"
@@ -5735,11 +5736,11 @@
                     "homepage": "https://www.drupal.org/user/395439"
                 },
                 {
-                    "name": "Liam Morland",
+                    "name": "liam morland",
                     "homepage": "https://www.drupal.org/user/493050"
                 },
                 {
-                    "name": "RobLoach",
+                    "name": "robloach",
                     "homepage": "https://www.drupal.org/user/61114"
                 },
                 {
@@ -5761,29 +5762,29 @@
         },
         {
             "name": "drupal/recaptcha_v3",
-            "version": "2.0.2",
-            "version_normalized": "2.0.2.0",
+            "version": "2.0.3",
+            "version_normalized": "2.0.3.0",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/recaptcha_v3.git",
-                "reference": "2.0.2"
+                "reference": "2.0.3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/recaptcha_v3-2.0.2.zip",
-                "reference": "2.0.2",
-                "shasum": "239e04bdb74179997e422c13cd76cfaac68bdf00"
+                "url": "https://ftp.drupal.org/files/projects/recaptcha_v3-2.0.3.zip",
+                "reference": "2.0.3",
+                "shasum": "51bdbfd4602550fb4822ba8725e8899e23d4568a"
             },
             "require": {
                 "drupal/captcha": "^2.0",
-                "drupal/core": "^9.5 || ^10",
+                "drupal/core": "^10 || ^11",
                 "google/recaptcha": "^1.3"
             },
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "2.0.2",
-                    "datestamp": "1692590086",
+                    "version": "2.0.3",
+                    "datestamp": "1723447296",
                     "security-coverage": {
                         "status": "covered",
                         "message": "Covered by Drupal's security advisory policy"
@@ -5818,27 +5819,27 @@
         },
         {
             "name": "drupal/redirect",
-            "version": "1.9.0",
-            "version_normalized": "1.9.0.0",
+            "version": "1.10.0",
+            "version_normalized": "1.10.0.0",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/redirect.git",
-                "reference": "8.x-1.9"
+                "reference": "8.x-1.10"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/redirect-8.x-1.9.zip",
-                "reference": "8.x-1.9",
-                "shasum": "2987de20f509e9f7cec8a0f81d3a6774f9b0ba3e"
+                "url": "https://ftp.drupal.org/files/projects/redirect-8.x-1.10.zip",
+                "reference": "8.x-1.10",
+                "shasum": "9d72d7e0717dbdea3ab3306c5d6840da5bd3024c"
             },
             "require": {
-                "drupal/core": "^9.2 || ^10"
+                "drupal/core": "^9.2 || ^10 || ^11"
             },
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "8.x-1.9",
-                    "datestamp": "1693393506",
+                    "version": "8.x-1.10",
+                    "datestamp": "1723277641",
                     "security-coverage": {
                         "status": "covered",
                         "message": "Covered by Drupal's security advisory policy"
@@ -5856,7 +5857,7 @@
                     "homepage": "https://www.drupal.org/user/214652"
                 },
                 {
-                    "name": "Dave Reid",
+                    "name": "dave reid",
                     "homepage": "https://www.drupal.org/user/53892"
                 },
                 {
@@ -11292,17 +11293,17 @@
         },
         {
             "name": "symfony/console",
-            "version": "v6.4.10",
-            "version_normalized": "6.4.10.0",
+            "version": "v6.4.11",
+            "version_normalized": "6.4.11.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/console.git",
-                "reference": "504974cbe43d05f83b201d6498c206f16fc0cdbc"
+                "reference": "42686880adaacdad1835ee8fc2a9ec5b7bd63998"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/console/zipball/504974cbe43d05f83b201d6498c206f16fc0cdbc",
-                "reference": "504974cbe43d05f83b201d6498c206f16fc0cdbc",
+                "url": "https://api.github.com/repos/symfony/console/zipball/42686880adaacdad1835ee8fc2a9ec5b7bd63998",
+                "reference": "42686880adaacdad1835ee8fc2a9ec5b7bd63998",
                 "shasum": ""
             },
             "require": {
@@ -11335,7 +11336,7 @@
                 "symfony/stopwatch": "^5.4|^6.0|^7.0",
                 "symfony/var-dumper": "^5.4|^6.0|^7.0"
             },
-            "time": "2024-07-26T12:30:32+00:00",
+            "time": "2024-08-15T22:48:29+00:00",
             "type": "library",
             "installation-source": "dist",
             "autoload": {
@@ -11369,7 +11370,7 @@
                 "terminal"
             ],
             "support": {
-                "source": "https://github.com/symfony/console/tree/v6.4.10"
+                "source": "https://github.com/symfony/console/tree/v6.4.11"
             },
             "funding": [
                 {
@@ -11389,17 +11390,17 @@
         },
         {
             "name": "symfony/dependency-injection",
-            "version": "v6.4.10",
-            "version_normalized": "6.4.10.0",
+            "version": "v6.4.11",
+            "version_normalized": "6.4.11.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/dependency-injection.git",
-                "reference": "5caf9c5f6085f13b27d70a236b776c07e4a1c3eb"
+                "reference": "e93c8368dc9915c2fe12018ff22fcbbdd32c9a9e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/5caf9c5f6085f13b27d70a236b776c07e4a1c3eb",
-                "reference": "5caf9c5f6085f13b27d70a236b776c07e4a1c3eb",
+                "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/e93c8368dc9915c2fe12018ff22fcbbdd32c9a9e",
+                "reference": "e93c8368dc9915c2fe12018ff22fcbbdd32c9a9e",
                 "shasum": ""
             },
             "require": {
@@ -11425,7 +11426,7 @@
                 "symfony/expression-language": "^5.4|^6.0|^7.0",
                 "symfony/yaml": "^5.4|^6.0|^7.0"
             },
-            "time": "2024-07-26T07:32:07+00:00",
+            "time": "2024-08-29T08:15:38+00:00",
             "type": "library",
             "installation-source": "dist",
             "autoload": {
@@ -11453,7 +11454,7 @@
             "description": "Allows you to standardize and centralize the way objects are constructed in your application",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/dependency-injection/tree/v6.4.10"
+                "source": "https://github.com/symfony/dependency-injection/tree/v6.4.11"
             },
             "funding": [
                 {
@@ -11852,17 +11853,17 @@
         },
         {
             "name": "symfony/finder",
-            "version": "v6.4.10",
-            "version_normalized": "6.4.10.0",
+            "version": "v6.4.11",
+            "version_normalized": "6.4.11.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/finder.git",
-                "reference": "af29198d87112bebdd397bd7735fbd115997824c"
+                "reference": "d7eb6daf8cd7e9ac4976e9576b32042ef7253453"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/finder/zipball/af29198d87112bebdd397bd7735fbd115997824c",
-                "reference": "af29198d87112bebdd397bd7735fbd115997824c",
+                "url": "https://api.github.com/repos/symfony/finder/zipball/d7eb6daf8cd7e9ac4976e9576b32042ef7253453",
+                "reference": "d7eb6daf8cd7e9ac4976e9576b32042ef7253453",
                 "shasum": ""
             },
             "require": {
@@ -11871,7 +11872,7 @@
             "require-dev": {
                 "symfony/filesystem": "^6.0|^7.0"
             },
-            "time": "2024-07-24T07:06:38+00:00",
+            "time": "2024-08-13T14:27:37+00:00",
             "type": "library",
             "installation-source": "dist",
             "autoload": {
@@ -11899,7 +11900,7 @@
             "description": "Finds files and directories via an intuitive fluent interface",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/finder/tree/v6.4.10"
+                "source": "https://github.com/symfony/finder/tree/v6.4.11"
             },
             "funding": [
                 {
@@ -12150,17 +12151,17 @@
         },
         {
             "name": "symfony/http-kernel",
-            "version": "v6.4.10",
-            "version_normalized": "6.4.10.0",
+            "version": "v6.4.11",
+            "version_normalized": "6.4.11.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/http-kernel.git",
-                "reference": "147e0daf618d7575b5007055340d09aece5cf068"
+                "reference": "1ba6b89d781cb47448155cc70dd2e0f1b0584c79"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/147e0daf618d7575b5007055340d09aece5cf068",
-                "reference": "147e0daf618d7575b5007055340d09aece5cf068",
+                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/1ba6b89d781cb47448155cc70dd2e0f1b0584c79",
+                "reference": "1ba6b89d781cb47448155cc70dd2e0f1b0584c79",
                 "shasum": ""
             },
             "require": {
@@ -12219,7 +12220,7 @@
                 "symfony/var-exporter": "^6.2|^7.0",
                 "twig/twig": "^2.13|^3.0.4"
             },
-            "time": "2024-07-26T14:52:04+00:00",
+            "time": "2024-08-30T16:57:20+00:00",
             "type": "library",
             "installation-source": "dist",
             "autoload": {
@@ -12247,7 +12248,7 @@
             "description": "Provides a structured process for converting a Request into a Response",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/http-kernel/tree/v6.4.10"
+                "source": "https://github.com/symfony/http-kernel/tree/v6.4.11"
             },
             "funding": [
                 {
@@ -12436,17 +12437,17 @@
         },
         {
             "name": "symfony/mime",
-            "version": "v6.4.9",
-            "version_normalized": "6.4.9.0",
+            "version": "v6.4.11",
+            "version_normalized": "6.4.11.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/mime.git",
-                "reference": "7d048964877324debdcb4e0549becfa064a20d43"
+                "reference": "dba5d5f6073baf7a3576b580cc4a208b4ca00553"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/mime/zipball/7d048964877324debdcb4e0549becfa064a20d43",
-                "reference": "7d048964877324debdcb4e0549becfa064a20d43",
+                "url": "https://api.github.com/repos/symfony/mime/zipball/dba5d5f6073baf7a3576b580cc4a208b4ca00553",
+                "reference": "dba5d5f6073baf7a3576b580cc4a208b4ca00553",
                 "shasum": ""
             },
             "require": {
@@ -12472,7 +12473,7 @@
                 "symfony/property-info": "^5.4|^6.0|^7.0",
                 "symfony/serializer": "^6.4.3|^7.0.3"
             },
-            "time": "2024-06-28T09:49:33+00:00",
+            "time": "2024-08-13T12:15:02+00:00",
             "type": "library",
             "installation-source": "dist",
             "autoload": {
@@ -12504,7 +12505,7 @@
                 "mime-type"
             ],
             "support": {
-                "source": "https://github.com/symfony/mime/tree/v6.4.9"
+                "source": "https://github.com/symfony/mime/tree/v6.4.11"
             },
             "funding": [
                 {
@@ -13568,17 +13569,17 @@
         },
         {
             "name": "symfony/psr-http-message-bridge",
-            "version": "v6.4.10",
-            "version_normalized": "6.4.10.0",
+            "version": "v6.4.11",
+            "version_normalized": "6.4.11.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/psr-http-message-bridge.git",
-                "reference": "89a24648d73e4eee30893b0da16abc454a65c53b"
+                "reference": "74835ba54eca99a38f374f7a6d932fa510124773"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/89a24648d73e4eee30893b0da16abc454a65c53b",
-                "reference": "89a24648d73e4eee30893b0da16abc454a65c53b",
+                "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/74835ba54eca99a38f374f7a6d932fa510124773",
+                "reference": "74835ba54eca99a38f374f7a6d932fa510124773",
                 "shasum": ""
             },
             "require": {
@@ -13600,7 +13601,7 @@
                 "symfony/framework-bundle": "^6.2|^7.0",
                 "symfony/http-kernel": "^6.2|^7.0"
             },
-            "time": "2024-07-15T09:36:38+00:00",
+            "time": "2024-08-14T13:55:58+00:00",
             "type": "symfony-bridge",
             "installation-source": "dist",
             "autoload": {
@@ -13634,7 +13635,7 @@
                 "psr-7"
             ],
             "support": {
-                "source": "https://github.com/symfony/psr-http-message-bridge/tree/v6.4.10"
+                "source": "https://github.com/symfony/psr-http-message-bridge/tree/v6.4.11"
             },
             "funding": [
                 {
@@ -13654,17 +13655,17 @@
         },
         {
             "name": "symfony/routing",
-            "version": "v6.4.10",
-            "version_normalized": "6.4.10.0",
+            "version": "v6.4.11",
+            "version_normalized": "6.4.11.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/routing.git",
-                "reference": "aad19fe10753ba842f0d653a8db819c4b3affa87"
+                "reference": "8ee0c24c1bf61c263a26f1b9b6d19e83b1121f2a"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/routing/zipball/aad19fe10753ba842f0d653a8db819c4b3affa87",
-                "reference": "aad19fe10753ba842f0d653a8db819c4b3affa87",
+                "url": "https://api.github.com/repos/symfony/routing/zipball/8ee0c24c1bf61c263a26f1b9b6d19e83b1121f2a",
+                "reference": "8ee0c24c1bf61c263a26f1b9b6d19e83b1121f2a",
                 "shasum": ""
             },
             "require": {
@@ -13686,7 +13687,7 @@
                 "symfony/http-foundation": "^5.4|^6.0|^7.0",
                 "symfony/yaml": "^5.4|^6.0|^7.0"
             },
-            "time": "2024-07-15T09:26:24+00:00",
+            "time": "2024-08-29T08:15:38+00:00",
             "type": "library",
             "installation-source": "dist",
             "autoload": {
@@ -13720,7 +13721,7 @@
                 "url"
             ],
             "support": {
-                "source": "https://github.com/symfony/routing/tree/v6.4.10"
+                "source": "https://github.com/symfony/routing/tree/v6.4.11"
             },
             "funding": [
                 {
@@ -13740,17 +13741,17 @@
         },
         {
             "name": "symfony/serializer",
-            "version": "v6.4.10",
-            "version_normalized": "6.4.10.0",
+            "version": "v6.4.11",
+            "version_normalized": "6.4.11.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/serializer.git",
-                "reference": "9a67fcf320561e96f94d62bbe0e169ac534a5718"
+                "reference": "a75d03d7720417f8a654e73e8f02acdea8779cd0"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/serializer/zipball/9a67fcf320561e96f94d62bbe0e169ac534a5718",
-                "reference": "9a67fcf320561e96f94d62bbe0e169ac534a5718",
+                "url": "https://api.github.com/repos/symfony/serializer/zipball/a75d03d7720417f8a654e73e8f02acdea8779cd0",
+                "reference": "a75d03d7720417f8a654e73e8f02acdea8779cd0",
                 "shasum": ""
             },
             "require": {
@@ -13793,7 +13794,7 @@
                 "symfony/var-exporter": "^5.4|^6.0|^7.0",
                 "symfony/yaml": "^5.4|^6.0|^7.0"
             },
-            "time": "2024-07-26T13:13:26+00:00",
+            "time": "2024-08-17T07:51:47+00:00",
             "type": "library",
             "installation-source": "dist",
             "autoload": {
@@ -13821,7 +13822,7 @@
             "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/serializer/tree/v6.4.10"
+                "source": "https://github.com/symfony/serializer/tree/v6.4.11"
             },
             "funding": [
                 {
@@ -13927,17 +13928,17 @@
         },
         {
             "name": "symfony/string",
-            "version": "v6.4.10",
-            "version_normalized": "6.4.10.0",
+            "version": "v6.4.11",
+            "version_normalized": "6.4.11.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/string.git",
-                "reference": "ccf9b30251719567bfd46494138327522b9a9446"
+                "reference": "5bc3eb632cf9c8dbfd6529d89be9950d1518883b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/string/zipball/ccf9b30251719567bfd46494138327522b9a9446",
-                "reference": "ccf9b30251719567bfd46494138327522b9a9446",
+                "url": "https://api.github.com/repos/symfony/string/zipball/5bc3eb632cf9c8dbfd6529d89be9950d1518883b",
+                "reference": "5bc3eb632cf9c8dbfd6529d89be9950d1518883b",
                 "shasum": ""
             },
             "require": {
@@ -13957,7 +13958,7 @@
                 "symfony/translation-contracts": "^2.5|^3.0",
                 "symfony/var-exporter": "^5.4|^6.0|^7.0"
             },
-            "time": "2024-07-22T10:21:14+00:00",
+            "time": "2024-08-12T09:55:28+00:00",
             "type": "library",
             "installation-source": "dist",
             "autoload": {
@@ -13996,7 +13997,7 @@
                 "utf8"
             ],
             "support": {
-                "source": "https://github.com/symfony/string/tree/v6.4.10"
+                "source": "https://github.com/symfony/string/tree/v6.4.11"
             },
             "funding": [
                 {
@@ -14209,17 +14210,17 @@
         },
         {
             "name": "symfony/validator",
-            "version": "v6.4.10",
-            "version_normalized": "6.4.10.0",
+            "version": "v6.4.11",
+            "version_normalized": "6.4.11.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/validator.git",
-                "reference": "bcf939a9d1acd7d2912e9474c0c3d7840a03cbcd"
+                "reference": "4ff41cf10af1de99ad92895411b55c9f309bc2d8"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/validator/zipball/bcf939a9d1acd7d2912e9474c0c3d7840a03cbcd",
-                "reference": "bcf939a9d1acd7d2912e9474c0c3d7840a03cbcd",
+                "url": "https://api.github.com/repos/symfony/validator/zipball/4ff41cf10af1de99ad92895411b55c9f309bc2d8",
+                "reference": "4ff41cf10af1de99ad92895411b55c9f309bc2d8",
                 "shasum": ""
             },
             "require": {
@@ -14260,7 +14261,7 @@
                 "symfony/translation": "^5.4.35|~6.3.12|^6.4.3|^7.0.3",
                 "symfony/yaml": "^5.4|^6.0|^7.0"
             },
-            "time": "2024-07-26T12:30:32+00:00",
+            "time": "2024-08-30T15:57:55+00:00",
             "type": "library",
             "installation-source": "dist",
             "autoload": {
@@ -14289,7 +14290,7 @@
             "description": "Provides tools to validate values",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/validator/tree/v6.4.10"
+                "source": "https://github.com/symfony/validator/tree/v6.4.11"
             },
             "funding": [
                 {
@@ -14309,17 +14310,17 @@
         },
         {
             "name": "symfony/var-dumper",
-            "version": "v6.4.10",
-            "version_normalized": "6.4.10.0",
+            "version": "v6.4.11",
+            "version_normalized": "6.4.11.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/var-dumper.git",
-                "reference": "a71cc3374f5fb9759da1961d28c452373b343dd4"
+                "reference": "ee14c8254a480913268b1e3b1cba8045ed122694"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/a71cc3374f5fb9759da1961d28c452373b343dd4",
-                "reference": "a71cc3374f5fb9759da1961d28c452373b343dd4",
+                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/ee14c8254a480913268b1e3b1cba8045ed122694",
+                "reference": "ee14c8254a480913268b1e3b1cba8045ed122694",
                 "shasum": ""
             },
             "require": {
@@ -14339,7 +14340,7 @@
                 "symfony/uid": "^5.4|^6.0|^7.0",
                 "twig/twig": "^2.13|^3.0.4"
             },
-            "time": "2024-07-26T12:30:32+00:00",
+            "time": "2024-08-30T16:03:21+00:00",
             "bin": [
                 "Resources/bin/var-dump-server"
             ],
@@ -14377,7 +14378,7 @@
                 "dump"
             ],
             "support": {
-                "source": "https://github.com/symfony/var-dumper/tree/v6.4.10"
+                "source": "https://github.com/symfony/var-dumper/tree/v6.4.11"
             },
             "funding": [
                 {
@@ -14477,17 +14478,17 @@
         },
         {
             "name": "symfony/yaml",
-            "version": "v6.4.7",
-            "version_normalized": "6.4.7.0",
+            "version": "v6.4.11",
+            "version_normalized": "6.4.11.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/yaml.git",
-                "reference": "53e8b1ef30a65f78eac60fddc5ee7ebbbdb1dee0"
+                "reference": "be37e7f13195e05ab84ca5269365591edd240335"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/yaml/zipball/53e8b1ef30a65f78eac60fddc5ee7ebbbdb1dee0",
-                "reference": "53e8b1ef30a65f78eac60fddc5ee7ebbbdb1dee0",
+                "url": "https://api.github.com/repos/symfony/yaml/zipball/be37e7f13195e05ab84ca5269365591edd240335",
+                "reference": "be37e7f13195e05ab84ca5269365591edd240335",
                 "shasum": ""
             },
             "require": {
@@ -14501,7 +14502,7 @@
             "require-dev": {
                 "symfony/console": "^5.4|^6.0|^7.0"
             },
-            "time": "2024-04-28T10:28:08+00:00",
+            "time": "2024-08-12T09:55:28+00:00",
             "bin": [
                 "Resources/bin/yaml-lint"
             ],
@@ -14532,7 +14533,7 @@
             "description": "Loads and dumps YAML files",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/yaml/tree/v6.4.7"
+                "source": "https://github.com/symfony/yaml/tree/v6.4.11"
             },
             "funding": [
                 {
diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php
index 1e645bb4e90fd01b6a2f9edfbc62651efa66e1c5..2723e3789dddcc18d54c0863aee45e57fa4e9160 100644
--- a/vendor/composer/installed.php
+++ b/vendor/composer/installed.php
@@ -3,7 +3,7 @@
         'name' => 'asc-web-services/drupal-upstream',
         'pretty_version' => 'dev-main',
         'version' => 'dev-main',
-        'reference' => '04a46086f1ed199c2405ba7eb24d8edf6ad6c8f6',
+        'reference' => 'e26ce4777b35df65b8584c0a393d70d92ec00622',
         'type' => 'project',
         'install_path' => __DIR__ . '/../../',
         'aliases' => array(),
@@ -22,7 +22,7 @@
         'asc-web-services/drupal-upstream' => array(
             'pretty_version' => 'dev-main',
             'version' => 'dev-main',
-            'reference' => '04a46086f1ed199c2405ba7eb24d8edf6ad6c8f6',
+            'reference' => 'e26ce4777b35df65b8584c0a393d70d92ec00622',
             'type' => 'project',
             'install_path' => __DIR__ . '/../../',
             'aliases' => array(),
@@ -272,9 +272,9 @@
             'dev_requirement' => false,
         ),
         'drupal/block_field' => array(
-            'pretty_version' => '1.0.0-rc4',
-            'version' => '1.0.0.0-RC4',
-            'reference' => '8.x-1.0-rc4',
+            'pretty_version' => '1.0.0-rc5',
+            'version' => '1.0.0.0-RC5',
+            'reference' => '8.x-1.0-rc5',
             'type' => 'drupal-module',
             'install_path' => __DIR__ . '/../../web/modules/block_field',
             'aliases' => array(),
@@ -569,9 +569,9 @@
             'dev_requirement' => false,
         ),
         'drupal/entity_browser' => array(
-            'pretty_version' => '2.10.0',
-            'version' => '2.10.0.0',
-            'reference' => '8.x-2.10',
+            'pretty_version' => '2.11.0',
+            'version' => '2.11.0.0',
+            'reference' => '8.x-2.11',
             'type' => 'drupal-module',
             'install_path' => __DIR__ . '/../../web/modules/entity_browser',
             'aliases' => array(),
@@ -947,27 +947,27 @@
             'dev_requirement' => false,
         ),
         'drupal/recaptcha' => array(
-            'pretty_version' => '3.3.0',
-            'version' => '3.3.0.0',
-            'reference' => '8.x-3.3',
+            'pretty_version' => '3.4.0',
+            'version' => '3.4.0.0',
+            'reference' => '8.x-3.4',
             'type' => 'drupal-module',
             'install_path' => __DIR__ . '/../../web/modules/recaptcha',
             'aliases' => array(),
             'dev_requirement' => false,
         ),
         'drupal/recaptcha_v3' => array(
-            'pretty_version' => '2.0.2',
-            'version' => '2.0.2.0',
-            'reference' => '2.0.2',
+            'pretty_version' => '2.0.3',
+            'version' => '2.0.3.0',
+            'reference' => '2.0.3',
             'type' => 'drupal-module',
             'install_path' => __DIR__ . '/../../web/modules/recaptcha_v3',
             'aliases' => array(),
             'dev_requirement' => false,
         ),
         'drupal/redirect' => array(
-            'pretty_version' => '1.9.0',
-            'version' => '1.9.0.0',
-            'reference' => '8.x-1.9',
+            'pretty_version' => '1.10.0',
+            'version' => '1.10.0.0',
+            'reference' => '8.x-1.10',
             'type' => 'drupal-module',
             'install_path' => __DIR__ . '/../../web/modules/redirect',
             'aliases' => array(),
@@ -1878,18 +1878,18 @@
             'dev_requirement' => false,
         ),
         'symfony/console' => array(
-            'pretty_version' => 'v6.4.10',
-            'version' => '6.4.10.0',
-            'reference' => '504974cbe43d05f83b201d6498c206f16fc0cdbc',
+            'pretty_version' => 'v6.4.11',
+            'version' => '6.4.11.0',
+            'reference' => '42686880adaacdad1835ee8fc2a9ec5b7bd63998',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/console',
             'aliases' => array(),
             'dev_requirement' => false,
         ),
         'symfony/dependency-injection' => array(
-            'pretty_version' => 'v6.4.10',
-            'version' => '6.4.10.0',
-            'reference' => '5caf9c5f6085f13b27d70a236b776c07e4a1c3eb',
+            'pretty_version' => 'v6.4.11',
+            'version' => '6.4.11.0',
+            'reference' => 'e93c8368dc9915c2fe12018ff22fcbbdd32c9a9e',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/dependency-injection',
             'aliases' => array(),
@@ -1947,9 +1947,9 @@
             'dev_requirement' => false,
         ),
         'symfony/finder' => array(
-            'pretty_version' => 'v6.4.10',
-            'version' => '6.4.10.0',
-            'reference' => 'af29198d87112bebdd397bd7735fbd115997824c',
+            'pretty_version' => 'v6.4.11',
+            'version' => '6.4.11.0',
+            'reference' => 'd7eb6daf8cd7e9ac4976e9576b32042ef7253453',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/finder',
             'aliases' => array(),
@@ -1974,9 +1974,9 @@
             'dev_requirement' => false,
         ),
         'symfony/http-kernel' => array(
-            'pretty_version' => 'v6.4.10',
-            'version' => '6.4.10.0',
-            'reference' => '147e0daf618d7575b5007055340d09aece5cf068',
+            'pretty_version' => 'v6.4.11',
+            'version' => '6.4.11.0',
+            'reference' => '1ba6b89d781cb47448155cc70dd2e0f1b0584c79',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/http-kernel',
             'aliases' => array(),
@@ -2001,9 +2001,9 @@
             'dev_requirement' => false,
         ),
         'symfony/mime' => array(
-            'pretty_version' => 'v6.4.9',
-            'version' => '6.4.9.0',
-            'reference' => '7d048964877324debdcb4e0549becfa064a20d43',
+            'pretty_version' => 'v6.4.11',
+            'version' => '6.4.11.0',
+            'reference' => 'dba5d5f6073baf7a3576b580cc4a208b4ca00553',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/mime',
             'aliases' => array(),
@@ -2127,27 +2127,27 @@
             'dev_requirement' => false,
         ),
         'symfony/psr-http-message-bridge' => array(
-            'pretty_version' => 'v6.4.10',
-            'version' => '6.4.10.0',
-            'reference' => '89a24648d73e4eee30893b0da16abc454a65c53b',
+            'pretty_version' => 'v6.4.11',
+            'version' => '6.4.11.0',
+            'reference' => '74835ba54eca99a38f374f7a6d932fa510124773',
             'type' => 'symfony-bridge',
             'install_path' => __DIR__ . '/../symfony/psr-http-message-bridge',
             'aliases' => array(),
             'dev_requirement' => false,
         ),
         'symfony/routing' => array(
-            'pretty_version' => 'v6.4.10',
-            'version' => '6.4.10.0',
-            'reference' => 'aad19fe10753ba842f0d653a8db819c4b3affa87',
+            'pretty_version' => 'v6.4.11',
+            'version' => '6.4.11.0',
+            'reference' => '8ee0c24c1bf61c263a26f1b9b6d19e83b1121f2a',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/routing',
             'aliases' => array(),
             'dev_requirement' => false,
         ),
         'symfony/serializer' => array(
-            'pretty_version' => 'v6.4.10',
-            'version' => '6.4.10.0',
-            'reference' => '9a67fcf320561e96f94d62bbe0e169ac534a5718',
+            'pretty_version' => 'v6.4.11',
+            'version' => '6.4.11.0',
+            'reference' => 'a75d03d7720417f8a654e73e8f02acdea8779cd0',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/serializer',
             'aliases' => array(),
@@ -2169,9 +2169,9 @@
             ),
         ),
         'symfony/string' => array(
-            'pretty_version' => 'v6.4.10',
-            'version' => '6.4.10.0',
-            'reference' => 'ccf9b30251719567bfd46494138327522b9a9446',
+            'pretty_version' => 'v6.4.11',
+            'version' => '6.4.11.0',
+            'reference' => '5bc3eb632cf9c8dbfd6529d89be9950d1518883b',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/string',
             'aliases' => array(),
@@ -2196,18 +2196,18 @@
             'dev_requirement' => false,
         ),
         'symfony/validator' => array(
-            'pretty_version' => 'v6.4.10',
-            'version' => '6.4.10.0',
-            'reference' => 'bcf939a9d1acd7d2912e9474c0c3d7840a03cbcd',
+            'pretty_version' => 'v6.4.11',
+            'version' => '6.4.11.0',
+            'reference' => '4ff41cf10af1de99ad92895411b55c9f309bc2d8',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/validator',
             'aliases' => array(),
             'dev_requirement' => false,
         ),
         'symfony/var-dumper' => array(
-            'pretty_version' => 'v6.4.10',
-            'version' => '6.4.10.0',
-            'reference' => 'a71cc3374f5fb9759da1961d28c452373b343dd4',
+            'pretty_version' => 'v6.4.11',
+            'version' => '6.4.11.0',
+            'reference' => 'ee14c8254a480913268b1e3b1cba8045ed122694',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/var-dumper',
             'aliases' => array(),
@@ -2223,9 +2223,9 @@
             'dev_requirement' => false,
         ),
         'symfony/yaml' => array(
-            'pretty_version' => 'v6.4.7',
-            'version' => '6.4.7.0',
-            'reference' => '53e8b1ef30a65f78eac60fddc5ee7ebbbdb1dee0',
+            'pretty_version' => 'v6.4.11',
+            'version' => '6.4.11.0',
+            'reference' => 'be37e7f13195e05ab84ca5269365591edd240335',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/yaml',
             'aliases' => array(),
diff --git a/vendor/symfony/console/Output/StreamOutput.php b/vendor/symfony/console/Output/StreamOutput.php
index ca90096a440edc041d15d24f9d335705c3db360b..f51d0376336fbd631be0b545ba8f00f667a9de8d 100644
--- a/vendor/symfony/console/Output/StreamOutput.php
+++ b/vendor/symfony/console/Output/StreamOutput.php
@@ -93,7 +93,7 @@ protected function doWrite(string $message, bool $newline)
     protected function hasColorSupport(): bool
     {
         // Follow https://no-color.org/
-        if ('' !== ($_SERVER['NO_COLOR'] ?? getenv('NO_COLOR') ?: '')) {
+        if ('' !== (($_SERVER['NO_COLOR'] ?? getenv('NO_COLOR'))[0] ?? '')) {
             return false;
         }
 
diff --git a/vendor/symfony/console/Question/ChoiceQuestion.php b/vendor/symfony/console/Question/ChoiceQuestion.php
index e449ff683d20a5cdd5319a265143c7d647776dca..465f3184fb97f8bb0923bedf51f568b88437d488 100644
--- a/vendor/symfony/console/Question/ChoiceQuestion.php
+++ b/vendor/symfony/console/Question/ChoiceQuestion.php
@@ -26,11 +26,11 @@ class ChoiceQuestion extends Question
     private string $errorMessage = 'Value "%s" is invalid';
 
     /**
-     * @param string $question The question to ask to the user
-     * @param array  $choices  The list of available choices
-     * @param mixed  $default  The default answer to return
+     * @param string                     $question The question to ask to the user
+     * @param array                      $choices  The list of available choices
+     * @param string|bool|int|float|null $default  The default answer to return
      */
-    public function __construct(string $question, array $choices, mixed $default = null)
+    public function __construct(string $question, array $choices, string|bool|int|float|null $default = null)
     {
         if (!$choices) {
             throw new \LogicException('Choice question must have at least 1 choice available.');
diff --git a/vendor/symfony/console/Resources/completion.bash b/vendor/symfony/console/Resources/completion.bash
index 0d76eacc3b748a4bdecaab90033f62753cb17edb..64c6a338fcc1bd48bc46d07101834677277aa748 100644
--- a/vendor/symfony/console/Resources/completion.bash
+++ b/vendor/symfony/console/Resources/completion.bash
@@ -17,7 +17,7 @@ _sf_{{ COMMAND_NAME }}() {
     done
 
     # Use newline as only separator to allow space in completion values
-    IFS=$'\n'
+    local IFS=$'\n'
     local sf_cmd="${COMP_WORDS[0]}"
 
     # for an alias, get the real script behind it
diff --git a/vendor/symfony/dependency-injection/Compiler/PriorityTaggedServiceTrait.php b/vendor/symfony/dependency-injection/Compiler/PriorityTaggedServiceTrait.php
index 42410cebefdd70c98393a5b1f0c9d67dad927573..5d2110bf9ff3aab11c029b870f1041fd9a007452 100644
--- a/vendor/symfony/dependency-injection/Compiler/PriorityTaggedServiceTrait.php
+++ b/vendor/symfony/dependency-injection/Compiler/PriorityTaggedServiceTrait.php
@@ -85,7 +85,8 @@ private function findAndSortTaggedServices(string|TaggedIteratorArgument $tagNam
                 } elseif (null === $defaultIndex && $defaultPriorityMethod && $class) {
                     $defaultIndex = PriorityTaggedServiceUtil::getDefault($container, $serviceId, $class, $defaultIndexMethod ?? 'getDefaultName', $tagName, $indexAttribute, $checkTaggedItem);
                 }
-                $index ??= $defaultIndex ??= $serviceId;
+                $decorated = $definition->getTag('container.decorator')[0]['id'] ?? null;
+                $index = $index ?? $defaultIndex ?? $defaultIndex = $decorated ?? $serviceId;
 
                 $services[] = [$priority, ++$i, $index, $serviceId, $class];
             }
diff --git a/vendor/symfony/dependency-injection/ContainerBuilder.php b/vendor/symfony/dependency-injection/ContainerBuilder.php
index 9e26bf887c3dfaf7478dfc68e7602ba02daaf573..62b41a06c4cc29e92926d20cf9ae38a740866738 100644
--- a/vendor/symfony/dependency-injection/ContainerBuilder.php
+++ b/vendor/symfony/dependency-injection/ContainerBuilder.php
@@ -117,7 +117,7 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
     private array $vendors;
 
     /**
-     * @var string[] the list of paths in vendor directories
+     * @var array<string, bool> the cache for paths being in vendor directories
      */
     private array $pathsInVendor = [];
 
diff --git a/vendor/symfony/dependency-injection/ExpressionLanguageProvider.php b/vendor/symfony/dependency-injection/ExpressionLanguageProvider.php
index 6ae797d864ecc32eb21005bb5597455113ac42b0..60479ea37bd82d1d6123215382b299d324bfa707 100644
--- a/vendor/symfony/dependency-injection/ExpressionLanguageProvider.php
+++ b/vendor/symfony/dependency-injection/ExpressionLanguageProvider.php
@@ -45,7 +45,7 @@ public function getFunctions(): array
 
             new ExpressionFunction('env', fn ($arg) => sprintf('$container->getEnv(%s)', $arg), function (array $variables, $value) {
                 if (!$this->getEnv) {
-                    throw new LogicException('You need to pass a getEnv closure to the expression langage provider to use the "env" function.');
+                    throw new LogicException('You need to pass a getEnv closure to the expression language provider to use the "env" function.');
                 }
 
                 return ($this->getEnv)($value);
diff --git a/vendor/symfony/dependency-injection/Loader/XmlFileLoader.php b/vendor/symfony/dependency-injection/Loader/XmlFileLoader.php
index 147a7db115efac66642c05119d74f4826e0f5ba5..2bdedef93f11dc6b0099df89c5133d4c332ed340 100644
--- a/vendor/symfony/dependency-injection/Loader/XmlFileLoader.php
+++ b/vendor/symfony/dependency-injection/Loader/XmlFileLoader.php
@@ -458,7 +458,33 @@ private function parseFileToDOM(string $file): \DOMDocument
         try {
             $dom = XmlUtils::loadFile($file, $this->validateSchema(...));
         } catch (\InvalidArgumentException $e) {
-            throw new InvalidArgumentException(sprintf('Unable to parse file "%s": ', $file).$e->getMessage(), $e->getCode(), $e);
+            $invalidSecurityElements = [];
+            $errors = explode("\n", $e->getMessage());
+            foreach ($errors as $i => $error) {
+                if (preg_match("#^\[ERROR 1871] Element '\{http://symfony\.com/schema/dic/security}([^']+)'#", $error, $matches)) {
+                    $invalidSecurityElements[$i] = $matches[1];
+                }
+            }
+            if ($invalidSecurityElements) {
+                $dom = XmlUtils::loadFile($file);
+
+                foreach ($invalidSecurityElements as $errorIndex => $tagName) {
+                    foreach ($dom->getElementsByTagNameNS('http://symfony.com/schema/dic/security', $tagName) as $element) {
+                        if (!$parent = $element->parentNode) {
+                            continue;
+                        }
+                        if ('http://symfony.com/schema/dic/security' !== $parent->namespaceURI) {
+                            continue;
+                        }
+                        if ('provider' === $parent->localName || 'firewall' === $parent->localName) {
+                            unset($errors[$errorIndex]);
+                        }
+                    }
+                }
+            }
+            if ($errors) {
+                throw new InvalidArgumentException(sprintf('Unable to parse file "%s": ', $file).implode("/n", $errors), $e->getCode(), $e);
+            }
         }
 
         $this->validateExtensions($dom, $file);
@@ -858,6 +884,6 @@ private function loadFromExtensions(\DOMDocument $xml): void
      */
     public static function convertDomElementToArray(\DOMElement $element): mixed
     {
-        return XmlUtils::convertDomElementToArray($element);
+        return XmlUtils::convertDomElementToArray($element, false);
     }
 }
diff --git a/vendor/symfony/dependency-injection/Loader/YamlFileLoader.php b/vendor/symfony/dependency-injection/Loader/YamlFileLoader.php
index 42645825d54cbfdc75f43ce9e6846f8841da3287..ae5a625df6349ab263773ea39e6ee057c7eb3ac0 100644
--- a/vendor/symfony/dependency-injection/Loader/YamlFileLoader.php
+++ b/vendor/symfony/dependency-injection/Loader/YamlFileLoader.php
@@ -450,8 +450,9 @@ private function parseDefinition(string $id, array|string|null $service, string
             return $return ? $alias : $this->container->setAlias($id, $alias);
         }
 
+        $changes = [];
         if (null !== $definition) {
-            // no-op
+            $changes = $definition->getChanges();
         } elseif ($this->isLoadingInstanceof) {
             $definition = new ChildDefinition('');
         } elseif (isset($service['parent'])) {
@@ -474,7 +475,7 @@ private function parseDefinition(string $id, array|string|null $service, string
             $definition->setAutoconfigured($defaults['autoconfigure']);
         }
 
-        $definition->setChanges([]);
+        $definition->setChanges($changes);
 
         if (isset($service['class'])) {
             $definition->setClass($service['class']);
@@ -556,7 +557,7 @@ private function parseDefinition(string $id, array|string|null $service, string
                 }
 
                 if (\is_string($k)) {
-                    throw new InvalidArgumentException(sprintf('Invalid method call for service "%s", did you forgot a leading dash before "%s: ..." in "%s"?', $id, $k, $file));
+                    throw new InvalidArgumentException(sprintf('Invalid method call for service "%s", did you forget a leading dash before "%s: ..." in "%s"?', $id, $k, $file));
                 }
 
                 if (isset($call['method']) && \is_string($call['method'])) {
diff --git a/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php b/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php
index 34cced6889b1b3b5b726c98129a51226b7b6788e..f5fd2d4dc5b0cfb0f49cb1276608fe5cfdb41562 100644
--- a/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php
+++ b/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php
@@ -63,8 +63,9 @@ public function current(): SplFileInfo
             $subPathname .= $this->directorySeparator;
         }
         $subPathname .= $this->getFilename();
+        $basePath = $this->rootPath;
 
-        if ('/' !== $basePath = $this->rootPath) {
+        if ('/' !== $basePath && !str_ends_with($basePath, $this->directorySeparator) && !str_ends_with($basePath, '/')) {
             $basePath .= $this->directorySeparator;
         }
 
diff --git a/vendor/symfony/http-kernel/HttpCache/HttpCache.php b/vendor/symfony/http-kernel/HttpCache/HttpCache.php
index 184666978cf421bea999cbdeb003008158f58099..6ffe8890571b66e603c15a5d6e5a0d39c8537188 100644
--- a/vendor/symfony/http-kernel/HttpCache/HttpCache.php
+++ b/vendor/symfony/http-kernel/HttpCache/HttpCache.php
@@ -237,7 +237,9 @@ public function handle(Request $request, int $type = HttpKernelInterface::MAIN_R
 
         $response->prepare($request);
 
-        $response->isNotModified($request);
+        if (HttpKernelInterface::MAIN_REQUEST === $type) {
+            $response->isNotModified($request);
+        }
 
         return $response;
     }
diff --git a/vendor/symfony/http-kernel/Kernel.php b/vendor/symfony/http-kernel/Kernel.php
index 22c3bc2b3372e5d50ccfcc029d6ce321cca13ac8..8fa757ffe278efa37c66f073001df3a9185d5485 100644
--- a/vendor/symfony/http-kernel/Kernel.php
+++ b/vendor/symfony/http-kernel/Kernel.php
@@ -76,11 +76,11 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl
      */
     private static array $freshCache = [];
 
-    public const VERSION = '6.4.10';
-    public const VERSION_ID = 60410;
+    public const VERSION = '6.4.11';
+    public const VERSION_ID = 60411;
     public const MAJOR_VERSION = 6;
     public const MINOR_VERSION = 4;
-    public const RELEASE_VERSION = 10;
+    public const RELEASE_VERSION = 11;
     public const EXTRA_VERSION = '';
 
     public const END_OF_MAINTENANCE = '11/2026';
diff --git a/vendor/symfony/mime/RawMessage.php b/vendor/symfony/mime/RawMessage.php
index 484ffb0073f6ac987fd69a3857ea27cf17a1136e..2b1b52cde12264677f0fb0b30a0daedc18fc7a8a 100644
--- a/vendor/symfony/mime/RawMessage.php
+++ b/vendor/symfony/mime/RawMessage.php
@@ -18,11 +18,14 @@
  */
 class RawMessage
 {
-    /** @var iterable|string|resource */
+    /** @var iterable<string>|string|resource */
     private $message;
     private bool $isGeneratorClosed;
 
-    public function __construct(iterable|string $message)
+    /**
+     * @param iterable<string>|string|resource $message
+     */
+    public function __construct(mixed $message)
     {
         $this->message = $message;
     }
diff --git a/vendor/symfony/psr-http-message-bridge/Factory/HttpFoundationFactory.php b/vendor/symfony/psr-http-message-bridge/Factory/HttpFoundationFactory.php
index b1ee25a40df45ef3e896181f97d8544554911293..cad798e5fc91b85bc47e8c60b2a80a3b6f8d4d19 100644
--- a/vendor/symfony/psr-http-message-bridge/Factory/HttpFoundationFactory.php
+++ b/vendor/symfony/psr-http-message-bridge/Factory/HttpFoundationFactory.php
@@ -132,89 +132,12 @@ public function createResponse(ResponseInterface $psrResponse, bool $streamed =
         $response->setProtocolVersion($psrResponse->getProtocolVersion());
 
         foreach ($cookies as $cookie) {
-            $response->headers->setCookie($this->createCookie($cookie));
+            $response->headers->setCookie(Cookie::fromString($cookie));
         }
 
         return $response;
     }
 
-    /**
-     * Creates a Cookie instance from a cookie string.
-     *
-     * Some snippets have been taken from the Guzzle project: https://github.com/guzzle/guzzle/blob/5.3/src/Cookie/SetCookie.php#L34
-     *
-     * @throws \InvalidArgumentException
-     */
-    private function createCookie(string $cookie): Cookie
-    {
-        foreach (explode(';', $cookie) as $part) {
-            $part = trim($part);
-
-            $data = explode('=', $part, 2);
-            $name = $data[0];
-            $value = isset($data[1]) ? trim($data[1], " \n\r\t\0\x0B\"") : null;
-
-            if (!isset($cookieName)) {
-                $cookieName = $name;
-                $cookieValue = $value;
-
-                continue;
-            }
-
-            if ('expires' === strtolower($name) && null !== $value) {
-                $cookieExpire = new \DateTime($value);
-
-                continue;
-            }
-
-            if ('path' === strtolower($name) && null !== $value) {
-                $cookiePath = $value;
-
-                continue;
-            }
-
-            if ('domain' === strtolower($name) && null !== $value) {
-                $cookieDomain = $value;
-
-                continue;
-            }
-
-            if ('secure' === strtolower($name)) {
-                $cookieSecure = true;
-
-                continue;
-            }
-
-            if ('httponly' === strtolower($name)) {
-                $cookieHttpOnly = true;
-
-                continue;
-            }
-
-            if ('samesite' === strtolower($name) && null !== $value) {
-                $samesite = $value;
-
-                continue;
-            }
-        }
-
-        if (!isset($cookieName)) {
-            throw new \InvalidArgumentException('The value of the Set-Cookie header is malformed.');
-        }
-
-        return new Cookie(
-            $cookieName,
-            $cookieValue,
-            $cookieExpire ?? 0,
-            $cookiePath ?? '/',
-            $cookieDomain ?? null,
-            isset($cookieSecure),
-            isset($cookieHttpOnly),
-            true,
-            $samesite ?? null
-        );
-    }
-
     private function createStreamedResponseCallback(StreamInterface $body): callable
     {
         return function () use ($body) {
diff --git a/vendor/symfony/routing/Loader/AttributeFileLoader.php b/vendor/symfony/routing/Loader/AttributeFileLoader.php
index 34d8b52deac1d288f739a880ba2d073e14f86854..e9a13e597256fc91b2a7ff5d74ed73156b14ff5b 100644
--- a/vendor/symfony/routing/Loader/AttributeFileLoader.php
+++ b/vendor/symfony/routing/Loader/AttributeFileLoader.php
@@ -82,7 +82,7 @@ protected function findClass(string $file): string|false
         $tokens = token_get_all(file_get_contents($file));
 
         if (1 === \count($tokens) && \T_INLINE_HTML === $tokens[0][0]) {
-            throw new \InvalidArgumentException(sprintf('The file "%s" does not contain PHP code. Did you forgot to add the "<?php" start tag at the beginning of the file?', $file));
+            throw new \InvalidArgumentException(sprintf('The file "%s" does not contain PHP code. Did you forget to add the "<?php" start tag at the beginning of the file?', $file));
         }
 
         $nsTokens = [\T_NS_SEPARATOR => true, \T_STRING => true];
diff --git a/vendor/symfony/serializer/DataCollector/SerializerDataCollector.php b/vendor/symfony/serializer/DataCollector/SerializerDataCollector.php
index 671239d28c7fb0cf1115b103d1c65b8629430e58..2880dea37d8f24639d8414014c68745fd97a8633 100644
--- a/vendor/symfony/serializer/DataCollector/SerializerDataCollector.php
+++ b/vendor/symfony/serializer/DataCollector/SerializerDataCollector.php
@@ -21,7 +21,7 @@
 /**
  * @author Mathias Arlaud <mathias.arlaud@gmail.com>
  *
- * @internal
+ * @final
  */
 class SerializerDataCollector extends DataCollector implements LateDataCollectorInterface
 {
diff --git a/vendor/symfony/serializer/Debug/TraceableEncoder.php b/vendor/symfony/serializer/Debug/TraceableEncoder.php
index 0795d14ca0cfa4e04c8ad506f61a420d5ef0cf15..afefee0ee6fb6108f5c42437cf966115f5f1b7c8 100644
--- a/vendor/symfony/serializer/Debug/TraceableEncoder.php
+++ b/vendor/symfony/serializer/Debug/TraceableEncoder.php
@@ -23,7 +23,7 @@
  *
  * @author Mathias Arlaud <mathias.arlaud@gmail.com>
  *
- * @internal
+ * @final
  */
 class TraceableEncoder implements EncoderInterface, DecoderInterface, SerializerAwareInterface
 {
diff --git a/vendor/symfony/serializer/Debug/TraceableNormalizer.php b/vendor/symfony/serializer/Debug/TraceableNormalizer.php
index fc4db40ad198867011a00e9e77f14f6271e2289d..88ab4863d2eacec843aea713ce62ef5eefc84897 100644
--- a/vendor/symfony/serializer/Debug/TraceableNormalizer.php
+++ b/vendor/symfony/serializer/Debug/TraceableNormalizer.php
@@ -25,7 +25,7 @@
  *
  * @author Mathias Arlaud <mathias.arlaud@gmail.com>
  *
- * @internal
+ * @final
  */
 class TraceableNormalizer implements NormalizerInterface, DenormalizerInterface, SerializerAwareInterface, NormalizerAwareInterface, DenormalizerAwareInterface, CacheableSupportsMethodInterface
 {
diff --git a/vendor/symfony/serializer/Debug/TraceableSerializer.php b/vendor/symfony/serializer/Debug/TraceableSerializer.php
index 789ae65ca0aa8be88678332c08773b5aaf5bf2c1..dd22e8678e78244dd26447b12511b277d37f98a9 100644
--- a/vendor/symfony/serializer/Debug/TraceableSerializer.php
+++ b/vendor/symfony/serializer/Debug/TraceableSerializer.php
@@ -24,7 +24,7 @@
  *
  * @author Mathias Arlaud <mathias.arlaud@gmail.com>
  *
- * @internal
+ * @final
  */
 class TraceableSerializer implements SerializerInterface, NormalizerInterface, DenormalizerInterface, EncoderInterface, DecoderInterface
 {
diff --git a/vendor/symfony/string/Inflector/EnglishInflector.php b/vendor/symfony/string/Inflector/EnglishInflector.php
index 77ebc134a436f71a376db7a2cfeb319723776cf1..c41badeadead6c5576b08193bd39991eba458ad6 100644
--- a/vendor/symfony/string/Inflector/EnglishInflector.php
+++ b/vendor/symfony/string/Inflector/EnglishInflector.php
@@ -37,6 +37,9 @@ final class EnglishInflector implements InflectorInterface
         // curricula (curriculum)
         ['alucirruc', 9, true, true, 'curriculum'],
 
+        // quora (quorum)
+        ['arouq', 5, true, true, 'quorum'],
+
         // genera (genus)
         ['areneg', 6, true, true, 'genus'],
 
@@ -121,6 +124,9 @@ final class EnglishInflector implements InflectorInterface
         // statuses (status)
         ['sesutats', 8, true, true, 'status'],
 
+        // article (articles), ancle (ancles)
+        ['sel', 3, true, true, 'le'],
+
         // analyses (analysis), ellipses (ellipsis), fungi (fungus),
         // neuroses (neurosis), theses (thesis), emphases (emphasis),
         // oases (oasis), crises (crisis), houses (house), bases (base),
@@ -265,6 +271,9 @@ final class EnglishInflector implements InflectorInterface
         // albums (album)
         ['mubla', 5, true, true, 'albums'],
 
+        // quorums (quorum)
+        ['murouq', 6, true, true, ['quora', 'quorums']],
+
         // bacteria (bacterium), curricula (curriculum), media (medium), memoranda (memorandum), phenomena (phenomenon), strata (stratum)
         ['mu', 2, true, true, 'a'],
 
diff --git a/vendor/symfony/validator/Constraints/AtLeastOneOfValidator.php b/vendor/symfony/validator/Constraints/AtLeastOneOfValidator.php
index 94ad5eacab9e76138406222636e1347d04029497..5348527c70685bf27cfd27543d380c4ce883b184 100644
--- a/vendor/symfony/validator/Constraints/AtLeastOneOfValidator.php
+++ b/vendor/symfony/validator/Constraints/AtLeastOneOfValidator.php
@@ -42,9 +42,11 @@ public function validate(mixed $value, Constraint $constraint)
                 continue;
             }
 
+            $context = $this->context;
             $executionContext = clone $this->context;
             $executionContext->setNode($value, $this->context->getObject(), $this->context->getMetadata(), $this->context->getPropertyPath());
             $violations = $validator->inContext($executionContext)->validate($value, $item, $this->context->getGroup())->getViolations();
+            $this->context = $context;
 
             if (\count($this->context->getViolations()) === \count($violations)) {
                 return;
diff --git a/vendor/symfony/validator/Constraints/CardSchemeValidator.php b/vendor/symfony/validator/Constraints/CardSchemeValidator.php
index 3e510501587365008253a73c5baeeed16972815e..22de0d8db7799d85b30301f6c87ec86a74f6ea44 100644
--- a/vendor/symfony/validator/Constraints/CardSchemeValidator.php
+++ b/vendor/symfony/validator/Constraints/CardSchemeValidator.php
@@ -29,65 +29,65 @@ class CardSchemeValidator extends ConstraintValidator
     protected $schemes = [
         // American Express card numbers start with 34 or 37 and have 15 digits.
         CardScheme::AMEX => [
-            '/^3[47][0-9]{13}$/',
+            '/^3[47][0-9]{13}$/D',
         ],
         // China UnionPay cards start with 62 and have between 16 and 19 digits.
         // Please note that these cards do not follow Luhn Algorithm as a checksum.
         CardScheme::CHINA_UNIONPAY => [
-            '/^62[0-9]{14,17}$/',
+            '/^62[0-9]{14,17}$/D',
         ],
         // Diners Club card numbers begin with 300 through 305, 36 or 38. All have 14 digits.
         // There are Diners Club cards that begin with 5 and have 16 digits.
         // These are a joint venture between Diners Club and MasterCard, and should be processed like a MasterCard.
         CardScheme::DINERS => [
-            '/^3(?:0[0-5]|[68][0-9])[0-9]{11}$/',
+            '/^3(?:0[0-5]|[68][0-9])[0-9]{11}$/D',
         ],
         // Discover card numbers begin with 6011, 622126 through 622925, 644 through 649 or 65.
         // All have 16 digits.
         CardScheme::DISCOVER => [
-            '/^6011[0-9]{12}$/',
-            '/^64[4-9][0-9]{13}$/',
-            '/^65[0-9]{14}$/',
-            '/^622(12[6-9]|1[3-9][0-9]|[2-8][0-9][0-9]|91[0-9]|92[0-5])[0-9]{10}$/',
+            '/^6011[0-9]{12}$/D',
+            '/^64[4-9][0-9]{13}$/D',
+            '/^65[0-9]{14}$/D',
+            '/^622(12[6-9]|1[3-9][0-9]|[2-8][0-9][0-9]|91[0-9]|92[0-5])[0-9]{10}$/D',
         ],
         // InstaPayment cards begin with 637 through 639 and have 16 digits.
         CardScheme::INSTAPAYMENT => [
-            '/^63[7-9][0-9]{13}$/',
+            '/^63[7-9][0-9]{13}$/D',
         ],
         // JCB cards beginning with 2131 or 1800 have 15 digits.
         // JCB cards beginning with 35 have 16 digits.
         CardScheme::JCB => [
-            '/^(?:2131|1800|35[0-9]{3})[0-9]{11}$/',
+            '/^(?:2131|1800|35[0-9]{3})[0-9]{11}$/D',
         ],
         // Laser cards begin with either 6304, 6706, 6709 or 6771 and have between 16 and 19 digits.
         CardScheme::LASER => [
-            '/^(6304|670[69]|6771)[0-9]{12,15}$/',
+            '/^(6304|670[69]|6771)[0-9]{12,15}$/D',
         ],
         // Maestro international cards begin with 675900..675999 and have between 12 and 19 digits.
         // Maestro UK cards begin with either 500000..509999 or 560000..699999 and have between 12 and 19 digits.
         CardScheme::MAESTRO => [
-            '/^(6759[0-9]{2})[0-9]{6,13}$/',
-            '/^(50[0-9]{4})[0-9]{6,13}$/',
-            '/^5[6-9][0-9]{10,17}$/',
-            '/^6[0-9]{11,18}$/',
+            '/^(6759[0-9]{2})[0-9]{6,13}$/D',
+            '/^(50[0-9]{4})[0-9]{6,13}$/D',
+            '/^5[6-9][0-9]{10,17}$/D',
+            '/^6[0-9]{11,18}$/D',
         ],
         // All MasterCard numbers start with the numbers 51 through 55. All have 16 digits.
         // October 2016 MasterCard numbers can also start with 222100 through 272099.
         CardScheme::MASTERCARD => [
-            '/^5[1-5][0-9]{14}$/',
-            '/^2(22[1-9][0-9]{12}|2[3-9][0-9]{13}|[3-6][0-9]{14}|7[0-1][0-9]{13}|720[0-9]{12})$/',
+            '/^5[1-5][0-9]{14}$/D',
+            '/^2(22[1-9][0-9]{12}|2[3-9][0-9]{13}|[3-6][0-9]{14}|7[0-1][0-9]{13}|720[0-9]{12})$/D',
         ],
         // Payment system MIR numbers start with 220, then 1 digit from 0 to 4, then between 12 and 15 digits
         CardScheme::MIR => [
-            '/^220[0-4][0-9]{12,15}$/',
+            '/^220[0-4][0-9]{12,15}$/D',
         ],
         // All UATP card numbers start with a 1 and have a length of 15 digits.
         CardScheme::UATP => [
-            '/^1[0-9]{14}$/',
+            '/^1[0-9]{14}$/D',
         ],
         // All Visa card numbers start with a 4 and have a length of 13, 16, or 19 digits.
         CardScheme::VISA => [
-            '/^4([0-9]{12}|[0-9]{15}|[0-9]{18})$/',
+            '/^4([0-9]{12}|[0-9]{15}|[0-9]{18})$/D',
         ],
     ];
 
diff --git a/vendor/symfony/validator/Constraints/CssColorValidator.php b/vendor/symfony/validator/Constraints/CssColorValidator.php
index 9e8b1b55c194ce2e5d7fe5aa812110a668777eb5..78563a92c31bb9f0da22bc40b42c9563dd917864 100644
--- a/vendor/symfony/validator/Constraints/CssColorValidator.php
+++ b/vendor/symfony/validator/Constraints/CssColorValidator.php
@@ -21,21 +21,21 @@
  */
 class CssColorValidator extends ConstraintValidator
 {
-    private const PATTERN_HEX_LONG = '/^#[0-9a-f]{6}$/i';
-    private const PATTERN_HEX_LONG_WITH_ALPHA = '/^#[0-9a-f]{8}$/i';
-    private const PATTERN_HEX_SHORT = '/^#[0-9a-f]{3}$/i';
-    private const PATTERN_HEX_SHORT_WITH_ALPHA = '/^#[0-9a-f]{4}$/i';
+    private const PATTERN_HEX_LONG = '/^#[0-9a-f]{6}$/iD';
+    private const PATTERN_HEX_LONG_WITH_ALPHA = '/^#[0-9a-f]{8}$/iD';
+    private const PATTERN_HEX_SHORT = '/^#[0-9a-f]{3}$/iD';
+    private const PATTERN_HEX_SHORT_WITH_ALPHA = '/^#[0-9a-f]{4}$/iD';
     // List comes from https://www.w3.org/wiki/CSS/Properties/color/keywords#Basic_Colors
-    private const PATTERN_BASIC_NAMED_COLORS = '/^(black|silver|gray|white|maroon|red|purple|fuchsia|green|lime|olive|yellow|navy|blue|teal|aqua)$/i';
+    private const PATTERN_BASIC_NAMED_COLORS = '/^(black|silver|gray|white|maroon|red|purple|fuchsia|green|lime|olive|yellow|navy|blue|teal|aqua)$/iD';
     // List comes from https://www.w3.org/wiki/CSS/Properties/color/keywords#Extended_colors
-    private const PATTERN_EXTENDED_NAMED_COLORS = '/^(aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen)$/i';
+    private const PATTERN_EXTENDED_NAMED_COLORS = '/^(aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen)$/iD';
     // List comes from https://drafts.csswg.org/css-color/#css-system-colors
-    private const PATTERN_SYSTEM_COLORS = '/^(Canvas|CanvasText|LinkText|VisitedText|ActiveText|ButtonFace|ButtonText|ButtonBorder|Field|FieldText|Highlight|HighlightText|SelectedItem|SelectedItemText|Mark|MarkText|GrayText)$/i';
-    private const PATTERN_KEYWORDS = '/^(transparent|currentColor)$/i';
-    private const PATTERN_RGB = '/^rgb\(\s*(0|255|25[0-4]|2[0-4]\d|1\d\d|0?\d?\d),\s*(0|255|25[0-4]|2[0-4]\d|1\d\d|0?\d?\d),\s*(0|255|25[0-4]|2[0-4]\d|1\d\d|0?\d?\d)\s*\)$/i';
-    private const PATTERN_RGBA = '/^rgba\(\s*(0|255|25[0-4]|2[0-4]\d|1\d\d|0?\d?\d),\s*(0|255|25[0-4]|2[0-4]\d|1\d\d|0?\d?\d),\s*(0|255|25[0-4]|2[0-4]\d|1\d\d|0?\d?\d),\s*(0|0?\.\d+|1(\.0)?)\s*\)$/i';
-    private const PATTERN_HSL = '/^hsl\(\s*(0|360|35\d|3[0-4]\d|[12]\d\d|0?\d?\d),\s*(0|100|\d{1,2})%,\s*(0|100|\d{1,2})%\s*\)$/i';
-    private const PATTERN_HSLA = '/^hsla\(\s*(0|360|35\d|3[0-4]\d|[12]\d\d|0?\d?\d),\s*(0|100|\d{1,2})%,\s*(0|100|\d{1,2})%,\s*(0|0?\.\d+|1(\.0)?)\s*\)$/i';
+    private const PATTERN_SYSTEM_COLORS = '/^(Canvas|CanvasText|LinkText|VisitedText|ActiveText|ButtonFace|ButtonText|ButtonBorder|Field|FieldText|Highlight|HighlightText|SelectedItem|SelectedItemText|Mark|MarkText|GrayText)$/iD';
+    private const PATTERN_KEYWORDS = '/^(transparent|currentColor)$/iD';
+    private const PATTERN_RGB = '/^rgb\(\s*(0|255|25[0-4]|2[0-4]\d|1\d\d|0?\d?\d),\s*(0|255|25[0-4]|2[0-4]\d|1\d\d|0?\d?\d),\s*(0|255|25[0-4]|2[0-4]\d|1\d\d|0?\d?\d)\s*\)$/iD';
+    private const PATTERN_RGBA = '/^rgba\(\s*(0|255|25[0-4]|2[0-4]\d|1\d\d|0?\d?\d),\s*(0|255|25[0-4]|2[0-4]\d|1\d\d|0?\d?\d),\s*(0|255|25[0-4]|2[0-4]\d|1\d\d|0?\d?\d),\s*(0|0?\.\d+|1(\.0)?)\s*\)$/iD';
+    private const PATTERN_HSL = '/^hsl\(\s*(0|360|35\d|3[0-4]\d|[12]\d\d|0?\d?\d),\s*(0|100|\d{1,2})%,\s*(0|100|\d{1,2})%\s*\)$/iD';
+    private const PATTERN_HSLA = '/^hsla\(\s*(0|360|35\d|3[0-4]\d|[12]\d\d|0?\d?\d),\s*(0|100|\d{1,2})%,\s*(0|100|\d{1,2})%,\s*(0|0?\.\d+|1(\.0)?)\s*\)$/iD';
 
     private const COLOR_PATTERNS = [
         CssColor::HEX_LONG => self::PATTERN_HEX_LONG,
diff --git a/vendor/symfony/validator/Constraints/DateValidator.php b/vendor/symfony/validator/Constraints/DateValidator.php
index 0e3d8484303d04a57ab51a9c6a78c7214816d60a..65dc9648ac40fa279e492dee977acadeff910410 100644
--- a/vendor/symfony/validator/Constraints/DateValidator.php
+++ b/vendor/symfony/validator/Constraints/DateValidator.php
@@ -21,7 +21,7 @@
  */
 class DateValidator extends ConstraintValidator
 {
-    public const PATTERN = '/^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})$/';
+    public const PATTERN = '/^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})$/D';
 
     /**
      * Checks whether a date is valid.
diff --git a/vendor/symfony/validator/Constraints/EmailValidator.php b/vendor/symfony/validator/Constraints/EmailValidator.php
index 8c0ff7730855b39429914eb3a6a4cd21b273684b..a6ee53f7a7cac94d6848c7ed948c815c646bc1c1 100644
--- a/vendor/symfony/validator/Constraints/EmailValidator.php
+++ b/vendor/symfony/validator/Constraints/EmailValidator.php
@@ -26,9 +26,9 @@
  */
 class EmailValidator extends ConstraintValidator
 {
-    private const PATTERN_HTML5_ALLOW_NO_TLD = '/^[a-zA-Z0-9.!#$%&\'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/';
-    private const PATTERN_HTML5 = '/^[a-zA-Z0-9.!#$%&\'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/';
-    private const PATTERN_LOOSE = '/^.+\@\S+\.\S+$/';
+    private const PATTERN_HTML5_ALLOW_NO_TLD = '/^[a-zA-Z0-9.!#$%&\'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/D';
+    private const PATTERN_HTML5 = '/^[a-zA-Z0-9.!#$%&\'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/D';
+    private const PATTERN_LOOSE = '/^.+\@\S+\.\S+$/D';
 
     private const EMAIL_PATTERNS = [
         Email::VALIDATION_MODE_LOOSE => self::PATTERN_LOOSE,
diff --git a/vendor/symfony/validator/Constraints/IbanValidator.php b/vendor/symfony/validator/Constraints/IbanValidator.php
index 890ca5f14313104dec5d0b5f3ac4dc8f42b47695..11619efd8ec7af79e8ac197b81f76467705085c2 100644
--- a/vendor/symfony/validator/Constraints/IbanValidator.php
+++ b/vendor/symfony/validator/Constraints/IbanValidator.php
@@ -73,6 +73,7 @@ class IbanValidator extends ConstraintValidator
         'EG' => 'EG\d{2}\d{4}\d{4}\d{17}', // Egypt
         'ES' => 'ES\d{2}\d{4}\d{4}\d{1}\d{1}\d{10}', // Spain
         'FI' => 'FI\d{2}\d{3}\d{11}', // Finland
+        'FK' => 'FK\d{2}[A-Z]{2}\d{12}', // Falkland Islands
         'FO' => 'FO\d{2}\d{4}\d{9}\d{1}', // Faroe Islands
         'FR' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2}', // France
         'GA' => 'GA\d{2}\d{23}', // Gabon
@@ -117,6 +118,7 @@ class IbanValidator extends ConstraintValidator
         'MG' => 'MG\d{2}\d{23}', // Madagascar
         'MK' => 'MK\d{2}\d{3}[\dA-Z]{10}\d{2}', // Macedonia
         'ML' => 'ML\d{2}[\dA-Z]{2}\d{22}', // Mali
+        'MN' => 'MN\d{2}\d{4}\d{12}', // Mongolia
         'MQ' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2}', // France
         'MR' => 'MR\d{2}\d{5}\d{5}\d{11}\d{2}', // Mauritania
         'MT' => 'MT\d{2}[A-Z]{4}\d{5}[\dA-Z]{18}', // Malta
@@ -127,6 +129,7 @@ class IbanValidator extends ConstraintValidator
         'NI' => 'NI\d{2}[A-Z]{4}\d{24}', // Nicaragua
         'NL' => 'NL\d{2}[A-Z]{4}\d{10}', // Netherlands (The)
         'NO' => 'NO\d{2}\d{4}\d{6}\d{1}', // Norway
+        'OM' => 'OM\d{2}\d{3}[\dA-Z]{16}', // Oman
         'PF' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2}', // France
         'PK' => 'PK\d{2}[A-Z]{4}[\dA-Z]{16}', // Pakistan
         'PL' => 'PL\d{2}\d{8}\d{16}', // Poland
@@ -160,6 +163,7 @@ class IbanValidator extends ConstraintValidator
         'VG' => 'VG\d{2}[A-Z]{4}\d{16}', // Virgin Islands
         'WF' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2}', // France
         'XK' => 'XK\d{2}\d{4}\d{10}\d{2}', // Kosovo
+        'YE' => 'YE\d{2}[A-Z]{4}\d{4}[\dA-Z]{18}', // Yemen
         'YT' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2}', // France
     ];
 
diff --git a/vendor/symfony/validator/Constraints/TimeValidator.php b/vendor/symfony/validator/Constraints/TimeValidator.php
index 473c9e8e01ef2ab538a00b9b4febd193f38697a4..ef422cdf5a2854b2ddde7bd7c5c22147fe9adb90 100644
--- a/vendor/symfony/validator/Constraints/TimeValidator.php
+++ b/vendor/symfony/validator/Constraints/TimeValidator.php
@@ -21,8 +21,8 @@
  */
 class TimeValidator extends ConstraintValidator
 {
-    public const PATTERN = '/^(\d{2}):(\d{2}):(\d{2})$/';
-    public const PATTERN_WITHOUT_SECONDS = '/^(\d{2}):(\d{2})$/';
+    public const PATTERN = '/^(\d{2}):(\d{2}):(\d{2})$/D';
+    public const PATTERN_WITHOUT_SECONDS = '/^(\d{2}):(\d{2})$/D';
 
     /**
      * Checks whether a time is valid.
diff --git a/vendor/symfony/validator/Constraints/UrlValidator.php b/vendor/symfony/validator/Constraints/UrlValidator.php
index 4a73040a24e234be047898c57c5eac1eff99f4e1..09173835d6926b7379b028fcad13628b1122f190 100644
--- a/vendor/symfony/validator/Constraints/UrlValidator.php
+++ b/vendor/symfony/validator/Constraints/UrlValidator.php
@@ -40,10 +40,10 @@ class UrlValidator extends ConstraintValidator
                 \]  # an IPv6 address
             )
             (:[0-9]+)?                              # a port (optional)
-            (?:/ (?:[\pL\pN\-._\~!$&\'()*+,;=:@]|%%[0-9A-Fa-f]{2})* )*          # a path
+            (?:/ (?:[\pL\pN\pS\pM\-._\~!$&\'()*+,;=:@]|%%[0-9A-Fa-f]{2})* )*    # a path
             (?:\? (?:[\pL\pN\-._\~!$&\'\[\]()*+,;=:@/?]|%%[0-9A-Fa-f]{2})* )?   # a query (optional)
             (?:\# (?:[\pL\pN\-._\~!$&\'()*+,;=:@/?]|%%[0-9A-Fa-f]{2})* )?       # a fragment (optional)
-        $~ixu';
+        $~ixuD';
 
     /**
      * @return void
diff --git a/vendor/symfony/validator/Resources/translations/validators.af.xlf b/vendor/symfony/validator/Resources/translations/validators.af.xlf
index e09d3fc06aa707e143b0a8321016e83b4b58a4e6..706f0ca49716bb03a32cf99bd7d4e0be5aebdbee 100644
--- a/vendor/symfony/validator/Resources/translations/validators.af.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.af.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.ar.xlf b/vendor/symfony/validator/Resources/translations/validators.ar.xlf
index 94a91d42a71bb74f59275f722469f78749d44d53..6c684d98df31b5186d7c279deece3a37754d75b9 100644
--- a/vendor/symfony/validator/Resources/translations/validators.ar.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.ar.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.az.xlf b/vendor/symfony/validator/Resources/translations/validators.az.xlf
index 390e5f869c3239ffb130288351daa6052f051571..0b149024ca2dd96a3d8cbff3b406e9819eb9d8e8 100644
--- a/vendor/symfony/validator/Resources/translations/validators.az.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.az.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.be.xlf b/vendor/symfony/validator/Resources/translations/validators.be.xlf
index 3ebae4cb6bb2f86af517bb492678cde194f08d89..3db0ddc20f3d557879a7575a087e8ff397f08946 100644
--- a/vendor/symfony/validator/Resources/translations/validators.be.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.be.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.bg.xlf b/vendor/symfony/validator/Resources/translations/validators.bg.xlf
index dffefdb7d9056f3d365b504717880158dacb3892..e0792e209561f816e7e423b8a61f0a5c05adf2a2 100644
--- a/vendor/symfony/validator/Resources/translations/validators.bg.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.bg.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.bs.xlf b/vendor/symfony/validator/Resources/translations/validators.bs.xlf
index f5e90aba54a7ac56288d5281adff64243506e553..150025d03a6acc045a08318378886f91ad66a6d4 100644
--- a/vendor/symfony/validator/Resources/translations/validators.bs.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.bs.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.ca.xlf b/vendor/symfony/validator/Resources/translations/validators.ca.xlf
index 60f747f62f7152b4600307cf0e5676fe5e8df64c..fb3c41dbc747b6c64f7d4bdb2de8026213bda063 100644
--- a/vendor/symfony/validator/Resources/translations/validators.ca.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.ca.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target>Aquest valor és massa llarg. Ha de contenir una paraula.|Aquest valor és massa llarg. Ha de contenir {{ max }} paraules o menys.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.cs.xlf b/vendor/symfony/validator/Resources/translations/validators.cs.xlf
index 459d07fd727ccce60f5aaf0c72579fad9bcce26b..e99d3236eff40fe0ab2ef0616a6c4195f3e6dacc 100644
--- a/vendor/symfony/validator/Resources/translations/validators.cs.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.cs.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.cy.xlf b/vendor/symfony/validator/Resources/translations/validators.cy.xlf
index 7f3357daf539816c77f997288b43665c31c28ff7..667f4a6d453d08419cd5a117897ec96647c60809 100644
--- a/vendor/symfony/validator/Resources/translations/validators.cy.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.cy.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.da.xlf b/vendor/symfony/validator/Resources/translations/validators.da.xlf
index d80251b2a74835b793ba805557fcd22818bcf524..5d08a01df77b19ce5931468d193259cf09bd6017 100644
--- a/vendor/symfony/validator/Resources/translations/validators.da.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.da.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.de.xlf b/vendor/symfony/validator/Resources/translations/validators.de.xlf
index 6a9919ddd36adeab34d8c0587fe676ff13f64875..301ee496e68e6942287da85f45e08248cf7d7226 100644
--- a/vendor/symfony/validator/Resources/translations/validators.de.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.de.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target>Dieser Wert ist zu lang. Er darf maximal aus einem Wort bestehen.|Dieser Wert ist zu lang. Er darf maximal {{ max }} Wörter enthalten.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target>Dieser Wert ist keine Wochenangabe im ISO 8601-Format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target>Dieser Wert ist keine gültige Woche.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target>Dieser Wert darf nicht vor der Woche "{{ min }}" sein.</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target>Dieser Wert darf nicht nach der Woche "{{ max }}" sein.</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.el.xlf b/vendor/symfony/validator/Resources/translations/validators.el.xlf
index bb0ccb46e92ec758adb42fd78f82621f79ecf1ae..e58dd3d77e7fe6a089a3237b3bb4eee7031fa735 100644
--- a/vendor/symfony/validator/Resources/translations/validators.el.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.el.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.en.xlf b/vendor/symfony/validator/Resources/translations/validators.en.xlf
index cf08ea281938f8ef208dc42541bd44df174bafbd..faf549e48351232ee0091f5574b6352d0de3d839 100644
--- a/vendor/symfony/validator/Resources/translations/validators.en.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.en.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target>This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target>This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target>This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target>This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.es.xlf b/vendor/symfony/validator/Resources/translations/validators.es.xlf
index f9b3277229c8ae3b3801cd7e17fbd836bb5f76ac..fa26c72100068f64069d34d5ab1748c76584d387 100644
--- a/vendor/symfony/validator/Resources/translations/validators.es.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.es.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target>Este valor es demasiado largo. Debe contener una palabra.|Este valor es demasiado largo. Debe contener {{ max }} palabras o menos.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.et.xlf b/vendor/symfony/validator/Resources/translations/validators.et.xlf
index 988bb0aa0720362fb0f808911928f47aab61fcd5..774445dd02c62d1af327249b1f2aeb1b39c8365d 100644
--- a/vendor/symfony/validator/Resources/translations/validators.et.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.et.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.eu.xlf b/vendor/symfony/validator/Resources/translations/validators.eu.xlf
index 362dfa9c0cd349091a188fd628d2f97bb9afe5d0..3e1a544c89053edcc2ff1d4869d8edf3b4d8bb3f 100644
--- a/vendor/symfony/validator/Resources/translations/validators.eu.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.eu.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.fa.xlf b/vendor/symfony/validator/Resources/translations/validators.fa.xlf
index fb8b629b4d1a3e5e12820ddc2b3111140576c170..98486482b239a8143bd1d22fef78103f7dd7fedc 100644
--- a/vendor/symfony/validator/Resources/translations/validators.fa.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.fa.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.fi.xlf b/vendor/symfony/validator/Resources/translations/validators.fi.xlf
index 6b8902f014dc22f859aaa4a2069f367ba472205d..2dac5b5b8af245b7ca13b8e249d784b0fcf47a84 100644
--- a/vendor/symfony/validator/Resources/translations/validators.fi.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.fi.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.fr.xlf b/vendor/symfony/validator/Resources/translations/validators.fr.xlf
index f06189712e3a073c1a977c8746b4be85014b6d32..2fb4eeac1872524ffd6383007e5e0a6b268c22ac 100644
--- a/vendor/symfony/validator/Resources/translations/validators.fr.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.fr.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target>Cette valeur est trop longue. Elle doit contenir au maximum un mot.|Cette valeur est trop longue. Elle doit contenir au maximum {{ max }} mots.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target>Cette valeur ne représente pas une semaine valide au format ISO 8601.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target>Cette valeur n'est pas une semaine valide.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target>Cette valeur ne doit pas être antérieure à la semaine "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target>Cette valeur ne doit pas être postérieure à la semaine "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.gl.xlf b/vendor/symfony/validator/Resources/translations/validators.gl.xlf
index 7885473fb2e84c6f5b9ef70781828e94ab45d276..1a48093dca758e4cc25f9c68948274b0ced04fc9 100644
--- a/vendor/symfony/validator/Resources/translations/validators.gl.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.gl.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.he.xlf b/vendor/symfony/validator/Resources/translations/validators.he.xlf
index 6e5ab5229777734029bc252b2431d7b87b57a1ce..73ccca53f2acd35df5cb56514fdacc84c272d962 100644
--- a/vendor/symfony/validator/Resources/translations/validators.he.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.he.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.hr.xlf b/vendor/symfony/validator/Resources/translations/validators.hr.xlf
index 0ddbeb6f20c81cad245d25273b0bfb4818a0aec7..147f4313c8a5e5b6beef7dcb422f7b7c2ca95e29 100644
--- a/vendor/symfony/validator/Resources/translations/validators.hr.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.hr.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.hu.xlf b/vendor/symfony/validator/Resources/translations/validators.hu.xlf
index 0c8002ae1ecc4f57770dcff2b111f8c675ce8893..185ebf02b57ee2d79e677c429d70a7bc12a15930 100644
--- a/vendor/symfony/validator/Resources/translations/validators.hu.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.hu.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.hy.xlf b/vendor/symfony/validator/Resources/translations/validators.hy.xlf
index 29f916fff06d1ff7b6d31666760826a84f2e702a..24423b0822e684ad475c7134a1ec08ecbecc7cf3 100644
--- a/vendor/symfony/validator/Resources/translations/validators.hy.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.hy.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.id.xlf b/vendor/symfony/validator/Resources/translations/validators.id.xlf
index 2814599a0fc642e8b9b0fe24bea571319997d2ee..3bffae84d63c7697f43c1665914d8684dc1dcb0f 100644
--- a/vendor/symfony/validator/Resources/translations/validators.id.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.id.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.it.xlf b/vendor/symfony/validator/Resources/translations/validators.it.xlf
index 1f409315e6dbf61b326221fd90659a4abbe85a23..1e77aba17aa792763d7b8c6871ee871c6aa599bf 100644
--- a/vendor/symfony/validator/Resources/translations/validators.it.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.it.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.ja.xlf b/vendor/symfony/validator/Resources/translations/validators.ja.xlf
index d94a414e3199835c75fee404e8fd7a2d92ebc83f..26cb6e5933f040c9e66c8cd5bff5e017be780085 100644
--- a/vendor/symfony/validator/Resources/translations/validators.ja.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.ja.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.lb.xlf b/vendor/symfony/validator/Resources/translations/validators.lb.xlf
index 3c0a6f200e4f82630fea8ecaf5624b3dc19cd1af..8b0b6a244dcff918dc9c5a108a1f6eed0f997eaa 100644
--- a/vendor/symfony/validator/Resources/translations/validators.lb.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.lb.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.lt.xlf b/vendor/symfony/validator/Resources/translations/validators.lt.xlf
index dc28eeba77223ba10cbe36e8fda2e7f56a88d2a7..e30f8a6ae3e40aec7091cb24ac8299fa42ce31ea 100644
--- a/vendor/symfony/validator/Resources/translations/validators.lt.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.lt.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target>Per didelis žodžių skaičius. Turi susidaryti iš 1 žodžio.|Per didelis žodžių skaičius. Turi susidaryti iš {{ max }} arba mažiau žodžių.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.lv.xlf b/vendor/symfony/validator/Resources/translations/validators.lv.xlf
index 9b2b9bd9f44859f2ed33aa0bbcdf89a662fd98e2..fef1c3662df5f856096f00985e8a874ba4ffb1cf 100644
--- a/vendor/symfony/validator/Resources/translations/validators.lv.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.lv.xlf
@@ -48,7 +48,7 @@
             </trans-unit>
             <trans-unit id="12">
                 <source>This value is not a valid datetime.</source>
-                <target>Šī vērtība ir nederīgs datums un laiks</target>
+                <target>Šī vērtība ir nederīgs datums un laiks.</target>
             </trans-unit>
             <trans-unit id="13">
                 <source>This value is not a valid email address.</source>
@@ -444,11 +444,27 @@
             </trans-unit>
             <trans-unit id="114">
                 <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
-                <target state="needs-translation">This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</target>
+                <target>Šī vērtība ir pārāk īsa. Tai būtu jābūt vismaz vienu vārdu garai.|Šī vērtība ir pārāk īsa. Tai būtu jābūt ne mazāk kā {{ min }} vārdus garai.</target>
             </trans-unit>
             <trans-unit id="115">
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
-                <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
+                <target>Šī vērtība ir pārāk gara. Tai būtu jābūt vienam vārdam.|Šī vērtība ir pārāk gara. Tai būtu jābūt ne vairāk kā {{ max }} vārdus garai.</target>
+            </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
             </trans-unit>
         </body>
     </file>
diff --git a/vendor/symfony/validator/Resources/translations/validators.mk.xlf b/vendor/symfony/validator/Resources/translations/validators.mk.xlf
index b891990799cd35640a9cfd4ba328d3b4a326e26a..722c9a789384427369b18345bcc60f16b8968663 100644
--- a/vendor/symfony/validator/Resources/translations/validators.mk.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.mk.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.mn.xlf b/vendor/symfony/validator/Resources/translations/validators.mn.xlf
index 987d73199ac09088ad7892ac371e2161c33c4024..0c9f8c84d0d3c001c2efd8c8c7712439decc9788 100644
--- a/vendor/symfony/validator/Resources/translations/validators.mn.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.mn.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.my.xlf b/vendor/symfony/validator/Resources/translations/validators.my.xlf
index b7353e83a4c7d3565c43ea662577088996ae2239..89bb0906ec1878f0bd0bc033e64bf89eca277d9c 100644
--- a/vendor/symfony/validator/Resources/translations/validators.my.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.my.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.nb.xlf b/vendor/symfony/validator/Resources/translations/validators.nb.xlf
index 2abe0fb7f080525e1277ec8d8f59e52116fab8d1..d0a0e6509df150e5045796671cdadb4c70aa6e05 100644
--- a/vendor/symfony/validator/Resources/translations/validators.nb.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.nb.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.nl.xlf b/vendor/symfony/validator/Resources/translations/validators.nl.xlf
index 96e1d20d93d0fb0ebb433a86fafa27d850e04f6e..fdea10f0e4a80734145df7e9ff6f5eeaee2ee1a8 100644
--- a/vendor/symfony/validator/Resources/translations/validators.nl.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.nl.xlf
@@ -444,11 +444,27 @@
             </trans-unit>
             <trans-unit id="114">
                 <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
-                <target state="needs-translation">This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</target>
+                <target>Deze waarde is te kort. Het moet ten minste één woord bevatten.|Deze waarde is te kort. Het moet ten minste {{ min }} woorden bevatten.</target>
             </trans-unit>
             <trans-unit id="115">
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
-                <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
+                <target>Deze waarde is te lang. Het moet één woord zijn.|Deze waarde is te lang. Het mag maximaal {{ max }} woorden bevatten.</target>
+            </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
             </trans-unit>
         </body>
     </file>
diff --git a/vendor/symfony/validator/Resources/translations/validators.nn.xlf b/vendor/symfony/validator/Resources/translations/validators.nn.xlf
index e825815ced1b6813c4a1679f6812f49413b8e22f..8ff78c5a0813213fcb974001472021f03b93a3da 100644
--- a/vendor/symfony/validator/Resources/translations/validators.nn.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.nn.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.no.xlf b/vendor/symfony/validator/Resources/translations/validators.no.xlf
index 2abe0fb7f080525e1277ec8d8f59e52116fab8d1..d0a0e6509df150e5045796671cdadb4c70aa6e05 100644
--- a/vendor/symfony/validator/Resources/translations/validators.no.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.no.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.pl.xlf b/vendor/symfony/validator/Resources/translations/validators.pl.xlf
index 337a5949501ce226e0b435447043ca4be91a2a62..541a35d73a83a819633689f65aa7cf2911244e34 100644
--- a/vendor/symfony/validator/Resources/translations/validators.pl.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.pl.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target>Podana wartość jest zbyt długa. Powinna zawierać jedno słowo.|Podana wartość jest zbyt długa. Powinna zawierać {{ max }} słów lub mniej.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target>Podana wartość nie jest poprawnym oznaczeniem tygodnia w formacie ISO 8601.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target>Podana wartość nie jest poprawnym oznaczeniem tygodnia.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target>Podana wartość nie powinna być przed tygodniem "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target>Podana wartość nie powinna być po tygodniu "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.pt.xlf b/vendor/symfony/validator/Resources/translations/validators.pt.xlf
index f771faa84f5def775945887f5e797a3c5aaf9550..bb3208cfa5190710d77206a911d32fe42a5b5229 100644
--- a/vendor/symfony/validator/Resources/translations/validators.pt.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.pt.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.pt_BR.xlf b/vendor/symfony/validator/Resources/translations/validators.pt_BR.xlf
index e600bb17ff7f6fe1407e37843bc472bba9e0aa1b..c427f95d3e670a04f0766a10999a6a3f5ec53aca 100644
--- a/vendor/symfony/validator/Resources/translations/validators.pt_BR.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.pt_BR.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.ro.xlf b/vendor/symfony/validator/Resources/translations/validators.ro.xlf
index 79cf6941acc57949dd603b09cacac5071affb2b7..7413619650d940b775bd478f40f813ee2c96da46 100644
--- a/vendor/symfony/validator/Resources/translations/validators.ro.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.ro.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.ru.xlf b/vendor/symfony/validator/Resources/translations/validators.ru.xlf
index 70cb1144bf899893f314c73978758ede8c5366c1..e8dd0311640ffe2faf6e2c3681b36d246b7982d4 100644
--- a/vendor/symfony/validator/Resources/translations/validators.ru.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.ru.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.sk.xlf b/vendor/symfony/validator/Resources/translations/validators.sk.xlf
index 8785adcc18257f917676810f9eba6a010325d3e4..aeda9c94b6b4c2e4696ee2f2b6ef2cdea38cf2cd 100644
--- a/vendor/symfony/validator/Resources/translations/validators.sk.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.sk.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.sl.xlf b/vendor/symfony/validator/Resources/translations/validators.sl.xlf
index 4926c1b4f815e3564efee6efec9ac4397c8c58d3..1a8cb8d57bbaa096e30c55f4cfd244135651c252 100644
--- a/vendor/symfony/validator/Resources/translations/validators.sl.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.sl.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.sq.xlf b/vendor/symfony/validator/Resources/translations/validators.sq.xlf
index 9942b5cf26bc6f54c443d4795634fde55bd9e726..debbe5feb9eb62d8c178c43ecdb701b0cc0a32d7 100644
--- a/vendor/symfony/validator/Resources/translations/validators.sq.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.sq.xlf
@@ -459,6 +459,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.sr_Cyrl.xlf b/vendor/symfony/validator/Resources/translations/validators.sr_Cyrl.xlf
index 3aa3be49e8d451fc1acdc07590ea95075bf1208e..2e601246e3e0129cee5230b1799505450d591141 100644
--- a/vendor/symfony/validator/Resources/translations/validators.sr_Cyrl.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.sr_Cyrl.xlf
@@ -136,7 +136,7 @@
             </trans-unit>
             <trans-unit id="37" resname="This is not a valid IP address.">
                 <source>This value is not a valid IP address.</source>
-                <target state="needs-review-translation">Ова вредност није валидна IP адреса.</target>
+                <target>Ова вредност није валидна IP адреса.</target>
             </trans-unit>
             <trans-unit id="38">
                 <source>This value is not a valid language.</source>
@@ -192,7 +192,7 @@
             </trans-unit>
             <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                 <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
-                <target state="needs-review-translation">Привремени директоријум није конфигурисан у php.ini, или конфигурисани директоријум не постоји.</target>
+                <target>Привремени директоријум није конфигурисан у php.ini, или конфигурисани директоријум не постоји.</target>
             </trans-unit>
             <trans-unit id="52">
                 <source>Cannot write temporary file to disk.</source>
@@ -224,7 +224,7 @@
             </trans-unit>
             <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                 <source>This value is not a valid International Bank Account Number (IBAN).</source>
-                <target state="needs-review-translation">Ова вредност није валидан Међународни број банкарског рачуна (IBAN).</target>
+                <target>Ова вредност није валидан Међународни број банковног рачуна (IBAN).</target>
             </trans-unit>
             <trans-unit id="60">
                 <source>This value is not a valid ISBN-10.</source>
@@ -312,7 +312,7 @@
             </trans-unit>
             <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                 <source>This value is not a valid Business Identifier Code (BIC).</source>
-                <target state="needs-review-translation">Ова вредност није валидан Код за идентификацију бизниса (BIC).</target>
+                <target>Ова вредност није валидна Код за идентификацију бизниса (BIC).</target>
             </trans-unit>
             <trans-unit id="82">
                 <source>Error</source>
@@ -320,7 +320,7 @@
             </trans-unit>
             <trans-unit id="83" resname="This is not a valid UUID.">
                 <source>This value is not a valid UUID.</source>
-                <target state="needs-review-translation">Ова вредност није валидан UUID.</target>
+                <target>Ова вредност није валидан UUID.</target>
             </trans-unit>
             <trans-unit id="84">
                 <source>This value should be a multiple of {{ compared_value }}.</source>
@@ -440,15 +440,31 @@
             </trans-unit>
             <trans-unit id="113">
                 <source>This URL is missing a top-level domain.</source>
-                <target state="needs-review-translation">Овом URL недостаје домен највишег нивоа.</target>
+                <target>Овом УРЛ-у недостаје домен највишег нивоа.</target>
             </trans-unit>
             <trans-unit id="114">
                 <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
-                <target state="needs-translation">This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</target>
+                <target>Ова вредност је прекратка. Треба да садржи макар једну реч.|Ова вредност је прекратка. Треба да садржи макар {{ min }} речи.</target>
             </trans-unit>
             <trans-unit id="115">
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
-                <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
+                <target>Ова вредност је предугачка. Треба да садржи само једну реч.|Ова вредност је предугачка. Треба да садржи највише {{ max }} речи.</target>
+            </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target>Ова вредност не представља валидну недељу у ISO 8601 формату.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target>Ова вредност није валидна недеља.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target>Ова вредност не би требала да буде пре недеље "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target>Ова вредност не би требала да буде после недеље "{{ max }}".</target>
             </trans-unit>
         </body>
     </file>
diff --git a/vendor/symfony/validator/Resources/translations/validators.sr_Latn.xlf b/vendor/symfony/validator/Resources/translations/validators.sr_Latn.xlf
index ac7d7186dfee712e0b34f7243762e72fe510ccd1..8e27e114c85fa116a83fc33aa9c23cf64510e03e 100644
--- a/vendor/symfony/validator/Resources/translations/validators.sr_Latn.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.sr_Latn.xlf
@@ -136,7 +136,7 @@
             </trans-unit>
             <trans-unit id="37" resname="This is not a valid IP address.">
                 <source>This value is not a valid IP address.</source>
-                <target state="needs-review-translation">Ova vrednost nije validna IP adresa.</target>
+                <target>Ova vrednost nije validna IP adresa.</target>
             </trans-unit>
             <trans-unit id="38">
                 <source>This value is not a valid language.</source>
@@ -192,7 +192,7 @@
             </trans-unit>
             <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                 <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
-                <target state="needs-review-translation">Privremeni direktorijum nije konfigurisan u php.ini, ili konfigurisani direktorijum ne postoji.</target>
+                <target>Privremeni direktorijum nije konfigurisan u php.ini, ili direktorijum koji je konfigurisan ne postoji.</target>
             </trans-unit>
             <trans-unit id="52">
                 <source>Cannot write temporary file to disk.</source>
@@ -224,7 +224,7 @@
             </trans-unit>
             <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                 <source>This value is not a valid International Bank Account Number (IBAN).</source>
-                <target state="needs-review-translation">Ova vrednost nije validan Međunarodni broj bankovnog računa (IBAN).</target>
+                <target>Ova vrednost nije validan Međunarodni broj bankovnog računa (IBAN).</target>
             </trans-unit>
             <trans-unit id="60">
                 <source>This value is not a valid ISBN-10.</source>
@@ -312,7 +312,7 @@
             </trans-unit>
             <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                 <source>This value is not a valid Business Identifier Code (BIC).</source>
-                <target state="needs-review-translation">Ova vrednost nije validan Kod za identifikaciju biznisa (BIC).</target>
+                <target>Ova vrednost nije validan Kod za identifikaciju biznisa (BIC).</target>
             </trans-unit>
             <trans-unit id="82">
                 <source>Error</source>
@@ -320,7 +320,7 @@
             </trans-unit>
             <trans-unit id="83" resname="This is not a valid UUID.">
                 <source>This value is not a valid UUID.</source>
-                <target state="needs-review-translation">Ova vrednost nije validan UUID.</target>
+                <target>Ova vrednost nije validan UUID.</target>
             </trans-unit>
             <trans-unit id="84">
                 <source>This value should be a multiple of {{ compared_value }}.</source>
@@ -436,19 +436,35 @@
             </trans-unit>
             <trans-unit id="112">
                 <source>This value is not a valid MAC address.</source>
-                <target state="needs-review-translation">Ova vrednost nije validna MAC adresa.</target>
+                <target>Ova vrednost nije validna MAC adresa.</target>
             </trans-unit>
             <trans-unit id="113">
                 <source>This URL is missing a top-level domain.</source>
-                <target state="needs-review-translation">Ovom URL nedostaje domen najvišeg nivoa.</target>
+                <target>Ovom URL nedostaje domen najvišeg nivoa.</target>
             </trans-unit>
             <trans-unit id="114">
                 <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
-                <target state="needs-translation">This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</target>
+                <target>Ova vrednost je prekratka. Treba da sadrži makar jednu reč.|Ova vrednost je prekratka. Treba da sadrži makar {{ min }} reči.</target>
             </trans-unit>
             <trans-unit id="115">
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
-                <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
+                <target>Ova vrednost je predugačka. Treba da sadrži samo jednu reč.|Ova vrednost je predugačka. Treba da sadrži najviše {{ max }} reči.</target>
+            </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target>Ova vrednost ne predstavlja validnu nedelju u ISO 8601 formatu.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target>Ova vrednost nije validna nedelja</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target>Ova vrednost ne bi trebala da bude pre nedelje "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target>Ova vrednost ne bi trebala da bude posle nedelje "{{ max }}".</target>
             </trans-unit>
         </body>
     </file>
diff --git a/vendor/symfony/validator/Resources/translations/validators.sv.xlf b/vendor/symfony/validator/Resources/translations/validators.sv.xlf
index 01668a87d21b3062beebe4cadaf7f3e9438b88a9..ac08eff2a931e156087b5c79faf31931e9a54616 100644
--- a/vendor/symfony/validator/Resources/translations/validators.sv.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.sv.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.th.xlf b/vendor/symfony/validator/Resources/translations/validators.th.xlf
index c6f0b829a6af6aecb2eebaf12927fde6e86e39f0..ded3a00868551bdb13d5e3009871a4f47a2aa993 100644
--- a/vendor/symfony/validator/Resources/translations/validators.th.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.th.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.tl.xlf b/vendor/symfony/validator/Resources/translations/validators.tl.xlf
index 1d831bd8ea0f37877c118a4c6094a02ea74d2711..4ac6bb45699ff5a8d8e1414f0a21eeb13b13448c 100644
--- a/vendor/symfony/validator/Resources/translations/validators.tl.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.tl.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.tr.xlf b/vendor/symfony/validator/Resources/translations/validators.tr.xlf
index 685e6ca1a928da3fceff679d933da126aa47d607..af59485b35d4510a9748696274c86fb4a621f65f 100644
--- a/vendor/symfony/validator/Resources/translations/validators.tr.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.tr.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.uk.xlf b/vendor/symfony/validator/Resources/translations/validators.uk.xlf
index b67e3e604decc97a5696cbadc7aa7f83436e4fe9..4775d04f449579c344a908e3754f169acb364e14 100644
--- a/vendor/symfony/validator/Resources/translations/validators.uk.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.uk.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.ur.xlf b/vendor/symfony/validator/Resources/translations/validators.ur.xlf
index d18604407c71ccf0e310c8ae05cc78f95d9f69dd..a1669de019a0a0c916df0c63679d6226bc40b6de 100644
--- a/vendor/symfony/validator/Resources/translations/validators.ur.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.ur.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.uz.xlf b/vendor/symfony/validator/Resources/translations/validators.uz.xlf
index d21bc24a3cc5b23e6d7c22bf07f585038651947f..d3012c64ef967c382865bf744521297c086d4dbd 100644
--- a/vendor/symfony/validator/Resources/translations/validators.uz.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.uz.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.vi.xlf b/vendor/symfony/validator/Resources/translations/validators.vi.xlf
index e1cdb6d09fb91100e76f1c6a28f5ecfd8410d112..70a7eedcf24e59f6dbcd7172ee2bd7762578ce06 100644
--- a/vendor/symfony/validator/Resources/translations/validators.vi.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.vi.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.zh_CN.xlf b/vendor/symfony/validator/Resources/translations/validators.zh_CN.xlf
index 15b234fb0d4ef80fd3352d114518443e6ea23564..3c078d3f5816c665f420bd3c21f055354085c4bf 100644
--- a/vendor/symfony/validator/Resources/translations/validators.zh_CN.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.zh_CN.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/validator/Resources/translations/validators.zh_TW.xlf b/vendor/symfony/validator/Resources/translations/validators.zh_TW.xlf
index 3812029fcad81db7c78efca6a1ab500de57cad2e..8c7caa523671366c8c7af1ec39aab84a9ea8e717 100644
--- a/vendor/symfony/validator/Resources/translations/validators.zh_TW.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.zh_TW.xlf
@@ -450,6 +450,22 @@
                 <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                 <target state="needs-translation">This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
             </trans-unit>
+            <trans-unit id="116">
+                <source>This value does not represent a valid week in the ISO 8601 format.</source>
+                <target state="needs-translation">This value does not represent a valid week in the ISO 8601 format.</target>
+            </trans-unit>
+            <trans-unit id="117">
+                <source>This value is not a valid week.</source>
+                <target state="needs-translation">This value is not a valid week.</target>
+            </trans-unit>
+            <trans-unit id="118">
+                <source>This value should not be before week "{{ min }}".</source>
+                <target state="needs-translation">This value should not be before week "{{ min }}".</target>
+            </trans-unit>
+            <trans-unit id="119">
+                <source>This value should not be after week "{{ max }}".</source>
+                <target state="needs-translation">This value should not be after week "{{ max }}".</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>
diff --git a/vendor/symfony/var-dumper/Dumper/CliDumper.php b/vendor/symfony/var-dumper/Dumper/CliDumper.php
index e0b17eecafdc9c9ebee906b38762ca02eeb052ab..e36cee6a9bb535a9d278b6edba040fdb23d149c7 100644
--- a/vendor/symfony/var-dumper/Dumper/CliDumper.php
+++ b/vendor/symfony/var-dumper/Dumper/CliDumper.php
@@ -621,7 +621,7 @@ private function hasColorSupport(mixed $stream): bool
         }
 
         // Follow https://no-color.org/
-        if ('' !== ($_SERVER['NO_COLOR'] ?? getenv('NO_COLOR') ?: '')) {
+        if ('' !== (($_SERVER['NO_COLOR'] ?? getenv('NO_COLOR'))[0] ?? '')) {
             return false;
         }
 
diff --git a/vendor/symfony/yaml/Inline.php b/vendor/symfony/yaml/Inline.php
index 1ba90dc51b328e3032e58c94b3d949d5453215ed..14f95d6244132477284d683f24146e9dad3e6418 100644
--- a/vendor/symfony/yaml/Inline.php
+++ b/vendor/symfony/yaml/Inline.php
@@ -709,8 +709,13 @@ private static function evaluateScalar(string $scalar, int $flags, array &$refer
                     case Parser::preg_match('/^(-|\+)?[0-9][0-9_]*(\.[0-9_]+)?$/', $scalar):
                         return (float) str_replace('_', '', $scalar);
                     case Parser::preg_match(self::getTimestampRegex(), $scalar):
-                        // When no timezone is provided in the parsed date, YAML spec says we must assume UTC.
-                        $time = new \DateTimeImmutable($scalar, new \DateTimeZone('UTC'));
+                        try {
+                            // When no timezone is provided in the parsed date, YAML spec says we must assume UTC.
+                            $time = new \DateTimeImmutable($scalar, new \DateTimeZone('UTC'));
+                        } catch (\Exception $e) {
+                            // Some dates accepted by the regex are not valid dates.
+                            throw new ParseException(\sprintf('The date "%s" could not be parsed as it is an invalid date.', $scalar), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename, $e);
+                        }
 
                         if (Yaml::PARSE_DATETIME & $flags) {
                             return $time;
diff --git a/web/modules/block_field/.gitlab-ci.yml b/web/modules/block_field/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..03d966a3891561634e706dd300d52f8a356575e6
--- /dev/null
+++ b/web/modules/block_field/.gitlab-ci.yml
@@ -0,0 +1,100 @@
+################
+# DrupalCI GitLabCI template
+#
+# Gitlab-ci.yml to replicate DrupalCI testing for Contrib
+#
+# With thanks to:
+#   * The GitLab Acceleration Initiative participants
+#   * DrupalSpoons
+################
+
+################
+# Guidelines
+#
+# This template is designed to give any Contrib maintainer everything they need to test, without requiring modification. It is also designed to keep up to date with Core Development automatically through the use of include files that can be centrally maintained.
+#
+# However, you can modify this template if you have additional needs for your project.
+################
+
+################
+# Includes
+#
+# Additional configuration can be provided through includes.
+# One advantage of include files is that if they are updated upstream, the changes affect all pipelines using that include.
+#
+# Includes can be overridden by re-declaring anything provided in an include, here in gitlab-ci.yml
+# https://docs.gitlab.com/ee/ci/yaml/includes.html#override-included-configuration-values
+################
+
+include:
+  ################
+  # DrupalCI includes:
+  # As long as you include this, any future includes added by the Drupal Association will be accessible to your pipelines automatically.
+  # View these include files at https://git.drupalcode.org/project/gitlab_templates/
+  ################
+  - project: $_GITLAB_TEMPLATES_REPO
+    ref: $_GITLAB_TEMPLATES_REF
+    file:
+      - '/includes/include.drupalci.main.yml'
+      # EXPERIMENTAL: For Drupal 7, remove the above line and uncomment the below.
+      # - '/includes/include.drupalci.main-d7.yml'
+      - '/includes/include.drupalci.variables.yml'
+      - '/includes/include.drupalci.workflows.yml'
+
+################
+# Pipeline configuration variables
+#
+# These are the variables provided to the Run Pipeline form that a user may want to override.
+#
+# Docs at https://git.drupalcode.org/project/gitlab_templates/-/blob/1.0.x/includes/include.drupalci.variables.yml
+################
+variables:
+  _PHPUNIT_CONCURRENT: '1'
+  OPT_IN_TEST_PREVIOUS_MAJOR: 1
+  OPT_IN_TEST_PREVIOUS_MINOR: 1
+
+###################################################################################
+#
+#                                        *
+#                                       /(
+#                                      ((((,
+#                                    /(((((((
+#                                   ((((((((((*
+#                                ,(((((((((((((((
+#                              ,(((((((((((((((((((
+#                            ((((((((((((((((((((((((*
+#                         *(((((((((((((((((((((((((((((
+#                       ((((((((((((((((((((((((((((((((((*
+#                    *((((((((((((((((((  .((((((((((((((((((
+#                  ((((((((((((((((((.       /(((((((((((((((((*
+#                /(((((((((((((((((            .(((((((((((((((((,
+#             ,((((((((((((((((((                 ((((((((((((((((((
+#           .((((((((((((((((((((                   .(((((((((((((((((
+#          (((((((((((((((((((((((                     ((((((((((((((((/
+#        (((((((((((((((((((((((((((/                    ,(((((((((((((((*
+#      .((((((((((((((/  /(((((((((((((.                   ,(((((((((((((((
+#     *((((((((((((((      ,(((((((((((((/                   *((((((((((((((.
+#    ((((((((((((((,          /(((((((((((((.                  ((((((((((((((,
+#   (((((((((((((/              ,(((((((((((((*                 ,(((((((((((((,
+#  *(((((((((((((                .(((((((((((((((                ,(((((((((((((
+#  ((((((((((((/                /((((((((((((((((((.              ,((((((((((((/
+# (((((((((((((              *(((((((((((((((((((((((*             *((((((((((((
+# (((((((((((((            ,(((((((((((((..(((((((((((((           *((((((((((((
+# ((((((((((((,          /((((((((((((*      /((((((((((((/         ((((((((((((
+# (((((((((((((        /((((((((((((/          (((((((((((((*       ((((((((((((
+# (((((((((((((/     /((((((((((((               ,((((((((((((,    *((((((((((((
+#  ((((((((((((((  *(((((((((((/                   *((((((((((((.  ((((((((((((/
+#  *((((((((((((((((((((((((((,                      /(((((((((((((((((((((((((
+#   (((((((((((((((((((((((((                         ((((((((((((((((((((((((,
+#   .(((((((((((((((((((((((/                         ,(((((((((((((((((((((((
+#     ((((((((((((((((((((((/                         ,(((((((((((((((((((((/
+#      *(((((((((((((((((((((                         (((((((((((((((((((((,
+#       ,(((((((((((((((((((((,                      ((((((((((((((((((((/
+#         ,(((((((((((((((((((((*                  /((((((((((((((((((((
+#            ((((((((((((((((((((((,           ,/((((((((((((((((((((,
+#              ,(((((((((((((((((((((((((((((((((((((((((((((((((((
+#                 .(((((((((((((((((((((((((((((((((((((((((((((
+#                     .((((((((((((((((((((((((((((((((((((,.
+#                          .,(((((((((((((((((((((((((.
+#
+###################################################################################
diff --git a/web/modules/block_field/block_field.info.yml b/web/modules/block_field/block_field.info.yml
index 50177d7af5ab8236c93e42a658b0e52bf8b67eb8..49e0e1abbeea04568c53c7b2ce67a6d99eb678a4 100644
--- a/web/modules/block_field/block_field.info.yml
+++ b/web/modules/block_field/block_field.info.yml
@@ -2,9 +2,9 @@ name: 'Block Field'
 type: module
 description: 'Provides a field that allows a content entity to create and configure custom block instances.'
 package: Field
-core_version_requirement: ^9 || ^10
+core_version_requirement: ^9 || ^10 || ^11
 
-# Information added by Drupal.org packaging script on 2022-11-03
-version: '8.x-1.0-rc4'
+# Information added by Drupal.org packaging script on 2024-08-13
+version: '8.x-1.0-rc5'
 project: 'block_field'
-datestamp: 1667511466
+datestamp: 1723550579
diff --git a/web/modules/block_field/block_field.module b/web/modules/block_field/block_field.module
new file mode 100644
index 0000000000000000000000000000000000000000..827b6f8c00a537c4ed913952f40ae21a020c0ea0
--- /dev/null
+++ b/web/modules/block_field/block_field.module
@@ -0,0 +1,15 @@
+<?php
+
+/**
+ * @file
+ * Hooks for the block_field module.
+ */
+
+/**
+ * Implements hook_field_info_alter().)
+ */
+function block_field_field_info_alter(&$info) {
+  if (version_compare(\Drupal::VERSION, '10.1.999', '<')) {
+    $info['block_field']['category'] = t('Reference');
+  }
+}
diff --git a/web/modules/block_field/src/Plugin/Field/FieldFormatter/BlockFieldLabelFormatter.php b/web/modules/block_field/src/Plugin/Field/FieldFormatter/BlockFieldLabelFormatter.php
index e5fd934f78f6a7893fef2dd9ba16af837c56bef7..b9b4a88beb6b151217321011d876770699f9b198 100644
--- a/web/modules/block_field/src/Plugin/Field/FieldFormatter/BlockFieldLabelFormatter.php
+++ b/web/modules/block_field/src/Plugin/Field/FieldFormatter/BlockFieldLabelFormatter.php
@@ -22,6 +22,13 @@
  */
 class BlockFieldLabelFormatter extends FormatterBase {
 
+    /**
+   * The current user.
+   *
+   * @var \Drupal\Core\Session\AccountProxyInterface
+   */
+  protected $currentUser;
+
   /**
    * Constructs a FormatterBase object.
    *
@@ -39,6 +46,8 @@ class BlockFieldLabelFormatter extends FormatterBase {
    *   The view mode.
    * @param array $third_party_settings
    *   Any third party settings.
+   * @param \Drupal\Core\Session\AccountProxyInterface $current_user
+   *   The current user.
    */
   public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, AccountProxyInterface $current_user) {
     parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings);
diff --git a/web/modules/block_field/src/Plugin/Field/FieldType/BlockFieldItem.php b/web/modules/block_field/src/Plugin/Field/FieldType/BlockFieldItem.php
index 6e66084fe733e884f12a381ac2cd6767be64b756..5f629046f4718037bf6f26b91ea825c3897d78e8 100644
--- a/web/modules/block_field/src/Plugin/Field/FieldType/BlockFieldItem.php
+++ b/web/modules/block_field/src/Plugin/Field/FieldType/BlockFieldItem.php
@@ -18,7 +18,7 @@
  *   id = "block_field",
  *   label = @Translation("Block (plugin)"),
  *   description = @Translation("Stores an instance of a configurable or custom block."),
- *   category = @Translation("Reference"),
+ *   category = "reference",
  *   default_widget = "block_field_default",
  *   default_formatter = "block_field",
  * )
diff --git a/web/modules/block_field/tests/modules/block_field_test/block_field_test.info.yml b/web/modules/block_field/tests/modules/block_field_test/block_field_test.info.yml
index 15a2c4414612b785420bcd015dd74e0ae98fc40d..f16635d02d389c1914e07bb33837c1641353044b 100644
--- a/web/modules/block_field/tests/modules/block_field_test/block_field_test.info.yml
+++ b/web/modules/block_field/tests/modules/block_field_test/block_field_test.info.yml
@@ -11,7 +11,7 @@ dependencies:
   - drupal:path
   - drupal:user
 
-# Information added by Drupal.org packaging script on 2022-11-03
-version: '8.x-1.0-rc4'
+# Information added by Drupal.org packaging script on 2024-08-13
+version: '8.x-1.0-rc5'
 project: 'block_field'
-datestamp: 1667511466
+datestamp: 1723550579
diff --git a/web/modules/block_field/tests/modules/block_field_test/config/install/block_content.type.basic.yml b/web/modules/block_field/tests/modules/block_field_test/config/install/block_content.type.basic.yml
index 3c9af0570d4d1b9d780965024c7b4338a5f6fe26..2320706ea4ad88b020c7c61286a5ea922b1c1c97 100644
--- a/web/modules/block_field/tests/modules/block_field_test/config/install/block_content.type.basic.yml
+++ b/web/modules/block_field/tests/modules/block_field_test/config/install/block_content.type.basic.yml
@@ -3,5 +3,5 @@ status: true
 dependencies: {  }
 id: basic
 label: 'Basic block'
-revision: 0
+revision: false
 description: 'A basic block, contains a title.'
diff --git a/web/modules/block_field/tests/modules/block_field_widget_test/block_field_widget_test.info.yml b/web/modules/block_field/tests/modules/block_field_widget_test/block_field_widget_test.info.yml
index b6ab6269bf403a23bfc7692f0c3752b90a1a8c57..13680401d118889f7f132455538d6fa4b2317772 100644
--- a/web/modules/block_field/tests/modules/block_field_widget_test/block_field_widget_test.info.yml
+++ b/web/modules/block_field/tests/modules/block_field_widget_test/block_field_widget_test.info.yml
@@ -11,7 +11,7 @@ dependencies:
   - drupal:user
   - drupal:views
 
-# Information added by Drupal.org packaging script on 2022-11-03
-version: '8.x-1.0-rc4'
+# Information added by Drupal.org packaging script on 2024-08-13
+version: '8.x-1.0-rc5'
 project: 'block_field'
-datestamp: 1667511466
+datestamp: 1723550579
diff --git a/web/modules/block_field/tests/modules/block_field_widget_test/config/optional/views.view.items.yml b/web/modules/block_field/tests/modules/block_field_widget_test/config/optional/views.view.items.yml
index 407488574edfd6038c5d666dabaefc54ca53eba0..b13a48c87f47130f63a3da2cd28f879b61c3bea0 100644
--- a/web/modules/block_field/tests/modules/block_field_widget_test/config/optional/views.view.items.yml
+++ b/web/modules/block_field/tests/modules/block_field_widget_test/config/optional/views.view.items.yml
@@ -161,7 +161,6 @@ display:
           default_argument_type: fixed
           default_argument_options:
             argument: ''
-          default_argument_skip_url: false
           summary_options:
             base_path: ''
             count: true
diff --git a/web/modules/block_field/tests/src/Functional/BlockFieldTest.php b/web/modules/block_field/tests/src/Functional/BlockFieldTest.php
index ba75d115b0df559cacb1925b504300f73dadc8a5..69e60253fe0d322ffdd00a8fa0dc486248f62b8e 100644
--- a/web/modules/block_field/tests/src/Functional/BlockFieldTest.php
+++ b/web/modules/block_field/tests/src/Functional/BlockFieldTest.php
@@ -31,6 +31,18 @@ class BlockFieldTest extends BrowserTestBase {
     'field_ui',
   ];
 
+  /**
+   * {@inheritdoc}
+   */
+  public function setUp(): void {
+    // BC for 10.2 and earlier, block_content.type revision schema changed from
+    // integer to boolean.
+    if (version_compare(\Drupal::VERSION, '10.3.0', '<')) {
+      $this->strictConfigSchema = FALSE;
+    }
+    parent::setUp();
+  }
+
   /**
    * Tests block field.
    */
@@ -72,9 +84,19 @@ public function testBlockField() {
     ], 'Add another item');
     $this->submitForm([], 'Save');
 
+
+
     // Check blocks displayed to authenticated.
     $node = $this->drupalGetNodeByTitle('Block field test');
+
+    // Edit and resave as a workaround, as Drupal 10.2+ no longer triggers a
+    // rebuild when adding another item and the function test doesn't trigger
+    // the select ajax callback.
+    // @todo Change the widget to add a non-js fallback button instead.
+    $this->drupalGet($node->toUrl('edit-form'));
+    $this->submitForm([], 'Save');
     $this->drupalGet($node->toUrl());
+
     $selector = '.field--name-field-block-field-test';
     $assert->elementExists('css', $selector);
     $assert->elementContains('css', $selector, '<div class="field__label">Block field test</div>');
diff --git a/web/modules/block_field/tests/src/Functional/WidgetTest.php b/web/modules/block_field/tests/src/Functional/WidgetTest.php
index 3beee0d2b3d4987eed9a804db19ceb9fdbc5b968..e7b35d866e344ac4f1e49feacf28f7366aa8d18b 100644
--- a/web/modules/block_field/tests/src/Functional/WidgetTest.php
+++ b/web/modules/block_field/tests/src/Functional/WidgetTest.php
@@ -40,6 +40,13 @@ class WidgetTest extends BrowserTestBase {
    * {@inheritdoc}
    */
   public function setUp(): void {
+
+    // BC for 10.2 and earlier, block_content.type revision schema changed from
+    // integer to boolean.
+    if (version_compare(\Drupal::VERSION, '10.3.0', '<')) {
+      $this->strictConfigSchema = FALSE;
+    }
+
     parent::setUp();
 
     $this->drupalLogin($this->drupalCreateUser([
diff --git a/web/modules/entity_browser/.gitlab-ci.yml b/web/modules/entity_browser/.gitlab-ci.yml
index 839425877f1324b924a15d0c88fa47f90a65e549..8bc1c098abd198bce42e2f8b9836dbe41063df67 100644
--- a/web/modules/entity_browser/.gitlab-ci.yml
+++ b/web/modules/entity_browser/.gitlab-ci.yml
@@ -17,15 +17,13 @@ include:
 #
 variables:
   # Broaden test coverage.
-  OPT_IN_TEST_PREVIOUS_MAJOR: 1
-  OPT_IN_TEST_NEXT_MINOR: 1
-  OPT_IN_TEST_MAX_PHP: 1
+  OPT_IN_TEST_PREVIOUS_MINOR: 1
   _PHPUNIT_CONCURRENT: 1
 
-composer (previous major):
+composer (next major):
   variables:
-    _TARGET_PHP: $CORE_PREVIOUS_PHP_MAX
+    _LENIENT_ALLOW_LIST: "ckeditor,embed,entity_embed,inline_entity_form"
 
-phpunit (previous major):
-  variables:
-    _TARGET_PHP: $CORE_PREVIOUS_PHP_MAX
+phpunit (next major):
+  before_script:
+    - 'sed -i "s/core_version_requirement.*/core_version_requirement: \^11/" web/modules/contrib/**/*.info.yml'
diff --git a/web/modules/entity_browser/composer.json b/web/modules/entity_browser/composer.json
index 387f2e4e2167cf183148cf3f229187f691ded041..9ca18c28b0b6e632bffddc3908edaec7cee7d79e 100644
--- a/web/modules/entity_browser/composer.json
+++ b/web/modules/entity_browser/composer.json
@@ -26,10 +26,6 @@
     "source": "https://git.drupalcode.org/project/entity_browser"
   },
   "license": "GPL-2.0+",
-  "minimum-stability": "dev",
-  "require": {
-    "drupal/core": "^9.5 || ^10"
-  },
   "require-dev": {
     "drupal/ckeditor": "^1.0",
     "drupal/token": "^1.0",
@@ -38,7 +34,8 @@
     "drupal/embed": "^1.0",
     "drupal/entity_embed": "^1.0",
     "drupal/entityqueue": "^1.0",
-    "drupal/entity_reference_revisions": "^1.0"
+    "drupal/entity_reference_revisions": "^1.0",
+    "drupal/search_api": "^1.0"
   },
   "conflict": {
     "drupal/media_entity": "1.*"
diff --git a/web/modules/entity_browser/entity_browser.info.yml b/web/modules/entity_browser/entity_browser.info.yml
index e6f38dfa2e7f2e7ce506c9fa989f783cee6af4fe..c312f2afac3c9a6baa5590e858410866dee30584 100644
--- a/web/modules/entity_browser/entity_browser.info.yml
+++ b/web/modules/entity_browser/entity_browser.info.yml
@@ -2,10 +2,10 @@ name: Entity Browser
 description: 'Provide a generic entity browser/picker/selector.'
 type: module
 package: Media
-core_version_requirement: ^9.5 || ^10
+core_version_requirement: ^10.2 || ^11
 configure: entity.entity_browser.collection
 
-# Information added by Drupal.org packaging script on 2023-12-11
-version: '8.x-2.10'
+# Information added by Drupal.org packaging script on 2024-08-11
+version: '8.x-2.11'
 project: 'entity_browser'
-datestamp: 1702325313
+datestamp: 1723378141
diff --git a/web/modules/entity_browser/entity_browser.module b/web/modules/entity_browser/entity_browser.module
index 67d956f1f888cff269bb1e09f757695a754a2d2c..6a0362be8dd5f35533b5239f8701f2ac2fc9aa26 100644
--- a/web/modules/entity_browser/entity_browser.module
+++ b/web/modules/entity_browser/entity_browser.module
@@ -135,6 +135,9 @@ function entity_browser_preprocess_page__entity_browser__modal(&$variables) {
  *
  * @return array
  *   See file_validate_image_resolution()
+ *
+ * @deprecated in entity_browser:8.x-2.11 and is removed from
+ *   entity_browser:2.0.0. Use EntityBrowserImageDimensions constraint instead.
  */
 function entity_browser_file_validate_image_resolution(FileInterface $file, $maximum_dimensions = 0, $minimum_dimensions = 0) {
   $errors = [];
diff --git a/web/modules/entity_browser/entity_browser.routing.yml b/web/modules/entity_browser/entity_browser.routing.yml
index 13162b14ae3288a8ae127673b9afbbf28110a127..5f901ff8ef91a3fddd6bed8eb1b39e4b90568f49 100644
--- a/web/modules/entity_browser/entity_browser.routing.yml
+++ b/web/modules/entity_browser/entity_browser.routing.yml
@@ -12,6 +12,7 @@ entity_browser.edit_form:
     parameters:
       entity:
         type: entity:{entity_type}
+        load_latest_revision: 1
 
 entity.entity_browser.add_form:
   path: '/admin/config/content/entity_browser/add'
diff --git a/web/modules/entity_browser/js/entity_browser.modal.js b/web/modules/entity_browser/js/entity_browser.modal.js
index 1c39014844ecc62c04f4d17876269f528a7f9643..7afc0a19406585d265497969cd77606ec81ebe54 100644
--- a/web/modules/entity_browser/js/entity_browser.modal.js
+++ b/web/modules/entity_browser/js/entity_browser.modal.js
@@ -141,6 +141,19 @@
         dialog.option('position', dialog.options.position);
       }
     });
+
+    /**
+     * Close modal popup on escape key press.
+     */
+    Drupal.behaviors.closeModalOnEscapeKeyPress = {
+      attach: function (context) {
+        $(document).on('keydown', function (event) {
+          if (event.key == 'Escape') {
+            $(document).find('.entity-browser-modal-iframe').parents('.ui-dialog').eq(0).find('.ui-dialog-titlebar-close').click();
+          }
+        });
+      }
+    };
   };
 
 }(jQuery, Drupal, drupalSettings, window, document));
diff --git a/web/modules/entity_browser/modules/entity_browser_example/entity_browser_example.info.yml b/web/modules/entity_browser/modules/entity_browser_example/entity_browser_example.info.yml
index 4c5dc006e73b224d8abfc688825f57b0f3178213..bbb2e2bae7a5fdfb91c139bdbc29f1da2b19b76e 100644
--- a/web/modules/entity_browser/modules/entity_browser_example/entity_browser_example.info.yml
+++ b/web/modules/entity_browser/modules/entity_browser_example/entity_browser_example.info.yml
@@ -2,7 +2,7 @@ name: Entity Browser example
 description: 'Entity browser example module.'
 type: module
 package: Media
-core_version_requirement: ^9.5 || ^10
+core_version_requirement: ^10.2 || ^11
 dependencies:
   - entity_browser:entity_browser
   - drupal:views
@@ -12,7 +12,7 @@ dependencies:
   - drupal:image
   - drupal:path
 
-# Information added by Drupal.org packaging script on 2023-12-11
-version: '8.x-2.10'
+# Information added by Drupal.org packaging script on 2024-08-11
+version: '8.x-2.11'
 project: 'entity_browser'
-datestamp: 1702325313
+datestamp: 1723378141
diff --git a/web/modules/entity_browser/modules/entity_form/entity_browser_entity_form.info.yml b/web/modules/entity_browser/modules/entity_form/entity_browser_entity_form.info.yml
index d6cca2bd39589229ffabf05058bb898b073eae09..53698ccec3244866a7a2216df3a39a9a8314fd5c 100644
--- a/web/modules/entity_browser/modules/entity_form/entity_browser_entity_form.info.yml
+++ b/web/modules/entity_browser/modules/entity_form/entity_browser_entity_form.info.yml
@@ -2,12 +2,12 @@ name: Entity Browser IEF
 description: 'Entity browser inline entity form integration.'
 type: module
 package: Media
-core_version_requirement: ^9.5 || ^10
+core_version_requirement: ^10.2 || ^11
 dependencies:
   - entity_browser:entity_browser
   - inline_entity_form:inline_entity_form
 
-# Information added by Drupal.org packaging script on 2023-12-11
-version: '8.x-2.10'
+# Information added by Drupal.org packaging script on 2024-08-11
+version: '8.x-2.11'
 project: 'entity_browser'
-datestamp: 1702325313
+datestamp: 1723378141
diff --git a/web/modules/entity_browser/modules/entity_form/tests/modules/entity_browser_entity_form_test/entity_browser_entity_form_test.info.yml b/web/modules/entity_browser/modules/entity_form/tests/modules/entity_browser_entity_form_test/entity_browser_entity_form_test.info.yml
index be2e1d28256917b398866e45515e9aa16374541c..3dbc382834d01825704ef810b0b7e78851908ddc 100644
--- a/web/modules/entity_browser/modules/entity_form/tests/modules/entity_browser_entity_form_test/entity_browser_entity_form_test.info.yml
+++ b/web/modules/entity_browser/modules/entity_form/tests/modules/entity_browser_entity_form_test/entity_browser_entity_form_test.info.yml
@@ -7,7 +7,7 @@ dependencies:
   - entity_browser_test:entity_browser_test
   - drupal:views
 
-# Information added by Drupal.org packaging script on 2023-12-11
-version: '8.x-2.10'
+# Information added by Drupal.org packaging script on 2024-08-11
+version: '8.x-2.11'
 project: 'entity_browser'
-datestamp: 1702325313
+datestamp: 1723378141
diff --git a/web/modules/entity_browser/modules/entity_form/tests/src/FunctionalJavascript/InlineEntityIntegrationTest.php b/web/modules/entity_browser/modules/entity_form/tests/src/FunctionalJavascript/InlineEntityIntegrationTest.php
index 274bb96b7de68af5565a30f72d842e1d16570636..5e2a29e07fb3b3bbb2f1b73a34b4a1cbdeadcd07 100644
--- a/web/modules/entity_browser/modules/entity_form/tests/src/FunctionalJavascript/InlineEntityIntegrationTest.php
+++ b/web/modules/entity_browser/modules/entity_form/tests/src/FunctionalJavascript/InlineEntityIntegrationTest.php
@@ -62,7 +62,6 @@ public function testInlineEntityIntegration() {
     $this->assertSession()
       ->selectExists('fields[field_content_reference][region]')
       ->selectOption('content');
-    $this->assertSession()->assertWaitOnAjaxRequest();
 
     // Switch to using inline_entity_form_complex, so we can test
     // entity browser alterations to field widget settings form.
diff --git a/web/modules/entity_browser/src/Controllers/EntityBrowserController.php b/web/modules/entity_browser/src/Controllers/EntityBrowserController.php
index f0df5fbffce53b65d0e84babd2b1ceab99d95927..05d8418ebfc2ff632bfca004d4203445e8390e53 100644
--- a/web/modules/entity_browser/src/Controllers/EntityBrowserController.php
+++ b/web/modules/entity_browser/src/Controllers/EntityBrowserController.php
@@ -10,6 +10,7 @@
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Form\FormState;
 use Drupal\entity_browser\Ajax\ValueUpdatedCommand;
+use Symfony\Component\HttpFoundation\InputBag;
 use Symfony\Component\HttpFoundation\ParameterBag;
 use Symfony\Component\HttpFoundation\Request;
 
@@ -39,7 +40,7 @@ public function entityBrowserEdit(EntityInterface $entity, Request $request) {
       // Remove posted values from original form to prevent
       // data leakage into this form when the form is of the same bundle.
       $original_request = $request->request;
-      $request->request = new ParameterBag();
+      $request->request = new InputBag();
     }
 
     // Use edit form class if it exists, otherwise use default form class.
diff --git a/web/modules/entity_browser/src/Entity/EntityBrowser.php b/web/modules/entity_browser/src/Entity/EntityBrowser.php
index b64de7188dfb79af848a11dce29211b5ed321310..a1d27ccd3b3e067eb0aabb2416e35b61bc6e31d4 100644
--- a/web/modules/entity_browser/src/Entity/EntityBrowser.php
+++ b/web/modules/entity_browser/src/Entity/EntityBrowser.php
@@ -30,7 +30,6 @@
  *     "list_builder" = "Drupal\entity_browser\Controllers\EntityBrowserListBuilder",
  *   },
  *   links = {
- *     "canonical" = "/admin/config/content/entity_browser/{entity_browser}",
  *     "collection" = "/admin/config/content/entity_browser",
  *     "edit-form" = "/admin/config/content/entity_browser/{entity_browser}/edit",
  *     "edit-widgets" = "/admin/config/content/entity_browser/{entity_browser}/edit_widgets",
@@ -425,7 +424,7 @@ public function preSave(EntityStorageInterface $storage) {
    * Prevents plugin collections from being serialized and correctly serializes
    * selected entities.
    */
-  public function __sleep() {
+  public function __sleep(): array {
     // Save configuration for all plugins.
     $this->widgets = $this->getWidgets()->getConfiguration();
     $this->widget_selector_configuration = $this->widgetSelectorPluginCollection()->getConfiguration();
diff --git a/web/modules/entity_browser/src/Permissions.php b/web/modules/entity_browser/src/Permissions.php
index 21fa7581eaecc98d1ad9e041bac37481e36d3de7..14734d58b284bd0cc95e8d02b8ebe0b4bf913c93 100644
--- a/web/modules/entity_browser/src/Permissions.php
+++ b/web/modules/entity_browser/src/Permissions.php
@@ -53,6 +53,11 @@ public function permissions() {
         $permissions['access ' . $browser->id() . ' entity browser pages'] = [
           'title' => $this->t('Access @name pages', ['@name' => $browser->label()]),
           'description' => $this->t('Access pages that %browser uses to operate.', ['%browser' => $browser->label()]),
+          'dependencies' => [
+            $browser->getConfigDependencyKey() => [
+              $browser->getConfigDependencyName(),
+            ],
+          ],
         ];
       }
     }
diff --git a/web/modules/entity_browser/src/Plugin/EntityBrowser/Display/Modal.php b/web/modules/entity_browser/src/Plugin/EntityBrowser/Display/Modal.php
index 5d1749f51b4fbec898c8ed97dd217b3c6e8b84f0..9070886005592ce8ce96869640b790f935086a86 100644
--- a/web/modules/entity_browser/src/Plugin/EntityBrowser/Display/Modal.php
+++ b/web/modules/entity_browser/src/Plugin/EntityBrowser/Display/Modal.php
@@ -147,7 +147,7 @@ public function openModal(array &$form, FormStateInterface $form_state) {
   /**
    * {@inheritdoc}
    */
-  public function __sleep() {
+  public function __sleep(): array {
     return ['configuration'];
   }
 
diff --git a/web/modules/entity_browser/src/Plugin/EntityBrowser/FieldWidgetDisplay/EntityLabel.php b/web/modules/entity_browser/src/Plugin/EntityBrowser/FieldWidgetDisplay/EntityLabel.php
index 72f6f5600666b21b30e54767aafe061f2240abec..bfd24d810b8b9f9df7a66cd4134c7e520ed34495 100644
--- a/web/modules/entity_browser/src/Plugin/EntityBrowser/FieldWidgetDisplay/EntityLabel.php
+++ b/web/modules/entity_browser/src/Plugin/EntityBrowser/FieldWidgetDisplay/EntityLabel.php
@@ -50,7 +50,7 @@ public function view(EntityInterface $entity) {
       return ['#markup' => $restricted_access_label];
     }
 
-    return $translation->label();
+    return ['#markup' => $translation->label()];
   }
 
   /**
diff --git a/web/modules/entity_browser/src/Plugin/EntityBrowser/Widget/MediaImageUpload.php b/web/modules/entity_browser/src/Plugin/EntityBrowser/Widget/MediaImageUpload.php
index c6516bd5e2cecfc25e2974ec87b9c886a5ba3092..34c538354d480887890f828bc010639f11798567 100644
--- a/web/modules/entity_browser/src/Plugin/EntityBrowser/Widget/MediaImageUpload.php
+++ b/web/modules/entity_browser/src/Plugin/EntityBrowser/Widget/MediaImageUpload.php
@@ -43,7 +43,7 @@ public function getForm(array &$original_form, FormStateInterface $form_state, a
     }
 
     $form = parent::getForm($original_form, $form_state, $aditional_widget_parameters);
-    $form['upload']['#upload_validators']['file_validate_extensions'] = [$this->configuration['extensions']];
+    $form['upload']['#upload_validators']['FileExtension'] = ['extensions' => $this->configuration['extensions']];
 
     return $form;
   }
diff --git a/web/modules/entity_browser/src/Plugin/EntityBrowser/Widget/Upload.php b/web/modules/entity_browser/src/Plugin/EntityBrowser/Widget/Upload.php
index ff4fe7aac1108bd724a94dafc73cd85e905ed4ff..065b2eaaf059c802991be98975edd6abb7f4d477 100644
--- a/web/modules/entity_browser/src/Plugin/EntityBrowser/Widget/Upload.php
+++ b/web/modules/entity_browser/src/Plugin/EntityBrowser/Widget/Upload.php
@@ -72,7 +72,7 @@ public function getForm(array &$original_form, FormStateInterface $form_state, a
       // more than one value.
       '#multiple' => $field_cardinality != 1 && $this->configuration['multiple'],
       '#upload_validators' => array_merge([
-        'file_validate_extensions' => [$this->configuration['extensions']],
+        'FileExtension' => ['extensions' => $this->configuration['extensions']],
       ], $upload_validators),
     ];
 
diff --git a/web/modules/entity_browser/src/Plugin/EntityBrowser/WidgetValidation/File.php b/web/modules/entity_browser/src/Plugin/EntityBrowser/WidgetValidation/File.php
index c5e48c85825a399db17d2b800c509c8d552e617a..f2f763c43728bb22be0a764acd860d032baa2289 100644
--- a/web/modules/entity_browser/src/Plugin/EntityBrowser/WidgetValidation/File.php
+++ b/web/modules/entity_browser/src/Plugin/EntityBrowser/WidgetValidation/File.php
@@ -3,6 +3,8 @@
 namespace Drupal\entity_browser\Plugin\EntityBrowser\WidgetValidation;
 
 use Drupal\entity_browser\WidgetValidationBase;
+use Drupal\file\Validation\FileValidatorInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\Validator\ConstraintViolation;
 use Symfony\Component\Validator\ConstraintViolationList;
 
@@ -16,6 +18,19 @@
  */
 class File extends WidgetValidationBase {
 
+  /**
+   * File validator.
+   *
+   * @var \Drupal\file\Validation\FileValidatorInterface
+   */
+  protected FileValidatorInterface $fileValidator;
+
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    $plugin = parent::create($container, $configuration, $plugin_id, $plugin_definition);
+    $plugin->fileValidator = $container->get('file.validator');
+    return $plugin;
+  }
+
   /**
    * {@inheritdoc}
    */
@@ -28,9 +43,9 @@ public function validate(array $entities, array $options = []) {
     foreach ($entities as $entity) {
       if (isset($options['validators'])) {
         // Checks that a file meets the criteria specified by the validators.
-        if ($errors = file_validate($entity, $options['validators'])) {
-          foreach ($errors as $error) {
-            $violation = new ConstraintViolation($error, $error, [], $entity, '', $entity);
+        if ($violations = $this->fileValidator->validate($entity, $options['validators'])) {
+          foreach ($violations as $violation) {
+            $violation = new ConstraintViolation($violation->getMessage(), $violation->getMessage(), [], $entity, '', $entity);
             $violations->add($violation);
           }
         }
diff --git a/web/modules/entity_browser/src/Plugin/Field/FieldWidget/FileBrowserWidget.php b/web/modules/entity_browser/src/Plugin/Field/FieldWidget/FileBrowserWidget.php
index 1b02bbf04dbc9399d528ecdb09154ab11d7a28de..3ead83437b6b7a981b6cde4ef95f8dc66c801676 100644
--- a/web/modules/entity_browser/src/Plugin/Field/FieldWidget/FileBrowserWidget.php
+++ b/web/modules/entity_browser/src/Plugin/Field/FieldWidget/FileBrowserWidget.php
@@ -428,7 +428,7 @@ public function getFileValidators($upload = FALSE) {
         $max_filesize = min($max_filesize, Bytes::toNumber($settings['max_filesize']));
       }
       // There is always a file size limit due to the PHP server limit.
-      $validators['file_validate_size'] = [$max_filesize];
+      $validators['FileSizeLimit'] = ['fileLimit' => $max_filesize];
     }
 
     // Images have expected defaults for file extensions.
@@ -438,15 +438,18 @@ public function getFileValidators($upload = FALSE) {
       $supported_extensions = ['png', 'gif', 'jpg', 'jpeg'];
       $extensions = isset($settings['file_extensions']) ? $settings['file_extensions'] : implode(' ', $supported_extensions);
       $extensions = array_intersect(explode(' ', $extensions), $supported_extensions);
-      $validators['file_validate_extensions'] = [implode(' ', $extensions)];
+      $validators['FileExtension'] = ['extensions' => implode(' ', $extensions)];
 
       // Add resolution validation.
       if (!empty($settings['max_resolution']) || !empty($settings['min_resolution'])) {
-        $validators['entity_browser_file_validate_image_resolution'] = [$settings['max_resolution'], $settings['min_resolution']];
+        $validators['EntityBrowserImageDimensions'] = [
+          'maxDimensions' => $settings['max_resolution'],
+          'minDimensions' => $settings['min_resolution'],
+        ];
       }
     }
     elseif (!empty($settings['file_extensions'])) {
-      $validators['file_validate_extensions'] = [$settings['file_extensions']];
+      $validators['FileExtension'] = ['extensions' => $settings['file_extensions']];
     }
 
     return $validators;
diff --git a/web/modules/entity_browser/src/Plugin/Validation/Constraint/EntityBrowserImageDimensionsConstraint.php b/web/modules/entity_browser/src/Plugin/Validation/Constraint/EntityBrowserImageDimensionsConstraint.php
new file mode 100644
index 0000000000000000000000000000000000000000..bd580bd7e1ec5193a200bb903ee07a38679d5ee0
--- /dev/null
+++ b/web/modules/entity_browser/src/Plugin/Validation/Constraint/EntityBrowserImageDimensionsConstraint.php
@@ -0,0 +1,27 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\entity_browser\Plugin\Validation\Constraint;
+
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\Core\Validation\Attribute\Constraint;
+use Drupal\file\Plugin\Validation\Constraint\FileImageDimensionsConstraint;
+
+/**
+ * File extension dimensions constraint.
+ *
+ * @Constraint(
+ *   id = "EntityBrowserImageDimensions",
+ *   label = @Translation("Entity Browser Image Dimensions", context = "Validation"),
+ *   type = "file"
+ * )
+ */
+#[Constraint(
+  id: 'EntityBrowserImageDimensions',
+  label: new TranslatableMarkup('Entity Browser Image Dimensions', [], ['context' => 'Validation']),
+  type: 'file'
+)]
+class EntityBrowserImageDimensionsConstraint extends FileImageDimensionsConstraint {
+
+}
diff --git a/web/modules/entity_browser/src/Plugin/Validation/Constraint/EntityBrowserImageDimensionsConstraintValidator.php b/web/modules/entity_browser/src/Plugin/Validation/Constraint/EntityBrowserImageDimensionsConstraintValidator.php
new file mode 100644
index 0000000000000000000000000000000000000000..08ebcfdbd9ee321ee53c36123d5c60ad0d3cd564
--- /dev/null
+++ b/web/modules/entity_browser/src/Plugin/Validation/Constraint/EntityBrowserImageDimensionsConstraintValidator.php
@@ -0,0 +1,128 @@
+<?php
+
+namespace Drupal\entity_browser\Plugin\Validation\Constraint;
+
+use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
+use Drupal\Core\Image\ImageFactory;
+use Drupal\Core\Messenger\MessengerInterface;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+use Drupal\file\Plugin\Validation\Constraint\BaseFileConstraintValidator;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+/**
+ * Validator for the EntityBrowserImageDimensionsConstraint.
+ *
+ * Drupal core does not allow users to use existing images. As a result,
+ * calling the normal FileImageDimensions constraint on a file that
+ * may be used elsewhere would resize it for all of its uses. We copy the
+ * normal validation here so that we can stop this from occurring.
+ */
+class EntityBrowserImageDimensionsConstraintValidator extends BaseFileConstraintValidator implements ContainerInjectionInterface {
+
+  use StringTranslationTrait;
+
+  /**
+   * Creates a new FileImageDimensionsConstraintValidator.
+   *
+   * @param \Drupal\Core\Image\ImageFactory $imageFactory
+   *   The image factory.
+   * @param \Drupal\Core\Messenger\MessengerInterface $messenger
+   *   The messenger.
+   */
+  public function __construct(
+    protected ImageFactory $imageFactory,
+    protected MessengerInterface $messenger,
+  ) {}
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('image.factory'),
+      $container->get('messenger'),
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validate(mixed $value, Constraint $constraint): void {
+    $file = $this->assertValueIsFile($value);
+    if (!$constraint instanceof EntityBrowserImageDimensionsConstraint) {
+      throw new UnexpectedTypeException($constraint, EntityBrowserImageDimensionsConstraint::class);
+    }
+
+    $image = $this->imageFactory->get($file->getFileUri());
+    if (!$image->isValid()) {
+      return;
+    }
+
+    $scaling = FALSE;
+    $maxDimensions = $constraint->maxDimensions;
+    if ($maxDimensions) {
+      // Check that it is smaller than the given dimensions.
+      [$width, $height] = explode('x', $maxDimensions);
+      if ($file->isTemporary() && ($image->getWidth() > $width || $image->getHeight() > $height)) {
+        // Try to resize the image to fit the dimensions.
+        if ($image->scale($width, $height)) {
+          $scaling = TRUE;
+          $image->save();
+          if (!empty($width) && !empty($height)) {
+            $this->messenger->addStatus($this->t('The image was resized to fit within the maximum allowed dimensions of %dimensions pixels. The new dimensions of the resized image are %new_widthx%new_height pixels.',
+              [
+                '%dimensions' => $maxDimensions,
+                '%new_width' => $image->getWidth(),
+                '%new_height' => $image->getHeight(),
+              ]));
+          }
+          elseif (empty($width)) {
+            $this->messenger->addStatus($this->t('The image was resized to fit within the maximum allowed height of %height pixels. The new dimensions of the resized image are %new_widthx%new_height pixels.',
+              [
+                '%height' => $height,
+                '%new_width' => $image->getWidth(),
+                '%new_height' => $image->getHeight(),
+              ]));
+          }
+          elseif (empty($height)) {
+            $this->messenger->addStatus($this->t('The image was resized to fit within the maximum allowed width of %width pixels. The new dimensions of the resized image are %new_widthx%new_height pixels.',
+              [
+                '%width' => $width,
+                '%new_width' => $image->getWidth(),
+                '%new_height' => $image->getHeight(),
+              ]));
+          }
+        }
+        else {
+          $this->context->addViolation($constraint->messageResizeFailed);
+        }
+      }
+    }
+
+    $minDimensions = $constraint->minDimensions;
+    if ($minDimensions) {
+      // Check that it is larger than the given dimensions.
+      [$width, $height] = explode('x', $minDimensions);
+      if ($image->getWidth() < $width || $image->getHeight() < $height) {
+        if ($scaling) {
+          $this->context->addViolation($constraint->messageResizedImageTooSmall,
+            [
+              '%dimensions' => $minDimensions,
+              '%width' => $image->getWidth(),
+              '%height' => $image->getHeight(),
+            ]);
+          return;
+        }
+        $this->context->addViolation($constraint->messageImageTooSmall,
+          [
+            '%dimensions' => $minDimensions,
+            '%width' => $image->getWidth(),
+            '%height' => $image->getHeight(),
+          ]);
+      }
+    }
+  }
+
+}
diff --git a/web/modules/entity_browser/tests/modules/entity_browser_entity_embed_test/config/install/editor.editor.full_html.yml b/web/modules/entity_browser/tests/modules/entity_browser_entity_embed_test/config/install/editor.editor.full_html.yml
index a0fcdb272cfd07238fffc54a796168c0b9acffb0..54f1c192e62fbd9b84590eef173a7982fe0e932b 100644
--- a/web/modules/entity_browser/tests/modules/entity_browser_entity_embed_test/config/install/editor.editor.full_html.yml
+++ b/web/modules/entity_browser/tests/modules/entity_browser_entity_embed_test/config/install/editor.editor.full_html.yml
@@ -44,15 +44,17 @@ settings:
     ckeditor5_imageResize:
       allow_resize: true
     ckeditor5_list:
-      reversed: true
-      startIndex: true
+      properties:
+        reversed: true
+        startIndex: true
+      multiBlock: true
     ckeditor5_sourceEditing:
       allowed_tags: {  }
 image_upload:
   status: true
   scheme: public
   directory: inline-images
-  max_size: ''
+  max_size: null
   max_dimensions:
-    width: 0
-    height: 0
+    width: null
+    height: null
diff --git a/web/modules/entity_browser/tests/modules/entity_browser_entity_embed_test/entity_browser_entity_embed_test.info.yml b/web/modules/entity_browser/tests/modules/entity_browser_entity_embed_test/entity_browser_entity_embed_test.info.yml
index 67a2ebbdc76288b998917f4f2040097e9905ac06..ea31ea030aea8efb80cd8b28d2e0cfc6ffda515e 100644
--- a/web/modules/entity_browser/tests/modules/entity_browser_entity_embed_test/entity_browser_entity_embed_test.info.yml
+++ b/web/modules/entity_browser/tests/modules/entity_browser_entity_embed_test/entity_browser_entity_embed_test.info.yml
@@ -17,7 +17,7 @@ dependencies:
   - entity_browser:entity_browser
   - entity_browser_test:entity_browser_test
 
-# Information added by Drupal.org packaging script on 2023-12-11
-version: '8.x-2.10'
+# Information added by Drupal.org packaging script on 2024-08-11
+version: '8.x-2.11'
 project: 'entity_browser'
-datestamp: 1702325313
+datestamp: 1723378141
diff --git a/web/modules/entity_browser/tests/modules/entity_browser_ief_test/entity_browser_ief_test.info.yml b/web/modules/entity_browser/tests/modules/entity_browser_ief_test/entity_browser_ief_test.info.yml
index 2c08dfd92adfc47174b0cbe74fdbec6ee2ff5035..974745721bbfe7d24cf5409b68c3440a65724a02 100644
--- a/web/modules/entity_browser/tests/modules/entity_browser_ief_test/entity_browser_ief_test.info.yml
+++ b/web/modules/entity_browser/tests/modules/entity_browser_ief_test/entity_browser_ief_test.info.yml
@@ -11,7 +11,7 @@ dependencies:
   - inline_entity_form:inline_entity_form
   - drupal:views
 
-# Information added by Drupal.org packaging script on 2023-12-11
-version: '8.x-2.10'
+# Information added by Drupal.org packaging script on 2024-08-11
+version: '8.x-2.11'
 project: 'entity_browser'
-datestamp: 1702325313
+datestamp: 1723378141
diff --git a/web/modules/entity_browser/tests/modules/entity_browser_test/config/install/views.view.test_selection_display_view.yml b/web/modules/entity_browser/tests/modules/entity_browser_test/config/install/views.view.test_selection_display_view.yml
index 267c8805c295c0423079aa3dc2e1c9861945c29e..b6bce01af44571b15203a6930ec8a0bf2dd28833 100644
--- a/web/modules/entity_browser/tests/modules/entity_browser_test/config/install/views.view.test_selection_display_view.yml
+++ b/web/modules/entity_browser/tests/modules/entity_browser_test/config/install/views.view.test_selection_display_view.yml
@@ -149,7 +149,6 @@ display:
           default_argument_type: fixed
           default_argument_options:
             argument: ''
-          default_argument_skip_url: false
           summary_options:
             base_path: ''
             count: true
diff --git a/web/modules/entity_browser/tests/modules/entity_browser_test/config/install/views.view.widget_context_default_value.yml b/web/modules/entity_browser/tests/modules/entity_browser_test/config/install/views.view.widget_context_default_value.yml
index 4de66a538b6de7565943deb6ae514689632a15ce..9ec2dda7d874b1ed787ceecf5e6270f0ac898cf4 100644
--- a/web/modules/entity_browser/tests/modules/entity_browser_test/config/install/views.view.widget_context_default_value.yml
+++ b/web/modules/entity_browser/tests/modules/entity_browser_test/config/install/views.view.widget_context_default_value.yml
@@ -450,7 +450,6 @@ display:
             context_key: target_bundles
             fallback: all
             multiple: or
-          default_argument_skip_url: false
           summary_options:
             base_path: ''
             count: true
diff --git a/web/modules/entity_browser/tests/modules/entity_browser_test/entity_browser_test.info.yml b/web/modules/entity_browser/tests/modules/entity_browser_test/entity_browser_test.info.yml
index f2b592ef42247bca96f45a7f810998255707e1ed..5c44a74b38e41c91fd91380202b7ff8cff207faa 100644
--- a/web/modules/entity_browser/tests/modules/entity_browser_test/entity_browser_test.info.yml
+++ b/web/modules/entity_browser/tests/modules/entity_browser_test/entity_browser_test.info.yml
@@ -9,7 +9,7 @@ dependencies:
   - drupal:node
   - drupal:views
 
-# Information added by Drupal.org packaging script on 2023-12-11
-version: '8.x-2.10'
+# Information added by Drupal.org packaging script on 2024-08-11
+version: '8.x-2.11'
 project: 'entity_browser'
-datestamp: 1702325313
+datestamp: 1723378141
diff --git a/web/modules/entity_browser/tests/modules/entity_browser_test_configuration/entity_browser_test_configuration.info.yml b/web/modules/entity_browser/tests/modules/entity_browser_test_configuration/entity_browser_test_configuration.info.yml
index 957f1266e4e5fca69be332846ded0d7c31a13653..e639ef2d00aed47582c6e32dbd923d858b9917d7 100644
--- a/web/modules/entity_browser/tests/modules/entity_browser_test_configuration/entity_browser_test_configuration.info.yml
+++ b/web/modules/entity_browser/tests/modules/entity_browser_test_configuration/entity_browser_test_configuration.info.yml
@@ -9,7 +9,7 @@ dependencies:
   - drupal:views
   - drupal:user
 
-# Information added by Drupal.org packaging script on 2023-12-11
-version: '8.x-2.10'
+# Information added by Drupal.org packaging script on 2024-08-11
+version: '8.x-2.11'
 project: 'entity_browser'
-datestamp: 1702325313
+datestamp: 1723378141
diff --git a/web/modules/entity_browser/tests/modules/entity_browser_test_entityqueue/entity_browser_test_entityqueue.info.yml b/web/modules/entity_browser/tests/modules/entity_browser_test_entityqueue/entity_browser_test_entityqueue.info.yml
index c7f895963c19e84efffe6204954f690d214e37ed..de41a44231d6d06b461ef612cdbbebd6047f61f7 100644
--- a/web/modules/entity_browser/tests/modules/entity_browser_test_entityqueue/entity_browser_test_entityqueue.info.yml
+++ b/web/modules/entity_browser/tests/modules/entity_browser_test_entityqueue/entity_browser_test_entityqueue.info.yml
@@ -9,7 +9,7 @@ dependencies:
   - entity_browser:entity_browser
   - entity_browser_test:entity_browser_test
 
-# Information added by Drupal.org packaging script on 2023-12-11
-version: '8.x-2.10'
+# Information added by Drupal.org packaging script on 2024-08-11
+version: '8.x-2.11'
 project: 'entity_browser'
-datestamp: 1702325313
+datestamp: 1723378141
diff --git a/web/modules/entity_browser/tests/modules/entity_browser_test_paragraphs/entity_browser_test_paragraphs.info.yml b/web/modules/entity_browser/tests/modules/entity_browser_test_paragraphs/entity_browser_test_paragraphs.info.yml
index 03b52a4690f0b306ec7a2161487032a0056f978e..cbfcfdf7f32735530214438cdc96804138658808 100644
--- a/web/modules/entity_browser/tests/modules/entity_browser_test_paragraphs/entity_browser_test_paragraphs.info.yml
+++ b/web/modules/entity_browser/tests/modules/entity_browser_test_paragraphs/entity_browser_test_paragraphs.info.yml
@@ -12,7 +12,7 @@ dependencies:
   - drupal:views
   - drupal:user
 
-# Information added by Drupal.org packaging script on 2023-12-11
-version: '8.x-2.10'
+# Information added by Drupal.org packaging script on 2024-08-11
+version: '8.x-2.11'
 project: 'entity_browser'
-datestamp: 1702325313
+datestamp: 1723378141
diff --git a/web/modules/entity_browser/tests/src/FunctionalJavascript/CardinalityTest.php b/web/modules/entity_browser/tests/src/FunctionalJavascript/CardinalityTest.php
index 95d8284fbf858cbfaf8252b7989163e25efb6639..affe8ee9e4c7e29ea5a780efd5b1a82f441f98ca 100644
--- a/web/modules/entity_browser/tests/src/FunctionalJavascript/CardinalityTest.php
+++ b/web/modules/entity_browser/tests/src/FunctionalJavascript/CardinalityTest.php
@@ -151,7 +151,6 @@ public function testEntityReferenceWidget() {
     $aragorn_checkbox->check();
     $gandolf_checkbox->check();
     $this->assertSession()->buttonExists('Select entities')->press();
-    $this->waitForAjaxToFinish();
     $this->assertSession()->pageTextContains('You can only select up to 2 items');
     // If we change the cardinality to 1, we should have radios.
     FieldStorageConfig::load('node.field_fellowship')
@@ -162,15 +161,19 @@ public function testEntityReferenceWidget() {
     $gollum_radio = $this->assertRadioExistsByValue('node:' . $gollum->id());
     $gollum_radio->click();
     $this->assertSession()->buttonExists('Select entities')->press();
+    $this->assertSession()->assertWaitOnAjaxRequest();
     $this->getSession()->switchToIFrame();
-    $this->waitForAjaxToFinish();
+
+    if (!$this->coreVersion('10.2')) {
+      $this->assertSession()->assertWaitOnAjaxRequest();
+    }
+
     // Assert the selected entity.
     $this->assertSession()->pageTextContains('Gollum');
     // Attempt to select more than one element.
     $this->assertSession()->buttonExists('Replace')->press();
     $this->waitForAjaxToFinish();
     $this->getSession()->switchToIFrame('entity_browser_iframe_cardinality');
-    $this->waitForAjaxToFinish();
     $gollum_radio = $this->assertRadioExistsByValue('node:' . $gollum->id());
     $gollum_radio->click();
     $gandolf_radio = $this->assertRadioExistsByValue('node:' . $gandolf->id());
@@ -187,7 +190,6 @@ public function testEntityReferenceWidget() {
     $this->assertSession()->buttonExists('Replace')->press();
     $this->waitForAjaxToFinish();
     $this->getSession()->switchToIFrame('entity_browser_iframe_cardinality');
-    $this->waitForAjaxToFinish();
 
     // Test that cardinality setting persists when using exposed filters form,
     // When applying the exposed filters, the radios should persist.
@@ -374,9 +376,7 @@ protected function openIframe() {
     $open_iframe_link = $this->assertSession()
       ->elementExists('css', 'a[data-drupal-selector="edit-field-fellowship-entity-browser-entity-browser-link"]');
     $open_iframe_link->click();
-    $this->waitForAjaxToFinish();
     $this->getSession()->switchToIFrame('entity_browser_iframe_cardinality');
-    $this->waitForAjaxToFinish();
   }
 
 }
diff --git a/web/modules/entity_browser/tests/src/FunctionalJavascript/ConfigurationTest.php b/web/modules/entity_browser/tests/src/FunctionalJavascript/ConfigurationTest.php
index 9d9d7056f8aeceba3b2736e5678e22065b2fcba0..913647174d0f94832d41ed411754a6012628f50f 100644
--- a/web/modules/entity_browser/tests/src/FunctionalJavascript/ConfigurationTest.php
+++ b/web/modules/entity_browser/tests/src/FunctionalJavascript/ConfigurationTest.php
@@ -73,7 +73,6 @@ public function testEntityBrowserEditForm() {
     $this->getSession()->executeScript("jQuery('.visually-hidden, .hidden').removeClass('visually-hidden hidden');");
     $this->assertSession()->fieldExists('name')->setValue('test_entity_browser');
     $this->assertSession()->selectExists('display')->selectOption('modal');
-    $this->assertSession()->assertWaitOnAjaxRequest();
     // Make sure fields in details elements are visible.
     $this->getSession()->executeScript("jQuery('details').attr('open', 'open');");
     $this->assertSession()->fieldExists('display_configuration[width]')->setValue('700');
diff --git a/web/modules/entity_browser/tests/src/FunctionalJavascript/EntityBrowserTest.php b/web/modules/entity_browser/tests/src/FunctionalJavascript/EntityBrowserTest.php
index f2bc3877df04998615f36d16304c3beb8a0c8425..e4355844a16a51439dcbc9c702f15c5c92a14257 100644
--- a/web/modules/entity_browser/tests/src/FunctionalJavascript/EntityBrowserTest.php
+++ b/web/modules/entity_browser/tests/src/FunctionalJavascript/EntityBrowserTest.php
@@ -412,7 +412,6 @@ public function testEntityBrowserWidgetContext() {
 
     // Open the entity browser widget form.
     $this->getSession()->getPage()->clickLink('Select entities');
-    $this->waitForAjaxToFinish();
     $this->getSession()->switchToIFrame('entity_browser_iframe_widget_context_default_value');
 
     // Check that only nodes of an allowed type are listed.
diff --git a/web/modules/entity_browser/tests/src/FunctionalJavascript/EntityBrowserViewsWidgetTest.php b/web/modules/entity_browser/tests/src/FunctionalJavascript/EntityBrowserViewsWidgetTest.php
index f6855944a940fc939d76df6ae5bd658265457343..ae1dab6ade41f4f5f3729ebf10621b47360bf907 100644
--- a/web/modules/entity_browser/tests/src/FunctionalJavascript/EntityBrowserViewsWidgetTest.php
+++ b/web/modules/entity_browser/tests/src/FunctionalJavascript/EntityBrowserViewsWidgetTest.php
@@ -71,7 +71,6 @@ public function testViewsWidget() {
     $this->assertSession()->pageTextContains('example.jpg');
     $this->assertSession()->fieldExists($field)->check();
     $this->assertSession()->buttonExists('Select entities')->press();
-    $this->assertSession()->assertWaitOnAjaxRequest();
     $this->assertSession()->responseNotContains('HTTP/1.0 200 OK');
     $this->assertSession()->responseNotContains('Cache-Control: no-cache, private');
     // Test that the response contains the selected entity.
diff --git a/web/modules/entity_browser/tests/src/FunctionalJavascript/EntityBrowserWebDriverTestBase.php b/web/modules/entity_browser/tests/src/FunctionalJavascript/EntityBrowserWebDriverTestBase.php
index ba2ad1b53cd7ff3f4e2f821a0c8c67bb7e646bc0..53e9a1b41ed0c90f2c9f0815325c68bf67ba4d00 100644
--- a/web/modules/entity_browser/tests/src/FunctionalJavascript/EntityBrowserWebDriverTestBase.php
+++ b/web/modules/entity_browser/tests/src/FunctionalJavascript/EntityBrowserWebDriverTestBase.php
@@ -301,4 +301,17 @@ protected function assertCheckboxNotExistsByValue($value) {
       ->elementNotExists('xpath', "//input[contains(@type, 'checkbox') and contains(@value, '" . $value . "')]");
   }
 
+  /**
+   * Checks the core version.
+   *
+   * @param string $version
+   *   The core version, for example 10.2.
+   *
+   * @return bool
+   *   Whether the core version is higher than the requested one.
+   */
+  protected  function coreVersion(string $version): bool {
+    return version_compare(\Drupal::VERSION, $version, '>=');
+  }
+
 }
diff --git a/web/modules/entity_browser/tests/src/FunctionalJavascript/EntityReferenceWidgetTest.php b/web/modules/entity_browser/tests/src/FunctionalJavascript/EntityReferenceWidgetTest.php
index 805958a52f7c8ef945ccbf5a99336d9b6587a531..c885a2ba018655ab7824597683d12edf5d8b14cc 100644
--- a/web/modules/entity_browser/tests/src/FunctionalJavascript/EntityReferenceWidgetTest.php
+++ b/web/modules/entity_browser/tests/src/FunctionalJavascript/EntityReferenceWidgetTest.php
@@ -97,9 +97,9 @@ public function testEntityReferenceWidget() {
     $this->drupalGet('/node/add/article');
     $this->assertSession()->fieldExists('title[0][value]')->setValue('Referencing node 1');
     $this->getSession()->switchToIFrame('entity_browser_iframe_test_entity_browser_iframe_node_view');
-    $this->waitForAjaxToFinish();
     $this->assertSession()->fieldExists('entity_browser_select[node:1]')->check();
     $this->assertSession()->buttonExists('Select entities')->press();
+    $this->waitForAjaxToFinish();
     $this->getSession()->switchToIFrame();
     $this->assertTrue($this->assertSession()->waitForText('Walrus'));
     $this->assertSession()->buttonExists('Save')->press();
@@ -229,26 +229,30 @@ public function testEntityReferenceWidget() {
     $replace_button->click();
     $this->waitForAjaxToFinish();
     $this->getSession()->switchToIFrame('entity_browser_iframe_test_entity_browser_iframe_node_view');
-    $this->waitForAjaxToFinish();
     $this->assertSession()->fieldExists('entity_browser_select[node:3]')->check();
     $this->assertSession()->buttonExists('Select entities')->press();
-    $this->getSession()->wait(1000);
-    $this->getSession()->switchToIFrame();
     $this->waitForAjaxToFinish();
+    $this->getSession()->switchToIFrame();
+
+    if (!$this->coreVersion('10.2')) {
+      $this->assertSession()->assertWaitOnAjaxRequest();
+    }
+
     // Even in the AJAX-built markup for the newly selected element, the replace
     // button should be there.
     $this->assertSession()->elementExists('css', 'input[data-drupal-selector="edit-field-entity-reference1-current-items-0-replace-button"]');
     // Adding a new node to the selection, however, should make it disappear.
     $open_iframe_link = $this->assertSession()->elementExists('css', 'a[data-drupal-selector="edit-field-entity-reference1-entity-browser-entity-browser-link"]');
     $open_iframe_link->click();
-    $this->waitForAjaxToFinish();
     $this->getSession()->switchToIFrame('entity_browser_iframe_test_entity_browser_iframe_node_view');
-    $this->waitForAjaxToFinish();
     $this->assertSession()->fieldExists('entity_browser_select[node:1]')->check();
     $this->assertSession()->buttonExists('Select entities')->press();
-    $this->getSession()->wait(1000);
-    $this->getSession()->switchToIFrame();
     $this->waitForAjaxToFinish();
+    $this->getSession()->switchToIFrame();
+
+    if (!$this->coreVersion('10.2')) {
+      $this->assertSession()->assertWaitOnAjaxRequest();
+    }
     $this->assertSession()->elementNotExists('css', 'input[data-drupal-selector="edit-field-entity-reference1-current-items-0-replace-button"]');
     $this->assertSession()->buttonExists('Save')->press();
     $this->assertSession()->pageTextContains('Article Referencing node 1 has been updated.');
@@ -259,14 +263,16 @@ public function testEntityReferenceWidget() {
     $this->assertSession()->fieldExists('title[0][value]')->setValue('Referencing node 2');
     $open_iframe_link = $this->assertSession()->elementExists('css', 'a[data-drupal-selector="edit-field-entity-reference1-entity-browser-entity-browser-link"]');
     $open_iframe_link->click();
-    $this->waitForAjaxToFinish();
     $this->getSession()->switchToIFrame('entity_browser_iframe_test_entity_browser_iframe_node_view');
-    $this->waitForAjaxToFinish();
     $this->assertSession()->fieldExists('entity_browser_select[node:1]')->check();
     $this->assertSession()->buttonExists('Select entities')->press();
-    $this->getSession()->wait(1000);
-    $this->getSession()->switchToIFrame();
     $this->waitForAjaxToFinish();
+    $this->getSession()->switchToIFrame();
+
+    if (!$this->coreVersion('10.2')) {
+      $this->assertSession()->assertWaitOnAjaxRequest();
+    }
+
     $this->assertSession()->elementContains('css', '#edit-field-entity-reference1-wrapper', 'Alpaca');
     // All three buttons should be visible.
     $this->assertSession()->elementExists('css', 'input[data-drupal-selector="edit-field-entity-reference1-current-items-0-remove-button"]');
@@ -277,12 +283,10 @@ public function testEntityReferenceWidget() {
     $replace_button->click();
     $this->waitForAjaxToFinish();
     $this->getSession()->switchToIFrame('entity_browser_iframe_test_entity_browser_iframe_node_view');
-    $this->waitForAjaxToFinish();
     $this->assertSession()->fieldExists('entity_browser_select[node:2]')->check();
     $this->assertSession()->buttonExists('Select entities')->press();
-    $this->getSession()->wait(1000);
-    $this->getSession()->switchToIFrame();
     $this->waitForAjaxToFinish();
+    $this->getSession()->switchToIFrame();
     $this->assertSession()->elementContains('css', '#edit-field-entity-reference1-wrapper', 'Referencing node 1');
 
     // Do the same as above but now with cardinality 2.
@@ -293,14 +297,16 @@ public function testEntityReferenceWidget() {
     $this->assertSession()->fieldExists('title[0][value]')->setValue('Referencing node 3');
     $open_iframe_link = $this->assertSession()->elementExists('css', 'a[data-drupal-selector="edit-field-entity-reference1-entity-browser-entity-browser-link"]');
     $open_iframe_link->click();
-    $this->waitForAjaxToFinish();
     $this->getSession()->switchToIFrame('entity_browser_iframe_test_entity_browser_iframe_node_view');
-    $this->waitForAjaxToFinish();
     $this->assertSession()->fieldExists('entity_browser_select[node:1]')->check();
     $this->assertSession()->buttonExists('Select entities')->press();
-    $this->getSession()->wait(1000);
-    $this->getSession()->switchToIFrame();
     $this->waitForAjaxToFinish();
+    $this->getSession()->switchToIFrame();
+
+    if (!$this->coreVersion('10.2')) {
+      $this->assertSession()->assertWaitOnAjaxRequest();
+    }
+
     $this->assertSession()->elementContains('css', '#edit-field-entity-reference1-wrapper', 'Alpaca');
     // All three buttons should be visible.
     $this->assertSession()->elementExists('css', 'input[data-drupal-selector="edit-field-entity-reference1-current-items-0-remove-button"]');
@@ -311,12 +317,15 @@ public function testEntityReferenceWidget() {
     $replace_button->click();
     $this->waitForAjaxToFinish();
     $this->getSession()->switchToIFrame('entity_browser_iframe_test_entity_browser_iframe_node_view');
-    $this->waitForAjaxToFinish();
     $this->assertSession()->fieldExists('entity_browser_select[node:2]')->check();
     $this->assertSession()->buttonExists('Select entities')->press();
-    $this->getSession()->wait(1000);
-    $this->getSession()->switchToIFrame();
     $this->waitForAjaxToFinish();
+    $this->getSession()->switchToIFrame();
+
+    if (!$this->coreVersion('10.2')) {
+      $this->assertSession()->assertWaitOnAjaxRequest();
+    }
+
     $this->assertSession()->elementContains('css', '#edit-field-entity-reference1-wrapper', 'Referencing node 1');
 
     // Verify that if the user cannot edit the entity, the "Edit" button does
@@ -327,13 +336,16 @@ public function testEntityReferenceWidget() {
     $this->drupalGet('node/add/article');
     $open_iframe_link = $this->assertSession()->elementExists('css', 'a[data-drupal-selector="edit-field-entity-reference1-entity-browser-entity-browser-link"]');
     $open_iframe_link->click();
-    $this->waitForAjaxToFinish();
     $this->getSession()->switchToIFrame('entity_browser_iframe_test_entity_browser_iframe_node_view');
-    $this->waitForAjaxToFinish();
     $this->assertSession()->fieldExists('entity_browser_select[node:1]')->check();
     $this->assertSession()->buttonExists('Select entities')->press();
-    $this->getSession()->switchToIFrame();
     $this->waitForAjaxToFinish();
+    $this->getSession()->switchToIFrame();
+
+    if (!$this->coreVersion('10.2')) {
+      $this->assertSession()->assertWaitOnAjaxRequest();
+    }
+
     $this->assertSession()->buttonNotExists('edit-field-entity-reference1-current-items-0-edit-button');
   }
 
@@ -481,11 +493,13 @@ public function testDragAndDrop() {
     $this->assertSession()->fieldExists('entity_browser_select[node:' . $daisy->id() . ']')->check();
     $this->assertSession()->fieldExists('entity_browser_select[node:' . $nick->id() . ']')->check();
     $this->assertSession()->buttonExists('Select entities')->press();
-    $this->waitForAjaxToFinish();
     $this->assertSession()->buttonExists('Use selected')->press();
-    $this->waitForAjaxToFinish();
+    $this->assertSession()->assertWaitOnAjaxRequest();
     $this->getSession()->switchToIFrame();
-    $this->waitForAjaxToFinish();
+
+    if (!$this->coreVersion('10.2')) {
+      $this->assertSession()->assertWaitOnAjaxRequest();
+    }
 
     $correct_order = [
       1 => 'Gatsby',
@@ -510,11 +524,13 @@ public function testDragAndDrop() {
     $this->assertSession()->fieldExists('entity_browser_select[node:' . $easter_bunny->id() . ']')->check();
     $this->assertSession()->fieldExists('entity_browser_select[node:' . $pumpkin_king->id() . ']')->check();
     $this->assertSession()->buttonExists('Select entities')->press();
-    $this->waitForAjaxToFinish();
     $this->assertSession()->buttonExists('Use selected')->press();
     $this->waitForAjaxToFinish();
     $this->getSession()->switchToIFrame();
-    $this->waitForAjaxToFinish();
+
+    if (!$this->coreVersion('10.2')) {
+      $this->assertSession()->assertWaitOnAjaxRequest();
+    }
 
     // Close details 2.
     $this->assertSession()->elementExists('xpath', '(//summary)[2]')->click();
@@ -527,7 +543,6 @@ public function testDragAndDrop() {
     $item_selector = "$list_selector .item-container";
     $assert_session->elementsCount('css', $item_selector, 3);
     $this->sortableAfter("$item_selector:first-child", "$item_selector:nth-child(2)", $list_selector);
-    $this->waitForAjaxToFinish();
 
     $this->assertSession()->fieldExists('title[0][value]')->setValue('Hello World');
 
diff --git a/web/modules/entity_browser/tests/src/FunctionalJavascript/ImageFieldTest.php b/web/modules/entity_browser/tests/src/FunctionalJavascript/ImageFieldTest.php
index af0639b8299cdbc43dcf19cc092e07bb779c2808..a9ed2b967175cfdca9c4875b0b1272ad12edd5e8 100644
--- a/web/modules/entity_browser/tests/src/FunctionalJavascript/ImageFieldTest.php
+++ b/web/modules/entity_browser/tests/src/FunctionalJavascript/ImageFieldTest.php
@@ -131,14 +131,13 @@ public function testImageFieldUsage() {
     $this->getSession()->switchToIFrame('entity_browser_iframe_test_entity_browser_iframe_view');
     $this->getSession()->getPage()->checkField('entity_browser_select[file:' . $this->image->id() . ']');
     $this->getSession()->getPage()->pressButton('Select entities');
-    $this->waitForAjaxToFinish();
     $button = $this->assertSession()->waitForButton('Use selected');
     $this->assertSession()->pageTextContains('example.jpg');
     $button->press();
+    $this->waitForAjaxToFinish();
 
     // Switch back to the main page.
     $this->getSession()->switchToIFrame();
-    $this->waitForAjaxToFinish();
     // Check if the image thumbnail exists.
     $this->assertSession()
       ->waitForElementVisible('xpath', '//tr[@data-drupal-selector="edit-field-image-current-1"]');
@@ -222,7 +221,6 @@ public function testImageFieldSettings() {
     // to allow png but the field widget is configured to allow jpg, so we
     // expect the field to override the widget.
     $this->getSession()->getPage()->attachFileToField('files[upload][]', $file_wrong_type);
-    $this->waitForAjaxToFinish();
     if (version_compare(\Drupal::VERSION, '8.7', '>=')) {
       $this->assertSession()->responseContains('Only files with the following extensions are allowed: <em class="placeholder">jpg</em>.');
       $this->assertSession()->responseContains('The selected file <em class="placeholder">druplicon.png</em> cannot be uploaded.');
@@ -239,14 +237,17 @@ public function testImageFieldSettings() {
     $this->getSession()->getPage()->attachFileToField('files[upload][]', $file_just_right);
     $this->waitForAjaxToFinish();
     $this->getSession()->getPage()->pressButton('Select files');
-    $this->waitForAjaxToFinish();
     $button = $this->assertSession()->waitForButton('Use selected');
     $this->assertSession()->pageTextContains('image-test.jpg');
     $button->press();
     $this->waitForAjaxToFinish();
     // Check that the file has uploaded to the correct sub-directory.
     $this->getSession()->switchToIFrame();
-    $this->waitForAjaxToFinish();
+
+    if (!$this->coreVersion('10.2')) {
+      $this->assertSession()->assertWaitOnAjaxRequest();
+    }
+
     $entity_id = $this->getSession()->evaluateScript('jQuery("#edit-field-image-wrapper [data-entity-id]").data("entity-id")');
     $this->assertStringStartsWith('file:', $entity_id);
     /** @var \Drupal\file\Entity\File $file */
diff --git a/web/modules/entity_browser/tests/src/FunctionalJavascript/InlineEntityFormTest.php b/web/modules/entity_browser/tests/src/FunctionalJavascript/InlineEntityFormTest.php
index 3ede7bf7197339d17da4e314de9e8e9b80afff0e..ff332bcd788881abf51b07a545d703df4a284a5b 100644
--- a/web/modules/entity_browser/tests/src/FunctionalJavascript/InlineEntityFormTest.php
+++ b/web/modules/entity_browser/tests/src/FunctionalJavascript/InlineEntityFormTest.php
@@ -76,11 +76,9 @@ public function testEntityBrowserInsideInlineEntityForm() {
     $page->checkField('entity_browser_select[file:2]');
 
     $page->pressButton('Select entities');
-    $this->assertSession()->assertWaitOnAjaxRequest();
 
     $page->pressButton('Use selected');
     $this->getSession()->switchToIFrame();
-    $this->assertSession()->assertWaitOnAjaxRequest();
 
     $page->pressButton('Create Test File Media');
     $this->assertSession()->assertWaitOnAjaxRequest();
@@ -134,11 +132,9 @@ public function testEntityBrowserInsideInlineEntityForm() {
     $page->checkField('entity_browser_select[file:3]');
 
     $page->pressButton('Select entities');
-    $this->assertSession()->assertWaitOnAjaxRequest();
-
     $page->pressButton('Use selected');
-    $this->getSession()->switchToIFrame();
     $this->assertSession()->assertWaitOnAjaxRequest();
+    $this->getSession()->switchToIFrame();
 
     $page->pressButton('Update Test File Media');
     $this->assertSession()->assertWaitOnAjaxRequest();
@@ -162,11 +158,10 @@ public function testEntityBrowserInsideInlineEntityForm() {
     $list_selector = '[data-drupal-selector="edit-selected"]';
     $item_selector = "$list_selector .item-container";
     $this->sortableAfter("$item_selector:first-child", "$item_selector:last-child", $list_selector);
-    $this->assertSession()->assertWaitOnAjaxRequest();
 
     $page->pressButton('Use selected');
-    $this->getSession()->switchToIFrame();
     $this->assertSession()->assertWaitOnAjaxRequest();
+    $this->getSession()->switchToIFrame();
 
     $page->pressButton('Update Test File Media');
     $this->assertSession()->assertWaitOnAjaxRequest();
@@ -186,14 +181,12 @@ public function testEntityBrowserInsideInlineEntityForm() {
 
     $this->getSession()
       ->switchToIFrame('entity_browser_iframe_ief_entity_browser_file');
-    $this->assertSession()->assertWaitOnAjaxRequest();
 
     $page->pressButton('remove_3_0');
-    $this->assertSession()->assertWaitOnAjaxRequest();
 
     $page->pressButton('Use selected');
-    $this->getSession()->switchToIFrame();
     $this->assertSession()->assertWaitOnAjaxRequest();
+    $this->getSession()->switchToIFrame();
 
     $page->pressButton('Update Test File Media');
     $this->assertSession()->assertWaitOnAjaxRequest();
@@ -387,10 +380,13 @@ public function testEntityFormReferenceFormValidate() {
       $this->getSession()->switchToIFrame('entity_browser_iframe_widget_context_default_value');
       $this->assertSession()->fieldExists('entity_browser_select[node:' . $boxer->id() . ']')->check();
       $this->assertSession()->buttonExists('Select entities')->press();
-      $this->assertSession()->assertWaitOnAjaxRequest();
       $this->assertSession()->buttonExists('Use selected')->press();
-      $this->getSession()->switchToIFrame();
       $this->assertSession()->assertWaitOnAjaxRequest();
+      $this->getSession()->switchToIFrame();
+
+      if (!$this->coreVersion('10.2')) {
+        $this->assertSession()->assertWaitOnAjaxRequest();
+      }
     }
 
     $this->assertSession()->pageTextContains('The selected node has already been added.');
@@ -399,10 +395,13 @@ public function testEntityFormReferenceFormValidate() {
     $this->getSession()->switchToIFrame('entity_browser_iframe_widget_context_default_value');
     $this->assertSession()->fieldExists('entity_browser_select[node:' . $napoleon->id() . ']')->check();
     $this->assertSession()->buttonExists('Select entities')->press();
-    $this->assertSession()->assertWaitOnAjaxRequest();
     $this->assertSession()->buttonExists('Use selected')->press();
-    $this->getSession()->switchToIFrame();
     $this->assertSession()->assertWaitOnAjaxRequest();
+    $this->getSession()->switchToIFrame();
+
+    if (!$this->coreVersion('10.2')) {
+      $this->assertSession()->assertWaitOnAjaxRequest();
+    }
 
     $this->assertSession()->pageTextNotContains('The selected node has already been added.');
 
diff --git a/web/modules/entity_browser/tests/src/FunctionalJavascript/MultiStepSelectionDisplayTest.php b/web/modules/entity_browser/tests/src/FunctionalJavascript/MultiStepSelectionDisplayTest.php
index 9f3162c647dbe1839cb0a081072cc069494b5a3e..43e41d21450c8841ec01a011726063c5ebb861e5 100644
--- a/web/modules/entity_browser/tests/src/FunctionalJavascript/MultiStepSelectionDisplayTest.php
+++ b/web/modules/entity_browser/tests/src/FunctionalJavascript/MultiStepSelectionDisplayTest.php
@@ -20,7 +20,6 @@ protected function openEntityBrowser() {
     $this->getSession()->getPage()->clickLink('Select entities');
     $this->getSession()
       ->switchToIFrame('entity_browser_iframe_test_entity_browser_file');
-    $this->waitForAjaxToFinish();
   }
 
   /**
@@ -55,7 +54,6 @@ protected function clickViewEntity($entityId) {
    * It's related to: Drupal.entityBrowserCommandQueue.executeCommands
    */
   protected function waitSelectionDisplayAjaxCommands() {
-    $this->waitForAjaxToFinish();
     $this->getSession()->wait(200);
     $this->waitForAjaxToFinish();
   }
diff --git a/web/modules/entity_browser/tests/src/FunctionalJavascript/PluginsTest.php b/web/modules/entity_browser/tests/src/FunctionalJavascript/PluginsTest.php
index 4903d2d3f74f54195efb7af7737c025957079c52..89b7332ab377cce432518e50e9762e35df0b7ab1 100644
--- a/web/modules/entity_browser/tests/src/FunctionalJavascript/PluginsTest.php
+++ b/web/modules/entity_browser/tests/src/FunctionalJavascript/PluginsTest.php
@@ -167,14 +167,18 @@ public function testIframeDisplayPlugin() {
 
     $this->assertSession()->waitForField('entity_browser_select[file:' . $unicorn_image->id() . ']')->check();
     $this->getSession()->getPage()->pressButton('Select entities');
-    $this->assertSession()->assertWaitOnAjaxRequest();
     $this->assertSession()
       ->waitForElement('css', '#edit-selected-items-2-1-remove-button');
     $this->assertSession()
       ->waitForElement('css', '#edit-selected-items-1-0-remove-button');
     $this->getSession()->getPage()->pressButton('Use selected');
-    $this->getSession()->switchToIFrame();
     $this->assertSession()->assertWaitOnAjaxRequest();
+    $this->getSession()->switchToIFrame();
+
+    if (!$this->coreVersion('10.2')) {
+      $this->assertSession()->assertWaitOnAjaxRequest();
+    }
+
     $this->assertSession()->pageTextContains('dragon_0.jpg');
     $this->assertSession()->pageTextContains('unicorn.jpg');
   }
diff --git a/web/modules/entity_browser/tests/src/Kernel/Extension/EntityBrowserTest.php b/web/modules/entity_browser/tests/src/Kernel/Extension/EntityBrowserTest.php
index 0e0b4925174100a0b0c8b192d84777d9b1ed89db..4d21b659d7496429df283b5153df74b00b377b3d 100644
--- a/web/modules/entity_browser/tests/src/Kernel/Extension/EntityBrowserTest.php
+++ b/web/modules/entity_browser/tests/src/Kernel/Extension/EntityBrowserTest.php
@@ -286,11 +286,17 @@ public function testDynamicPermissions() {
         ->translate('Access pages that %browser uses to operate.', ['%browser' => $entity->label()])
         ->render(),
       'provider' => 'entity_browser',
+      'dependencies' => [
+        'config' => [
+          'entity_browser.browser.test',
+        ],
+      ],
     ];
 
     $this->assertSame($permissions[$expected_permission_name]['title']->render(), $expected_permission['title'], 'Dynamically generated permission title found.');
     $this->assertSame($permissions[$expected_permission_name]['description']->render(), $expected_permission['description'], 'Dynamically generated permission description found.');
     $this->assertSame($permissions[$expected_permission_name]['provider'], $expected_permission['provider'], 'Dynamically generated permission provider found.');
+    $this->assertSame($permissions[$expected_permission_name]['dependencies'], $expected_permission['dependencies'], 'Dynamically generated permission dependencies found.');
   }
 
   /**
diff --git a/web/modules/recaptcha/js/recaptcha.js b/web/modules/recaptcha/js/recaptcha.js
new file mode 100644
index 0000000000000000000000000000000000000000..aa290926b6f4b240593fa1f22ac08c594cda1c3f
--- /dev/null
+++ b/web/modules/recaptcha/js/recaptcha.js
@@ -0,0 +1,36 @@
+/**
+ * @file
+ * Contains the definition of the behaviour recaptcha.
+ */
+
+(function ($, Drupal) {
+  Drupal.behaviors.recaptcha = {
+    attach(context) {
+      $('.g-recaptcha', context).each(function () {
+        if (
+          typeof grecaptcha === 'undefined' ||
+          typeof grecaptcha.render !== 'function'
+        ) {
+          return;
+        }
+        if ($(this).closest('body').length > 0) {
+          if ($(this).hasClass('recaptcha-processed')) {
+            grecaptcha.reset();
+          } else {
+            grecaptcha.render(this, $(this).data());
+            $(this).addClass('recaptcha-processed');
+          }
+        }
+      });
+    },
+  };
+
+  window.drupalRecaptchaOnload = function () {
+    $('.g-recaptcha').each(function () {
+      if (!$(this).hasClass('recaptcha-processed')) {
+        grecaptcha.render(this, $(this).data());
+        $(this).addClass('recaptcha-processed');
+      }
+    });
+  };
+})(jQuery, Drupal);
diff --git a/web/modules/recaptcha/recaptcha.info.yml b/web/modules/recaptcha/recaptcha.info.yml
index 9919be3c402c29b443e2bdba7830bcad3e22c45d..52e4dc2a357ef7b607c51290e0553170db54d862 100644
--- a/web/modules/recaptcha/recaptcha.info.yml
+++ b/web/modules/recaptcha/recaptcha.info.yml
@@ -7,7 +7,7 @@ configure: recaptcha.admin_settings_form
 dependencies:
   - captcha:captcha
 
-# Information added by Drupal.org packaging script on 2024-07-12
-version: '8.x-3.3'
+# Information added by Drupal.org packaging script on 2024-08-13
+version: '8.x-3.4'
 project: 'recaptcha'
-datestamp: 1720755551
+datestamp: 1723563037
diff --git a/web/modules/recaptcha/recaptcha.libraries.yml b/web/modules/recaptcha/recaptcha.libraries.yml
new file mode 100644
index 0000000000000000000000000000000000000000..7471b37cc9397cffe790bf73c8317ee5b2ef76cd
--- /dev/null
+++ b/web/modules/recaptcha/recaptcha.libraries.yml
@@ -0,0 +1,6 @@
+recaptcha:
+  js:
+    js/recaptcha.js: {}
+  dependencies:
+    - core/drupal
+    - core/jquery
diff --git a/web/modules/recaptcha/recaptcha.module b/web/modules/recaptcha/recaptcha.module
index ba9d5bd9d00d60432041d8c9dc07b7b07980c9ff..b922edbe01032a21ce93c80bcde71507b46e962e 100644
--- a/web/modules/recaptcha/recaptcha.module
+++ b/web/modules/recaptcha/recaptcha.module
@@ -81,16 +81,14 @@ function recaptcha_captcha($op, $captcha_type = '') {
           // captcha type can be displayed on cached pages.
           $captcha['cacheable'] = TRUE;
 
-          // Check if reCAPTCHA use globally is enabled.
-          $recaptcha_src = 'https://www.google.com/recaptcha/api.js';
-          $recaptcha_src_fallback = 'https://www.google.com/recaptcha/api/fallback';
-          if ($recaptcha_use_globally) {
-            $recaptcha_src = 'https://www.recaptcha.net/recaptcha/api.js';
-            $recaptcha_src_fallback = 'https://www.recaptcha.net/recaptcha/api/fallback';
-          }
-
           $noscript = '';
           if ($config->get('widget.noscript')) {
+            // Check if reCAPTCHA use globally is enabled.
+            $recaptcha_src_fallback = 'https://www.google.com/recaptcha/api/fallback';
+            if ($recaptcha_use_globally) {
+              $recaptcha_src_fallback = 'https://www.recaptcha.net/recaptcha/api/fallback';
+            }
+
             $recaptcha_widget_noscript = [
               '#theme' => 'recaptcha_widget_noscript',
               '#widget' => [
@@ -116,28 +114,15 @@ function recaptcha_captcha($op, $captcha_type = '') {
             '#markup' => '<div' . new Attribute($attributes) . '></div>',
             '#suffix' => $noscript,
             '#attached' => [
-              'html_head' => [
-                [
-                  [
-                    '#tag' => 'script',
-                    '#attributes' => [
-                      'src' => Url::fromUri(
-                        $recaptcha_src,
-                        [
-                          'query' => [
-                            'hl' => \Drupal::service('language_manager')->getCurrentLanguage()->getId(),
-                          ],
-                          'absolute' => TRUE,
-                        ]
-                      )->toString(),
-                      'async' => TRUE,
-                      'defer' => TRUE,
-                    ],
-                  ],
-                  'recaptcha_api',
-                ],
+              'library' => [
+                'recaptcha/recaptcha',
+                'recaptcha/google.recaptcha_' . \Drupal::service('language_manager')->getCurrentLanguage()->getId(),
               ],
             ],
+            '#cache' => [
+              'tags' => ['library_info'],
+              'contexts' => ['languages'],
+            ],
           ];
         }
         else {
@@ -152,6 +137,46 @@ function recaptcha_captcha($op, $captcha_type = '') {
   }
 }
 
+/**
+ * Implements hook_library_info_build().
+ */
+function recaptcha_library_info_build() {
+  $libraries = [];
+  $languages = \Drupal::service('language_manager')->getLanguages();
+  $config = \Drupal::config('recaptcha.settings');
+  $use_globally = $config->get('use_globally');
+  $recaptcha_src = 'https://www.google.com/recaptcha/api.js';
+  if ($use_globally) {
+    $recaptcha_src = 'https://www.recaptcha.net/recaptcha/api.js';
+  }
+
+  foreach ($languages as $lang => $language) {
+    $url = Url::fromUri($recaptcha_src, [
+      'query' => [
+        'hl' => $lang,
+        'render' => 'explicit',
+        'onload' => 'drupalRecaptchaOnload',
+      ],
+      'absolute' => TRUE,
+    ])->toString();
+    $libraries['google.recaptcha_' . $lang] = [
+      'version' => '1.x',
+      'header' => TRUE,
+      'js' => [
+        $url => [
+          'type' => 'external',
+          'minified' => TRUE,
+          'attributes' => [
+            'async' => TRUE,
+            'defer' => TRUE,
+          ],
+        ],
+      ],
+    ];
+  }
+  return $libraries;
+}
+
 /**
  * CAPTCHA Callback; Validates the reCAPTCHA code.
  */
@@ -228,12 +253,11 @@ function recaptcha_captcha_validation($solution, $response, $element, $form_stat
 function template_preprocess_recaptcha_widget_noscript(&$variables) {
   $variables['sitekey'] = $variables['widget']['sitekey'];
   $variables['language'] = $variables['widget']['language'];
-  $options = [
+  $variables['url'] = Url::fromUri($variables['widget']['recaptcha_src_fallback'], [
     'query' => [
       'k' => $variables['widget']['sitekey'],
       'hl' => $variables['widget']['language'],
     ],
     'absolute' => TRUE,
-  ];
-  $variables['url'] = Url::fromUri($variables['widget']['recaptcha_src_fallback'], $options)->toString();
+  ])->toString();
 }
diff --git a/web/modules/recaptcha/recaptcha.services.yml b/web/modules/recaptcha/recaptcha.services.yml
index 631b428dcda3c95c8af69aa0997050ad40dd39ad..b001088fc939c19a5cbe59e72693b53e3d46f8ac 100644
--- a/web/modules/recaptcha/recaptcha.services.yml
+++ b/web/modules/recaptcha/recaptcha.services.yml
@@ -1,4 +1,9 @@
 services:
+  recaptcha.config_subscriber:
+    class: Drupal\recaptcha\EventSubscriber\RecaptchaSettingsConfigSubscriber
+    arguments: ['@cache_tags.invalidator']
+    tags:
+      - { name: event_subscriber }
   recaptcha.drupal8post:
     class: Drupal\recaptcha\ReCaptcha\RequestMethod\Drupal8Post
     arguments: ['@http_client']
diff --git a/web/modules/recaptcha/src/EventSubscriber/RecaptchaSettingsConfigSubscriber.php b/web/modules/recaptcha/src/EventSubscriber/RecaptchaSettingsConfigSubscriber.php
new file mode 100644
index 0000000000000000000000000000000000000000..09c5ade386dc7142371d8c8e5989910e9056256e
--- /dev/null
+++ b/web/modules/recaptcha/src/EventSubscriber/RecaptchaSettingsConfigSubscriber.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace Drupal\recaptcha\EventSubscriber;
+
+use Drupal\Core\Cache\CacheTagsInvalidatorInterface;
+use Drupal\Core\Config\ConfigCrudEvent;
+use Drupal\Core\Config\ConfigEvents;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+/**
+ * The recaptcha settings config subscriber.
+ *
+ * A subscriber rebuilding the library info when the "use_globally" setting is
+ * updated.
+ */
+class RecaptchaSettingsConfigSubscriber implements EventSubscriberInterface {
+
+  /**
+   * The cache tags invalidator.
+   *
+   * @var \Drupal\Core\Cache\CacheTagsInvalidatorInterface
+   */
+  protected $cacheTagsInvalidator;
+
+  /**
+   * Constructs a RecaptchaSettingsConfigSubscriber object.
+   *
+   * @param \Drupal\Core\Cache\CacheTagsInvalidatorInterface $cache_tags_invalidator
+   *   The cache tags invalidator.
+   */
+  public function __construct(CacheTagsInvalidatorInterface $cache_tags_invalidator) {
+    $this->cacheTagsInvalidator = $cache_tags_invalidator;
+  }
+
+  /**
+   * Invalidates the library_info tag.
+   *
+   * Invalidates the library_info tag when the value of recaptcha.settings
+   * use_globally is changed.
+   *
+   * @param \Drupal\Core\Config\ConfigCrudEvent $event
+   *   The Event to process.
+   */
+  public function onSave(ConfigCrudEvent $event) {
+    if ($event->getConfig()->getName() === 'recaptcha.settings') {
+      if ($event->isChanged('use_globally')) {
+        $this->cacheTagsInvalidator->invalidateTags(['library_info']);
+      }
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getSubscribedEvents() {
+    $events[ConfigEvents::SAVE][] = ['onSave'];
+    return $events;
+  }
+
+}
diff --git a/web/modules/recaptcha/tests/modules/recaptcha_test/config/install/captcha.captcha_point.recaptcha_test_ajax_form.yml b/web/modules/recaptcha/tests/modules/recaptcha_test/config/install/captcha.captcha_point.recaptcha_test_ajax_form.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b2a4951b926f20fb6de9fb75f6486eda69b4a730
--- /dev/null
+++ b/web/modules/recaptcha/tests/modules/recaptcha_test/config/install/captcha.captcha_point.recaptcha_test_ajax_form.yml
@@ -0,0 +1,9 @@
+langcode: en
+status: true
+formId: recaptcha_test_ajax_form
+captchaType: recaptcha/reCAPTCHA
+label: recaptcha_test_ajax_form
+dependencies:
+  enforced:
+    module:
+      - recaptcha_test
diff --git a/web/modules/recaptcha/tests/modules/recaptcha_test/recaptcha_test.info.yml b/web/modules/recaptcha/tests/modules/recaptcha_test/recaptcha_test.info.yml
new file mode 100644
index 0000000000000000000000000000000000000000..141a870a114891416389f0e73e268c700fbaf6ae
--- /dev/null
+++ b/web/modules/recaptcha/tests/modules/recaptcha_test/recaptcha_test.info.yml
@@ -0,0 +1,12 @@
+name: 'reCAPTCHA Test'
+type: module
+description: 'Test module for the recaptcha module.'
+package: Testing
+core_version_requirement: ^8.9 || ^9 || ^10
+dependencies:
+  - fences:recaptcha
+
+# Information added by Drupal.org packaging script on 2024-08-13
+version: '8.x-3.4'
+project: 'recaptcha'
+datestamp: 1723563037
diff --git a/web/modules/recaptcha/tests/modules/recaptcha_test/recaptcha_test.routing.yml b/web/modules/recaptcha/tests/modules/recaptcha_test/recaptcha_test.routing.yml
new file mode 100644
index 0000000000000000000000000000000000000000..04c6ddc66dbbf668583639d84f98422bb754c6ab
--- /dev/null
+++ b/web/modules/recaptcha/tests/modules/recaptcha_test/recaptcha_test.routing.yml
@@ -0,0 +1,26 @@
+recaptcha_test.page:
+  path: '/recaptcha-test'
+  defaults:
+    _controller: '\Drupal\recaptcha_test\Controller\RecaptchaTestAjaxFormController::button'
+    _title: 'reCAPTCHA Test Ajax Page'
+  requirements:
+    # This route is only meant for testing purposes, no permission check needed:
+    _access: 'TRUE'
+
+recaptcha_test.ajax:
+  path: '/recaptcha-test/ajax'
+  defaults:
+    _controller: '\Drupal\recaptcha_test\Controller\RecaptchaTestAjaxFormController::ajaxForm'
+    _title: 'reCAPTCHA Test Ajax Controller'
+  requirements:
+    # This route is only meant for testing purposes, no permission check needed:
+    _access: 'TRUE'
+
+recaptcha_test.form:
+  path: '/recaptcha-test/form'
+  defaults:
+    _form: '\Drupal\recaptcha_test\Form\RecaptchaTestAjaxForm'
+    _title: 'reCAPTCHA Test Ajax Form'
+  requirements:
+    # This route is only meant for testing purposes, no permission check needed:
+    _access: 'TRUE'
diff --git a/web/modules/recaptcha/tests/modules/recaptcha_test/src/Controller/RecaptchaTestAjaxFormController.php b/web/modules/recaptcha/tests/modules/recaptcha_test/src/Controller/RecaptchaTestAjaxFormController.php
new file mode 100644
index 0000000000000000000000000000000000000000..ac7f63b00eee95fb850bbb22c8ac15e3758a3850
--- /dev/null
+++ b/web/modules/recaptcha/tests/modules/recaptcha_test/src/Controller/RecaptchaTestAjaxFormController.php
@@ -0,0 +1,79 @@
+<?php
+
+namespace Drupal\recaptcha_test\Controller;
+
+use Drupal\Core\Ajax\AjaxResponse;
+use Drupal\Core\Ajax\ReplaceCommand;
+use Drupal\Core\Controller\ControllerBase;
+use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
+use Drupal\Core\Form\FormBuilderInterface;
+use Drupal\Core\Url;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Recaptcha test AJAX form controller.
+ */
+class RecaptchaTestAjaxFormController extends ControllerBase implements ContainerInjectionInterface {
+
+  /**
+   * Constructor for form builder.
+   */
+  public function __construct(FormBuilderInterface $form_builder) {
+    $this->formBuilder = $form_builder;
+  }
+
+  /**
+   * Container creation method.
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('form_builder')
+    );
+  }
+
+  /**
+   * Button rendering method.
+   */
+  public function button() {
+    $output = [];
+
+    $output['container'] = [
+      '#type' => 'container',
+      '#attributes' => [
+        'id' => 'recaptcha-test-container',
+      ],
+    ];
+
+    $url = Url::fromRoute('recaptcha_test.ajax', []);
+
+    $output['container']['ajax_link'] = [
+      '#id' => 'load-ajax-form',
+      '#type' => 'link',
+      '#title' => $this->t('Load Ajax Form'),
+      '#url' => $url,
+      '#attributes' => [
+        'class' => ['use-ajax', 'button', 'secondary', 'btn', 'btn-secondary'],
+      ],
+    ];
+
+    $output['#attached']['library'][] = 'core/drupal.ajax';
+
+    // @see https://api.drupal.org/api/drupal/core%21core.api.php/group/ajax/8.2.x
+    return $output;
+  }
+
+  /**
+   * Ajax callback returning a form.
+   *
+   * @return \Drupal\Core\Ajax\AjaxResponse
+   *   The AJAX response.
+   */
+  public function ajaxForm() {
+    $form = $this->formBuilder->getForm('Drupal\recaptcha_test\Form\RecaptchaTestAjaxForm');
+
+    $ajax = new AjaxResponse();
+    $ajax->addCommand(new ReplaceCommand('#recaptcha-test-container', $form));
+    return $ajax;
+  }
+
+}
diff --git a/web/modules/recaptcha/tests/modules/recaptcha_test/src/Form/RecaptchaTestAjaxForm.php b/web/modules/recaptcha/tests/modules/recaptcha_test/src/Form/RecaptchaTestAjaxForm.php
new file mode 100644
index 0000000000000000000000000000000000000000..bd0ecf2c1f52a7fa13139e86a187f62ca8e23bff
--- /dev/null
+++ b/web/modules/recaptcha/tests/modules/recaptcha_test/src/Form/RecaptchaTestAjaxForm.php
@@ -0,0 +1,79 @@
+<?php
+
+namespace Drupal\recaptcha_test\Form;
+
+use Drupal\Core\Form\FormBase;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+
+/**
+ * Recaptcha test AJAX form class.
+ */
+class RecaptchaTestAjaxForm extends FormBase {
+
+  use StringTranslationTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormId() {
+    return 'recaptcha_test_ajax_form';
+  }
+
+  /**
+   * Build form method for RecaptchaTestAjaxForm.
+   */
+  public function buildForm(array $form, FormStateInterface $form_state) {
+    $form = [];
+
+    $form['messages'] = [
+      '#type' => 'status_messages',
+    ];
+
+    $form['email'] = [
+      '#type' => 'email',
+      '#title' => $this->t('Email'),
+      '#required' => TRUE,
+    ];
+
+    $form['submit'] = [
+      '#type' => 'submit',
+      '#value' => $this->t('Submit'),
+      '#validate' => ['::validateForm'],
+      '#ajax' => [
+        'callback' => '::ajaxCallback',
+        'wrapper' => 'recaptcha-test-ajax-form-wrapper',
+      ],
+    ];
+
+    $form['#prefix'] = '<div id="recaptcha-test-ajax-form-wrapper">';
+    $form['#suffix'] = '</div>';
+    return $form;
+  }
+
+  /**
+   * Ajax callback method for form.
+   */
+  public function ajaxCallback(array &$form, FormStateInterface $form_state) {
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validateForm(array &$form, FormStateInterface $form_state) {
+    $email = $form_state->getValue('email');
+    if ($email == 'invalid@example.com') {
+      $form_state->setError($form['email'], 'Invalid email');
+    }
+
+  }
+
+  /**
+   * Form submission method.
+   */
+  public function submitForm(array &$form, FormStateInterface $form_state) {
+    $this->messenger()->addStatus('Form submit successful.');
+  }
+
+}
diff --git a/web/modules/recaptcha/tests/src/Functional/ReCaptchaBasicTest.php b/web/modules/recaptcha/tests/src/Functional/ReCaptchaBasicTest.php
index eaef46d804aa8680c7ef2b30a1b799c3ccf0f886..6311bd7a70c215aa8222a755bd7658ddb364690f 100644
--- a/web/modules/recaptcha/tests/src/Functional/ReCaptchaBasicTest.php
+++ b/web/modules/recaptcha/tests/src/Functional/ReCaptchaBasicTest.php
@@ -115,20 +115,22 @@ public function testReCaptchaAdminSettingsForm() {
   public function testReCaptchaOnLoginForm() {
     $site_key = $this->randomMachineName(40);
     $secret_key = $this->randomMachineName(40);
-    $grecaptcha = '<div class="g-recaptcha" data-sitekey="' . $site_key . '" data-theme="light" data-type="image"></div>';
+    $grecaptchaSelector = "div.g-recaptcha[data-sitekey=$site_key][data-theme=light][data-type=image]";
 
     // Test if login works.
     $this->drupalLogin($this->normalUser);
     $this->drupalLogout();
 
     $this->drupalGet('user/login');
-    $this->assertSession()->responseNotContains($grecaptcha);
+    // reCAPTCHA is not shown on form.
+    $this->assertSession()->elementNotExists('css', $grecaptchaSelector);
 
     // Enable 'captcha/Math' CAPTCHA on login form.
     captcha_set_form_id_setting('user_login_form', 'captcha/Math');
 
     $this->drupalGet('user/login');
-    $this->assertSession()->responseNotContains($grecaptcha);
+    // reCAPTCHA is not shown on form.
+    $this->assertSession()->elementNotExists('css', $grecaptchaSelector);
 
     // Enable 'recaptcha/reCAPTCHA' on login form.
     captcha_set_form_id_setting('user_login_form', 'recaptcha/reCAPTCHA');
@@ -148,21 +150,26 @@ public function testReCaptchaOnLoginForm() {
 
     // Check if there is a reCAPTCHA on the login form.
     $this->drupalGet('user/login');
-    $this->assertSession()->responseContains($grecaptcha);
-    $options_2 = [
+    // reCAPTCHA is shown on form.
+    $this->assertSession()->elementExists('css', $grecaptchaSelector);
+    $options = [
       'query' => [
         'hl' => \Drupal::service('language_manager')->getCurrentLanguage()->getId(),
+        'render' => 'explicit',
+        'onload' => 'drupalRecaptchaOnload',
       ],
       'absolute' => TRUE,
     ];
-    $this->assertSession()->responseContains('<script src="' . Url::fromUri('https://www.google.com/recaptcha/api.js', $options_2)->toString() . '" async defer></script>');
-    $this->assertSession()->responseNotContains($grecaptcha . '<noscript>');
+    $this->assertSession()->responseContains(Html::escape(Url::fromUri('https://www.google.com/recaptcha/api.js', $options)->toString()));
+    // NoScript code is not enabled for the reCAPTCHA.
+    $this->assertSession()->elementNotExists('css', "$grecaptchaSelector + noscript");
 
     // Test if the fall back url is properly build and noscript code added.
     $this->config('recaptcha.settings')->set('widget.noscript', 1)->save();
 
     $this->drupalGet('user/login');
-    $this->assertSession()->responseContains($grecaptcha . "\n" . '<noscript>');
+    // NoScript for reCAPTCHA is shown on form.
+    $this->assertSession()->elementExists('css', "$grecaptchaSelector + noscript");
     $options = [
       'query' => [
         'k' => $site_key,
@@ -175,13 +182,22 @@ public function testReCaptchaOnLoginForm() {
     // Check if there is a reCAPTCHA with global url on the login form.
     $this->config('recaptcha.settings')->set('use_globally', TRUE)->save();
     $this->drupalGet('user/login');
-    $options_2 = [
+    $options = [
       'query' => [
         'hl' => \Drupal::service('language_manager')->getCurrentLanguage()->getId(),
+        'render' => 'explicit',
+        'onload' => 'drupalRecaptchaOnload',
+      ],
+      'absolute' => TRUE,
+    ];
+    $this->assertSession()->responseContains(Html::escape(Url::fromUri('https://www.recaptcha.net/recaptcha/api.js', $options)->toString()), '[testReCaptchaOnLoginForm]: Global reCAPTCHA is shown on form.');
+    $options = [
+      'query' => [
+        'k' => $site_key,
+        'hl' => \Drupal::service('language_manager')->getCurrentLanguage()->getId(),
       ],
       'absolute' => TRUE,
     ];
-    $this->assertSession()->responseContains('<script src="' . Url::fromUri('https://www.recaptcha.net/recaptcha/api.js', $options_2)->toString() . '" async defer></script>');
     $this->assertSession()->responseContains(Html::escape(Url::fromUri('https://www.recaptcha.net/recaptcha/api/fallback', $options)->toString()));
 
     // Check that data-size attribute does not exists.
diff --git a/web/modules/recaptcha/tests/src/Functional/RecaptchaJavascriptTest.php b/web/modules/recaptcha/tests/src/Functional/RecaptchaJavascriptTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..24e2660e91525528db68462c7907af811dbec404
--- /dev/null
+++ b/web/modules/recaptcha/tests/src/Functional/RecaptchaJavascriptTest.php
@@ -0,0 +1,158 @@
+<?php
+
+namespace Drupal\Tests\recaptcha\Functional;
+
+use Drupal\Core\Url;
+use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
+
+/**
+ * Test the recaptcha module using JavaScript.
+ *
+ * @see https://developers.google.com/recaptcha/docs/faq#id-like-to-run-automated-tests-with-recaptcha-what-should-i-do
+ *
+ * @group reCAPTCHA
+ *
+ * @dependencies recaptcha
+ */
+class RecaptchaJavascriptTest extends WebDriverTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  protected static $modules = ['recaptcha_test'];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $defaultTheme = 'stark';
+
+  // These are test keys that will always validate.
+  protected const SITE_KEY = '6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI';
+  protected const SECRET_KEY = '6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe';
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+
+    $this->config('recaptcha.settings')
+      ->set('site_key', self::SITE_KEY)
+      ->set('secret_key', self::SECRET_KEY)
+      ->save();
+  }
+
+  /**
+   * Test the recaptcha on a form loaded via ajax that also submits via ajax.
+   */
+  public function testRecaptchaOnAjaxForm() {
+    // Load the /recaptcha-test page with the AJAX button.
+    $path = Url::fromRoute('recaptcha_test.page')->toString();
+    $this->drupalGet($path);
+
+    // No recaptcha JS on the page.
+    $this->assertSession()->responseNotContains('https://www.google.com/recaptcha/api.js', 'reCAPTCHA js is not present before the form is loaded via AJAX.');
+
+    // Click the button.
+    $this->click('a#load-ajax-form');
+
+    // Once the form is loaded.
+    $this->getSession()->wait(2000, '(jQuery("form[data-drupal-selector^=recaptcha-test-ajax-form]").length > 0)');
+    $this->assertJsCondition('Drupal.behaviors.recaptcha', 100, 'recaptcha Drupal behaviors found.');
+
+    // The recaptcha should be on the page.
+    $this->assertSession()->responseContains('https://www.google.com/recaptcha/api.js', 'reCAPTCHA js has been added.');
+    $grecaptcha = $this->getSession()->getPage()->find('css', 'form .g-recaptcha');
+    $this->assertJsCondition('window.grecaptcha !== undefined', 1000, 'The Google recaptcha library is loaded.');
+    $this->assertNotEmpty($grecaptcha, 'g-recaptcha element is found.');
+
+    // Test form submission.
+    // First, try a submission that will trigger the validation error handler.
+    $this->submitForm([
+      'email' => 'invalid@example.com',
+    ], 'Submit');
+    $messages = $this->getMessages();
+    $this->assertNotEmpty($messages);
+    $this->assertStringContainsString('Invalid email', $messages);
+    $this->assertStringContainsString('The answer you entered for the CAPTCHA was not correct.', $messages);
+    $this->assertStringNotContainsString('Form submit successful.', $messages);
+
+    // Now submit again with a valid email.
+    $this->submitForm([
+      'email' => 'valid@example.com',
+    ], 'Submit');
+    $messages = $this->getMessages();
+    $this->assertStringContainsString('The answer you entered for the CAPTCHA was not correct.', $messages);
+    $this->assertStringNotContainsString('Form submit successful.', $messages);
+
+    // We need to re-validate the captcha;
+    // So click it,.
+    $this->clickRecaptcha();
+    // And submit for the last time.
+    $this->submitForm([
+      'email' => 'valid@email.com',
+    ], 'Submit');
+    $messages = $this->getMessages();
+    $this->assertStringNotContainsString('The answer you entered for the CAPTCHA was not correct.', $messages);
+    $this->assertStringContainsString('Form submit successful.', $messages);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function submitForm(array $edit, $submit, $form_html_id = NULL) {
+    parent::submitForm($edit, $submit, $form_html_id);
+
+    // Because we're submitting the form via AJAX give it 500ms before we test
+    // anything else with the response.
+    $this->getSession()->wait(500);
+  }
+
+  /**
+   * Click the captcha checkbox element and wait for it to be validated.
+   *
+   * @param int $timeout
+   *   The time to wait for the recaptcha to get validated (in miliseconds).
+   *
+   * @throws \Behat\Mink\Exception\DriverException
+   * @throws \Behat\Mink\Exception\UnsupportedDriverActionException
+   */
+  protected function clickRecaptcha($timeout = 2000) {
+    $driver = $this->getSession()->getDriver();
+    $recaptchaIFrame = $this->getSession()->getPage()->find('css', 'form .g-recaptcha iframe');
+    $driver->switchToIFrame($recaptchaIFrame->getAttribute('name'));
+    $recaptchaCheckbox = $driver->find('//span[@id="recaptcha-anchor"]');
+    if (!empty($recaptchaCheckbox)) {
+      $recaptchaCheckbox[0]->click();
+      $this->getSession()->wait($timeout, 'document.getElementById("recaptcha-anchor").attributes["aria-checked"].value === true;');
+    }
+    else {
+      $this->fail('Unable to find recaptcha checkbox.');
+    }
+    $driver->switchToWindow();
+    $this->assertJsCondition('grecaptcha.getResponse() !== ""', $timeout, 'grecaptcha has response.');
+  }
+
+  /**
+   * Search for messages in the last html page response.
+   *
+   * @return string
+   *   The message.
+   */
+  public function getMessages($timeout = 2000) {
+    $this->getSession()->wait($timeout, '(jQuery("div[data-drupal-messages]").length > 0)');
+    $page = $this->getSession()->getPage();
+    $messages = $page->findAll('css', 'div[data-drupal-messages]');
+    $text = '';
+    if (isset($messages)) {
+      foreach ($messages as $message) {
+        $text .= $message->getText();
+      }
+    }
+
+    return $text;
+  }
+
+}
diff --git a/web/modules/recaptcha_v3/.gitlab-ci.yml b/web/modules/recaptcha_v3/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..8bf01bfd315333250d07f31f260ddcec4b77a354
--- /dev/null
+++ b/web/modules/recaptcha_v3/.gitlab-ci.yml
@@ -0,0 +1,30 @@
+################
+# GitLabCI template for Drupal projects.
+#
+# This template is designed to give any Contrib maintainer everything they need to test, without requiring modification.
+# It is also designed to keep up to date with Core Development automatically through the use of include files that can be centrally maintained.
+# As long as you include the project, ref and three files below, any future updates added by the Drupal Association will be used in your
+# pipelines automatically. However, you can modify this template if you have additional needs for your project.
+# The full documentation is on https://project.pages.drupalcode.org/gitlab_templates/
+################
+
+# For information on alternative values for 'ref' see https://project.pages.drupalcode.org/gitlab_templates/info/templates-version/
+# To test a Drupal 7 project, change the first include filename from .main.yml to .main-d7.yml
+include:
+  - project: $_GITLAB_TEMPLATES_REPO
+    ref: $_GITLAB_TEMPLATES_REF
+    file:
+      - "/includes/include.drupalci.main.yml"
+      - "/includes/include.drupalci.variables.yml"
+      - "/includes/include.drupalci.workflows.yml"
+
+################
+# Pipeline configuration variables are defined with default values and descriptions in the file
+# https://git.drupalcode.org/project/gitlab_templates/-/blob/main/includes/include.drupalci.variables.yml
+# Uncomment the lines below if you want to override any of the variables. The following is just an example.
+################
+variables:
+  OPT_IN_TEST_PREVIOUS_MINOR: 1
+  OPT_IN_TEST_NEXT_MINOR: 1
+  OPT_IN_TEST_NEXT_MAJOR: 1
+  OPT_IN_TEST_MAX_PHP: 1
diff --git a/web/modules/recaptcha_v3/README.md b/web/modules/recaptcha_v3/README.md
index d1c61b00763f3c0e83623fc6d0a5ca219955f8a5..f3d2c905e43245249778b85cf3245b29ec5ca9f6 100644
--- a/web/modules/recaptcha_v3/README.md
+++ b/web/modules/recaptcha_v3/README.md
@@ -34,7 +34,7 @@ This module requires the following module:
 
 This module requires the following library:
 
-- [google/recaptacha](https://github.com/google/recaptcha)
+- [google/recaptcha](https://github.com/google/recaptcha)
 
 
 ## Recommended modules
@@ -50,7 +50,7 @@ information, see
 [Installing Drupal Modules](https://www.drupal.org/docs/extending-drupal/installing-drupal-modules).
 
 If not using Composer,
-install the [google/recaptacha](https://github.com/google/recaptcha) library.
+install the [google/recaptcha](https://github.com/google/recaptcha) library.
 
 
 ## Configuration
@@ -72,13 +72,3 @@ install the [google/recaptacha](https://github.com/google/recaptcha) library.
    - Select action on user verification fail
 
 3. Use the action you created above as a challenge in captcha form settings.
-
-
-## Maintainers
-
-- Denis - [dench0](https://www.drupal.org/u/dench0)
-- Majid Ali Khan - [majid.ali](https://www.drupal.org/u/majidali)
-- Fabien Leroux - [B-Prod](https://www.drupal.org/u/b-prod)
-
-The development of Drupal 8 version of this project has been sponsored by:
-- [1xINTERNET](https://www.1xinternet.de)
diff --git a/web/modules/recaptcha_v3/config/install/recaptcha_v3.settings.yml b/web/modules/recaptcha_v3/config/install/recaptcha_v3.settings.yml
index 10f9ca781c5f09e5e9c5ce68f5d235080cf46f5a..3bca4b766cd10438468b788fabbb81f15d584a18 100644
--- a/web/modules/recaptcha_v3/config/install/recaptcha_v3.settings.yml
+++ b/web/modules/recaptcha_v3/config/install/recaptcha_v3.settings.yml
@@ -2,7 +2,7 @@ site_key: ""
 secret_key: ""
 verify_hostname: true
 default_challenge: 'captcha\Math'
-error_message: "Antibot verification failed."
+error_message: "Anti-bot verification failed."
 cacheable: false
 library_use_recaptcha_net: false
 hide_badge: false
diff --git a/web/modules/recaptcha_v3/config/schema/recaptcha_v3.schema.yml b/web/modules/recaptcha_v3/config/schema/recaptcha_v3.schema.yml
index 299a95f2699e90f0ac05caef4b6d7c6186f89b45..7e90d36ecf1b22717861670638b3dd31bce9c8ab 100644
--- a/web/modules/recaptcha_v3/config/schema/recaptcha_v3.schema.yml
+++ b/web/modules/recaptcha_v3/config/schema/recaptcha_v3.schema.yml
@@ -23,7 +23,7 @@ recaptcha_v3.settings:
       translatable: true
     cacheable:
       type: boolean
-      label: "Make captcha cacheble"
+      label: "Make captcha cacheable"
     library_use_recaptcha_net:
       type: boolean
       label: "Load library from recaptcha.net instead of google.com"
diff --git a/web/modules/recaptcha_v3/css/recaptcha_v3_no_badge.css b/web/modules/recaptcha_v3/css/recaptcha_v3_no_badge.css
index 55959ad91c5674c71a5b3d86884b1780715d2954..016f675743976bbab946fdbc5cee93edf3f1ab24 100644
--- a/web/modules/recaptcha_v3/css/recaptcha_v3_no_badge.css
+++ b/web/modules/recaptcha_v3/css/recaptcha_v3_no_badge.css
@@ -1 +1,4 @@
-.grecaptcha-badge { visibility: hidden; }
+/* cspell:ignore grecaptcha */
+.grecaptcha-badge {
+  visibility: hidden;
+}
diff --git a/web/modules/recaptcha_v3/js/recaptcha_v3.js b/web/modules/recaptcha_v3/js/recaptcha_v3.js
index 5e2359f14e4a23f8878170c06f44255fe0e4503f..5283a67606e00e59a1f4e3888c48d239f68a5d3c 100644
--- a/web/modules/recaptcha_v3/js/recaptcha_v3.js
+++ b/web/modules/recaptcha_v3/js/recaptcha_v3.js
@@ -1,9 +1,31 @@
+/* cspell:ignore grecaptcha */
+/* global grecaptcha */
+
 /**
  * @file
  * Recaptcha v3 behaviors.
  */
 
 (($, Drupal) => {
+  function doUpdateTokenElement(element) {
+    const $element = $(element);
+
+    grecaptcha.ready(() => {
+      if (!element) {
+        return;
+      }
+
+      grecaptcha
+        .execute($element.data('recaptchaV3SiteKey'), {
+          action: $element.data('recaptchaV3Action'),
+        })
+        .then((token) => {
+          $element[0].value = token;
+          $element.trigger('change');
+        });
+    });
+  }
+
   function updateTokenElement(element) {
     let timer;
     // Wait for grecaptcha to be loaded.
@@ -17,29 +39,11 @@
           }
         }
       }, 500);
-    }
-    else {
+    } else {
       doUpdateTokenElement(element);
     }
   }
 
-  function doUpdateTokenElement(element) {
-    let $element = $(element);
-
-    grecaptcha.ready(() => {
-      if (!element) {
-        return;
-      }
-
-      grecaptcha.execute($element.data('recaptchaV3SiteKey'), {
-        action: $element.data('recaptchaV3Action')
-      }).then((token) => {
-        $element.val(token);
-        $element.trigger('change');
-      });
-    });
-  }
-
   /**
    * Attach recaptcha response token from google with form.
    *
@@ -49,26 +53,23 @@
     attach: (context) => {
       once('recaptcha-v3-token', '.recaptcha-v3-token', context).forEach(
         (element) => {
-          let interval;
-
           updateTokenElement(element);
-
           // Update the recaptcha tokens every 90 seconds.
           // This seems to be the most robust way to always have valid recaptcha
           // tokens when you don't have control over how the forms are being
           // submitted. For example normal form submits are synchronous while
-          // Google Recaptcha v3 is asynchonous.
+          // Google Recaptcha v3 is asynchronous.
           // A recaptcha token has a maximum lifetime of 120 seconds.
           // https://developers.google.com/recaptcha/docs/v3
-          interval = setInterval(() => {
+          const interval = setInterval(() => {
             if (!element) {
               clearInterval(interval);
             } else {
               updateTokenElement(element);
             }
           }, 90000);
-        }
+        },
       );
-    }
+    },
   };
 })(jQuery, Drupal);
diff --git a/web/modules/recaptcha_v3/logo.png b/web/modules/recaptcha_v3/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..5a5b97b67263118589a765a3731662185a651ef5
--- /dev/null
+++ b/web/modules/recaptcha_v3/logo.png
@@ -0,0 +1,37 @@
+�PNG
+
+���
IHDR���������æ$����PLTE���;����;����C��B�����������������������������.gڦ�����������:����<����C��:�������������������������=�D��:����;�������������;�9����G��D�����C�����=�<�9�9�������9����������D�򚚚9�������������B��B�����>����A��B�����������������C��C��������������������������������B��A��D��;����B��A�����������9����������<��:�;����C��������������B��B��C��B��B��������:�������9�G�򝝝C��������;�������B�󭭭C�����������������C�����:�:�������B��������������=�A�����C��:����B��B�����<����;����:�B��B��������������:�������B�󡩵:�C��:�������:�B��:�:�B��|��;�;����;�;�o�֒�����<w欬�;�;����;v�B��u��;�f��(S¡�������ʒ��������c��(S����������:�B�����B��������:�������@��C��<�Q��B��"G�A��;�D��V��#J�#H�@��%M�b��(Q�\��O��h�����tRNS���pEv��7�����x%��9B�(���P��� ��� �y.�F/+$��6����ћ>5&ڪ�K��ŷ=,
+�sj���)����֝XQL�����TR�L2�������pG< �����v\D7�ɣyupB����eXH�񼻕a]<2�:����hc2.�������j[��^��YI���̷�q�dE+�jhoغ��N��|{UQ��̝[Ï賮��g��IIDATx��ݿKa��;��YD�5�-	Ji"d(Y,!�����C��p��,N��K��EB���ZR�P����9
�B�?��W��&w��}=�����w�F�0�0�0�0�0�0�0�0�0�0�0�0�0�M��ۧ���}i�E�<�
5���`��V��nmc��?^\�"�Yg�3�|>��j)6V�T���a�F������Ŭ���RF3t]Uc��=3WI�
+F��]���X�lՂ�a���^e2�Z"ˠ�YP0��,���e�4V6¸	�p����.CW'ˇG!�M�]�Z?��2j)^ll��Ч�W�pp�jX��m�a����;��5C�l�¸D�} �j�X����=���_�g�^7��(�\@��Hm#_���Z�@�HY�
+ƭ��k`�y�'�@"'A��)��$M�!���!�!���|#�[�;�<x�K@���@����y�/����[V0n�N���#��u�� 	�
+�"�@�W���F�9r�	���j�|�->�H���n���O�_N���$�#���}Y����*�'������2�	�2�K�_�.�@a��G� ����`gTk>��������Vʥ{���K�_G���*}��������x�F��c`4�������.�˥������	���Z�1�(�@y���u=^�Q�c�2P��nX��h������ �=�Ⱥ��o�j��@Ͽ��R�K7Οc�����2�����<�����������r��
��r���/3��ծ�������ou��;��57�_f�s�_Y���5�L�������n������x9�IR�������hx{�e0�����;�-�t���'I`�i�B�����������t;�e�b��� ����_�s���?Q������$�\�_���U��_f�هn�/�h�kn���Ʒ�Z�s�-�������O��������u���'�0�B���xd�r��Ab����|��@���	�t3�w�K
`{���E�jΞ���査��p�ڱ\U��	`bk��@8��z�����
+�@j��
O/�@�v�]��`ez�?�5�?y��OT�)�? ��f;+^��Dj���1 P�ww�/��Plz�����&�>���h�����?������gN-�
�:����J
�~�X���.�����#n��R�7K�,�@��*�@�|F���{����h��>�� �~��g�s�v��
+;�:}�P&����y��9g�P�X�x	 �إC���\�Z��X"`��O�+�W��H�-"���+�%��H��b"sΎ���Q�;PG�v��~5��@v����Rz�LhL@j�����P)�;@=q�dWٚ��R Y��S����4cQO��
+��!������-T�(��k������"$���/���\_J��N��M8�E���BI)�aF�l�s��"���={f�ڳ���Z��=z1��[�e�5k�~@�{@>�$�noI�=��<pyqC� �pa�,X���n���	P����NlfG.�K��Q	P����m��Z�����eM N�P3H�z��~:)׀�p�]�H���3'ݔ�(� �l���;���o.������,�H�[�����e������������4�����1���"�s`G�c���p�^mH�
+d�g@��O����=5�� ������`����f�O�K������r���.�TW����5��P����֪���]@���
@���f�	�#sw�->�ƿ�(�A@��m���-��W��
E�x^e |�n0�=.�s�+������H�r2-���:�kw��(l��#D�+�fp�Y�Mʭ�����	 �����>��
+%��W���7 �0��lU\�9�C��:����x�Z���q��྿
 |�@xC���89�C��W|��^��8�R F�@�r]�7�H�/�=o�`6��� �t+�I�/;�X-�s|;��>�A���2H��@X�Y�� �ַ�X
�y����(�Ī�l��x�����Q�����p|G@|�5D-@rN�@��m{w
+ ���͡1�&�h�B�=!���ʯ�@k����Jҿ��H�������YO~����ʯ�������W��㯷�HG���v$��Jw�
+�~����;�����������@z�q�莐+@�c��j;�$��m0�H ���P=�����@l׵F�{W�$��D}�S=�$�?\@��9�@���?P<��-��e��=0�>�$���_o�(/Cٻ'��>�(����Y��o�7��s@=���!��������0`�����C�} Y�J�J(��� ��y`E+@�TJ��k,���0=BT�
�$��e���M������.z�#�!4���!�ƅP�y:���hJwF/�қ1����q
+���Ì�������i��O���o���`�P$[pa3�gr��O`^���N�t&���q �{��3��!~���6�Ӗ.f�__��S`{x}H
D��h\���c'�~������lC�y��̋���HG.@'�]���?�;�
+��.��TS��_�r�dպ�p�&@-���:p�@�����S#����AO����8���.�\+
+��Pw���>�	��}�R����!�AW���M��L�2�˴��3�H�ߜ(ҥ��<y���J|��O5���{ٿ|�œM��l����L/����WPn��ţ��L���2����#��MvYX���ߺ�=yz}�/>DưI%��fn�����d\��!Dދ5v8ş�ԃ՟�/�����P���xz9?��x�:;��c��T�`���X�0�#+)��2/����������o݃@�7� P�
$��T�
$����
DX�����
+@�7Q�������
EH����	@��\���?��
+"P�7����@��hd�qhw��J������@(�\�P�UC����UD����!����YP�WIP�W9P�W��P��d@�_a$����)�Ϡ 03�0��1>�r�04��NZ���9�t���;�֤
*|�@@���P+_4�r��p�/�O�sV�źM�Qd`��3oIG��'XG�C�L�o�KP _��������~f��q���c��u�ʐc���8c�[	�7����!N6���d��Οm �Ç88Th@��ԭT[�$hKl;��BK���ł�.���"\
+�C'E��N�J)J��C{��i�Im�V�x�=� �>����r1B�ҷPt<R����h-	E����H��H��������S{��0 T0�E�̶.1��Ia@�`��PT� 2 r0ٔQ��Uz�ȼȀpP7P����
+�'�&�q�Ks��^D�z0��
׀z�b,������Yo��Tt��eSB!��4������F3�_�BR��ڭ7 T\��Q���\������&�o9��o����F���+a�:)ْ�&���ڀ(�ر�)t:���a@\��&n��
X��_t�x
+�k�+�Y}�J6fg�W��32<IH��O���c��mJ�d�+��!=k"�D&�f�X����\�Q����hD��q���i�h�_�:�#p3 �u��(��,
J������/|	�	��̅�.�47T(�?ұ8��g`̨�O��m�L[���Mz�D.�.:�A����J��Qʏaf@p���=)Y�����j�P(��!=���0�T�.r����#Y͹����Z�E�����Z��l�[_���
S���.#�:��u���._H� %Y�zk5�0����ˀx	�B(���$�¤��~��4H]�.[�+՛�M/�Pz�O�e��	������A�]o6��v�rs>7fƮ���ӑ�!�c)�7v`�v玦]�)�����,�7c��x��2�P��!�oI7� �n���B����{�B��� �n���+A�
���TX���!�p���
���y6@���!@�:6��B� ��+B�_�>9,����]q!�/,�D�D��T0`���1@�����m��m!�� m�>�Q�~X�������	���Ǥ]�����O1H��W�����������#����?����<س>�?
+@��G_��f�q���I�"�%�[/^�z$��2�?@�B�½7��Ĵ3��ޯ��]H�ٰ}������@L�����D��k�����������C����|��`
���{x����7�}�����P�������'B�����oH�9T��!�����x���
+����
+�3�_�� X�]��;����9,�����k�J����I�������Ox[
+�N����'����ǵ��=G�"p��S?��0@�H�<���=�������x���ŷ�,H'1�"�|������q��3#d���S��<|�Q;�-���� �7��S�v;��!c	l���x��53�9���_~����n��r��+���M�����t�8�0���������xv~!@y�ݟC��?(�����ӛ���@>��lŖ�)HGC��]��U�̺�K�l���^,���^��L�4
+����rN�ǿE�@����z��[�]�����NO{k�8��$7�C$U�tc�Hh[(��"��M[V⨀�C���5������J�?4�ʪ��8�����H"V�0���S�Ʋ	~�:��]V��j�ͤ󝿨��K�[�2qz�x���Rk��H4
+�ȣ~��1bZ�j1������D�Ԝ��y%L�u�~Rd\�V�v���y8n5��?N��Ł��0=��u��b�Ht��qa�@/_c�BqM��@}�嬐ʕ�b�5��% +Z����E�cN��+�=�$��c�a�;|5H6Ţ�,�J��֕@S�J@%�g��ߪNŴ���|�2��w.)�R�/�g��=}�nU���?G�r�8�/��!��n�	����P451j��Js*�gM*�|tsYX4F����:������������L���y�]�D�9!+YW���|]���a�P].]�).�K��;jט��b�_Nr����b��%)i�)�%[��zP(�V�ժP���I�Xm�3�h��@ |f������_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUU�};�M��<���8WP\�)� QP�䔊H�%]Z"E�FT("}*�y�y����=,g"������o��8��8��8��8��8��8��8��8��8����s���^�z>-�L��I^�~�
+	(��#%��F�yOˢ��o^�tE
�(.��z>S@>���<��8{��������b�+�|z}xޓ��F����Íء���*�|z}x�����?����7�.X�]]U�����'��ý΋`7�-SI�gM����󞂿��k�����W��������yO�n�g��J�^��q��o�(`LAR��]�H%�73Ubӫ�����ū׀�G%���:�:�H�na�O�,��X�����=v��I8mBL���
+,�B�	��b��wCR����������̸��lƘ0��|4j�觗@�������.�>b�
��1�^V�2Ac-(�~zy�y���-����`��z��IR�~Q�@5�����S�#v�Fc6�0�.�L$��C[P����д���������{��;7m?��������s�Yи�V�7�x������Rb�7O~�����
�/��߯ ��BWe���{�
+��Lhb$��>������)%��y�ڇ����^g���B�B����-��-���
+
+
+��^�	@yy�5(��n�$��o������z}�F���i,)�bzm(/O��uF���2��O�����n���Hn��Bo�����u��,1�������#��TV�d^���
ٌR�R�+�\�
+��^Y���� #�v���ƭr�Z��<���_�=M?֩w4����4Z�����]m�{���Ĕ7o�Ϳ_O��Y@c��ԛ@m�x]0:T	�m�*|�"�+.��&�i�ӣ�%/KLys{���lS=�����[����q�\����3i�5q�ӣȞ�<���W۹Q�������-·T���#���vp��d�(�GK^����I؂�V`yj��6��_� IX�����ߔ3@9=�X�Ĕ7w�6�vg�J���������K4��|X�PN�"��,1��K�1��cW?Q�F>`�I-ˁo��
+@yYbʛ/�O
+�
�.F�?�0�O�����>��=����,1�͙��ICLU�]FѢ��4^�l�n�H����N%����Ĕ7g�W	S
��@J�aK�C�EV�٤	�~��	���Y^}��j�7�h	���ȝm��:y�X�;�F���</OLysf*���|�Vp#��ޞѲL|2��`}x^{�䋯H����͠!�f-�a���;�����}L��Z�þ,̫�/�9.��ݥ����Ze,�A?"ͫ�/��`}�~$���:pЏ�I����ܠ`�U6!�������@5����z�<oR���Uz�HXء�6)�PM�/�<��������0���[HX���{g�)��M�.�<����E��ո��\E.�D�����+���PL�)�<����P��D��{g��0���4�T;8t0K(}���Ղ�XJ܌�B\�IJ�;�)���,!��]�w�90���,���������5p�^�}���E>�#��t���A��z��@� ��Aݒ\|�t�r�`�=��(����'��^������N����Paj�1#��)�Z;��V�~@�����	@�*�ʣf�Jڧ:Gt3�}�ȋ�P�|�~@h�E�;Ǫ;n"S�?3B��DWO-))��$���C��z��@���4ɨz1�����`�kдTh><�T�����n��G��H����䪖�����������;��X��))��'s�y���/��/� ��S��9,z�R��y�'r�<����@���@g�-z5Cޓ"�7�ė���!���'�������z�lOb���D���gQ�'�]��˘h���ö]�vW/� � � ��$�������nG���������P�AeQ�������IEND�B`�
\ No newline at end of file
diff --git a/web/modules/recaptcha_v3/recaptcha_v3.info.yml b/web/modules/recaptcha_v3/recaptcha_v3.info.yml
index 4e15a0c87e8f2c7bed4bbc83a589ffb854c3be76..d75f7d9be06a12bea2bdef9571d92a10ddab5dcc 100644
--- a/web/modules/recaptcha_v3/recaptcha_v3.info.yml
+++ b/web/modules/recaptcha_v3/recaptcha_v3.info.yml
@@ -1,13 +1,13 @@
 name: "reCAPTCHA v3"
 type: module
 description: "The reCaptcha V3 module provides integration with Google reCaptcha V3 and CAPTCHA module."
-core_version_requirement: ^9.5 || ^10
+core_version_requirement: ^10 || ^11
 package: Spam control
 configure: recaptcha_v3.settings
 dependencies:
   - captcha:captcha
 
-# Information added by Drupal.org packaging script on 2023-08-21
-version: '2.0.2'
+# Information added by Drupal.org packaging script on 2024-08-12
+version: '2.0.3'
 project: 'recaptcha_v3'
-datestamp: 1692590088
+datestamp: 1723446408
diff --git a/web/modules/recaptcha_v3/recaptcha_v3.module b/web/modules/recaptcha_v3/recaptcha_v3.module
index 3c87bffcb9ba56fab26a158d6904569386f54298..4bd48e640c6bf0ad6c1a1fe41d8e865469bec2b0 100644
--- a/web/modules/recaptcha_v3/recaptcha_v3.module
+++ b/web/modules/recaptcha_v3/recaptcha_v3.module
@@ -8,9 +8,9 @@
 use Drupal\Component\Utility\Html;
 use Drupal\Core\Ajax\AjaxResponse;
 use Drupal\Core\Ajax\ReplaceCommand;
-use Drupal\recaptcha_v3\Entity\ReCaptchaV3Action;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\recaptcha_v3\Entity\ReCaptchaV3Action;
 use Drupal\recaptcha_v3\ReCaptchaV3ActionInterface;
 use ReCaptcha\ReCaptcha;
 use ReCaptcha\RequestMethod\CurlPost;
diff --git a/web/modules/recaptcha_v3/src/Form/ReCaptchaV3ActionDeleteForm.php b/web/modules/recaptcha_v3/src/Form/ReCaptchaV3ActionDeleteForm.php
index bab6a0fa8e8b73f9cc9bfb11de6fd732038fd726..5d2b829ae70fb1f8e2bd26252d89ff1afff11306 100644
--- a/web/modules/recaptcha_v3/src/Form/ReCaptchaV3ActionDeleteForm.php
+++ b/web/modules/recaptcha_v3/src/Form/ReCaptchaV3ActionDeleteForm.php
@@ -16,7 +16,9 @@ class ReCaptchaV3ActionDeleteForm extends EntityDeleteForm {
    * {@inheritdoc}
    */
   public function buildForm(array $form, FormStateInterface $form_state) {
-    $action = $this->entityTypeManager->getStorage('captcha_point')->getQuery()
+    $action = $this->entityTypeManager->getStorage('captcha_point')
+      ->getQuery()
+      ->accessCheck()
       ->condition('captchaType', 'recaptcha_v3/' . $this->entity->id())
       ->execute();
     if (!empty($action)) {
@@ -36,7 +38,6 @@ public function buildForm(array $form, FormStateInterface $form_state) {
     }
 
     return $form;
-    // @todo needs to do same as above in case of recaptcha v3 action being used in webform.
   }
 
 }
diff --git a/web/modules/recaptcha_v3/src/Form/ReCaptchaV3SettingsForm.php b/web/modules/recaptcha_v3/src/Form/ReCaptchaV3SettingsForm.php
index b790feb54beac9996b9f574671b61ce1bc3caa6f..5bf83efdd11119e062848f7c7b9cfd5fcac4f7cc 100644
--- a/web/modules/recaptcha_v3/src/Form/ReCaptchaV3SettingsForm.php
+++ b/web/modules/recaptcha_v3/src/Form/ReCaptchaV3SettingsForm.php
@@ -5,6 +5,7 @@
 use Drupal\captcha\Service\CaptchaService;
 use Drupal\Core\Asset\LibraryDiscoveryInterface;
 use Drupal\Core\Config\ConfigFactoryInterface;
+use Drupal\Core\Config\TypedConfigManagerInterface;
 use Drupal\Core\Form\ConfigFormBase;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Render\ElementInfoManager;
@@ -41,6 +42,8 @@ class ReCaptchaV3SettingsForm extends ConfigFormBase {
    *
    * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
    *   Config factory service.
+   * @param \Drupal\Core\Config\TypedConfigManagerInterface $typedConfigManager
+   *   The typed config manager.
    * @param \Drupal\Core\Asset\LibraryDiscoveryInterface $library_discovery
    *   Library discovery service.
    * @param \Drupal\Core\Render\ElementInfoManager $element_info_manager
@@ -48,8 +51,8 @@ class ReCaptchaV3SettingsForm extends ConfigFormBase {
    * @param \Drupal\captcha\Service\CaptchaService $captcha_service
    *   Captcha service.
    */
-  public function __construct(ConfigFactoryInterface $config_factory, LibraryDiscoveryInterface $library_discovery, ElementInfoManager $element_info_manager, CaptchaService $captcha_service) {
-    parent::__construct($config_factory);
+  public function __construct(ConfigFactoryInterface $config_factory, TypedConfigManagerInterface $typedConfigManager, LibraryDiscoveryInterface $library_discovery, ElementInfoManager $element_info_manager, CaptchaService $captcha_service) {
+    parent::__construct($config_factory, $typedConfigManager);
     $this->libraryDiscovery = $library_discovery;
     $this->elementInfoManager = $element_info_manager;
     $this->captchaService = $captcha_service;
@@ -61,6 +64,7 @@ public function __construct(ConfigFactoryInterface $config_factory, LibraryDisco
   public static function create(ContainerInterface $container) {
     return new static(
       $container->get('config.factory'),
+      $container->get('config.typed'),
       $container->get('library.discovery'),
       $container->get('plugin.manager.element_info'),
       $container->get('captcha.helper')
@@ -141,7 +145,7 @@ public function buildForm(array $form, FormStateInterface $form_state) {
     $form['cacheable'] = [
       '#type' => 'checkbox',
       '#title' => $this->t('Cacheable'),
-      '#description' => $this->t('Make captcha cacheble: can lead to some validation errors like "unknown CAPTCHA session ID".'),
+      '#description' => $this->t('Make captcha cacheable: can lead to some validation errors like "unknown CAPTCHA session ID".'),
       '#default_value' => $config->get('cacheable'),
     ];
 
diff --git a/web/modules/recaptcha_v3/src/ReCaptchaV3ActionListBuilder.php b/web/modules/recaptcha_v3/src/ReCaptchaV3ActionListBuilder.php
index 4821feef9a2e360a32917fbc5483eef63c0146a2..1c7062ecf2736ba442c576e58dca62728addb91f 100644
--- a/web/modules/recaptcha_v3/src/ReCaptchaV3ActionListBuilder.php
+++ b/web/modules/recaptcha_v3/src/ReCaptchaV3ActionListBuilder.php
@@ -2,8 +2,13 @@
 
 namespace Drupal\recaptcha_v3;
 
+use Drupal\captcha\Service\CaptchaService;
+use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\Core\Config\Entity\ConfigEntityListBuilder;
 use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Entity\EntityStorageInterface;
+use Drupal\Core\Entity\EntityTypeInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Provides a listing of reCAPTCHA v3 action entities.
@@ -18,6 +23,51 @@ class ReCaptchaV3ActionListBuilder extends ConfigEntityListBuilder {
    */
   protected $challengeTypes;
 
+  /**
+   * The captcha helper service.
+   *
+   * @var \Drupal\captcha\Service\CaptchaService
+   */
+  protected $captchaHelper;
+
+  /**
+   * The config factory.
+   *
+   * @var \Drupal\Core\Config\ConfigFactoryInterface
+   */
+  protected $configFactory;
+
+  /**
+   * Constructs a new ReCaptchaV3ActionListBuilder object.
+   *
+   * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
+   *   The entity type definition.
+   * @param \Drupal\Core\Entity\EntityStorageInterface $storage
+   *   The action storage.
+   * @param \Drupal\captcha\Service\CaptchaService $captcha_service
+   *   The captcha helper service.
+   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
+   *   The config factory.
+   */
+  public function __construct(EntityTypeInterface $entity_type, EntityStorageInterface $storage, CaptchaService $captcha_service, ConfigFactoryInterface $config_factory) {
+    parent::__construct($entity_type, $storage);
+
+    $this->captchaHelper = $captcha_service;
+    $this->configFactory = $config_factory;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
+    return new static(
+      $entity_type,
+      $container->get('entity_type.manager')->getStorage($entity_type->id()),
+      $container->get('captcha.helper'),
+      $container->get('config.factory')
+    );
+  }
+
   /**
    * {@inheritdoc}
    */
@@ -50,11 +100,11 @@ public function buildRow(EntityInterface $entity) {
    */
   protected function getCaptchaChallengeTypes() {
     if ($this->challengeTypes === NULL) {
-      $this->challengeTypes = \Drupal::service('captcha.helper')->getAvailableChallengeTypes(FALSE);
+      $this->challengeTypes = $this->captchaHelper->getAvailableChallengeTypes(FALSE);
       $this->challengeTypes = array_filter($this->challengeTypes, static function ($captcha_type) {
         return !(strpos($captcha_type, 'recaptcha_v3') === 0);
       }, ARRAY_FILTER_USE_KEY);
-      $default = \Drupal::config('recaptcha_v3.settings')->get('default_challenge');
+      $default = $this->configFactory->get('recaptcha_v3.settings')->get('default_challenge');
       $this->challengeTypes['default'] = $this->challengeTypes[$default] ?? $this->t('Default');
     }
     return $this->challengeTypes;
diff --git a/web/modules/redirect/.gitlab-ci.yml b/web/modules/redirect/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b20701d928220e171617bab8446f1412cd4ba83b
--- /dev/null
+++ b/web/modules/redirect/.gitlab-ci.yml
@@ -0,0 +1,62 @@
+################
+# DrupalCI GitLabCI template
+#
+# Gitlab-ci.yml to replicate DrupalCI testing for Contrib
+#
+# With thanks to:
+#   * The GitLab Acceleration Initiative participants
+#   * DrupalSpoons
+################
+
+################
+# Guidelines
+#
+# This template is designed to give any Contrib maintainer everything they need to test, without requiring modification. It is also designed to keep up to date with Core Development automatically through the use of include files that can be centrally maintained.
+#
+# However, you can modify this template if you have additional needs for your project.
+################
+
+################
+# Includes
+#
+# Additional configuration can be provided through includes.
+# One advantage of include files is that if they are updated upstream, the changes affect all pipelines using that include.
+#
+# Includes can be overridden by re-declaring anything provided in an include, here in gitlab-ci.yml
+# https://docs.gitlab.com/ee/ci/yaml/includes.html#override-included-configuration-values
+################
+
+include:
+  ################
+  # DrupalCI includes:
+  # As long as you include this, any future includes added by the Drupal Association will be accessible to your pipelines automatically.
+  # View these include files at https://git.drupalcode.org/project/gitlab_templates/
+  ################
+  - project: $_GITLAB_TEMPLATES_REPO
+    ref: $_GITLAB_TEMPLATES_REF
+    file:
+      - '/includes/include.drupalci.main.yml'
+      - '/includes/include.drupalci.variables.yml'
+      - '/includes/include.drupalci.workflows.yml'
+
+################
+# Pipeline configuration variables
+#
+# These are the variables provided to the Run Pipeline form that a user may want to override.
+#
+# Docs at https://git.drupalcode.org/project/gitlab_templates/-/blob/1.0.x/includes/include.drupalci.variables.yml
+################
+# variables:
+#   SKIP_ESLINT: '1'
+variables:
+  OPT_IN_TEST_PREVIOUS_MINOR: 1
+  _PHPUNIT_CONCURRENT: 1
+
+phpunit (next major):
+  variables:
+    SYMFONY_DEPRECATIONS_HELPER: "disabled"
+
+# This module wants to strictly comply with Drupal core's coding standards.
+phpcs:
+  before_script:
+  - cp $_WEB_ROOT/core/phpcs.xml.dist ./phpcs.xml.dist
diff --git a/web/modules/redirect/composer.json b/web/modules/redirect/composer.json
index 36ec2347bb756b991e08e2496e2eb0906776f37a..10de8839801317082b691ca7477e53b1370bfcb0 100644
--- a/web/modules/redirect/composer.json
+++ b/web/modules/redirect/composer.json
@@ -2,8 +2,5 @@
   "name": "drupal/redirect",
   "description": "Allows users to redirect from old URLs to new URLs.",
   "type": "drupal-module",
-  "license": "GPL-2.0-or-later",
-  "require": {
-      "drupal/core": "^9.2 || ^10"
-  }
+  "license": "GPL-2.0-or-later"
 }
diff --git a/web/modules/redirect/css/redirect.admin.css b/web/modules/redirect/css/redirect.admin.css
index f613931ed7a7a6a4264ea56beebb63022f81ed76..b80674f6fb19b0a27de533e9357e16b3dbdd835f 100644
--- a/web/modules/redirect/css/redirect.admin.css
+++ b/web/modules/redirect/css/redirect.admin.css
@@ -7,8 +7,8 @@
 }
 
 .redirect-table__path {
+  overflow: hidden;
   width: 70%;
   white-space: nowrap;
-  overflow: hidden;
   text-overflow: ellipsis;
 }
diff --git a/web/modules/redirect/logo.png b/web/modules/redirect/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..aaae1fc86d36014910312025fd6e90ebae37dab8
--- /dev/null
+++ b/web/modules/redirect/logo.png
@@ -0,0 +1,65 @@
+�PNG
+
+���
IHDR���������æ$����PLTE���������������������������������������������������������������������������������-�ҹ���������`�����%�����4�ԛ����p��j��:��N�ٱ��O��A��5�Ԣ����H�ؒ��v��}��+��u��G��%�ы��W��g��}��Z��.��7�Ր��a��3��#��T��?��?�������!��������������<�����.��������*��������D��'��������#�����������8��1��x��s��4�Ԃ��?�������b��J�ُ��}�����S�����m��$��g����������]�ݲ�����������W��N�ٵ�����Z�܋����,�ү��x�O
+���RtRNS�����������������������������������������������������������������������������������]���(�IDATx���v�0��
�~PXa4�nc�&���Z&��!fqr�$���G���S�cK��_u~��M����e���̶Z.<;�`���	^+��R0��V|���S��CE9w�r�f���o*>9<+�����3�٬�,i{a��+��m�3�����s������������͟i���� !�#����H�������Z�����G��;�c��!�����x�w@��5&4��3�͟q�gj߿'����+�u������ӟ(�3�����E	�
�&��	@U���`Q�<s `����$�{�с��Z�
+��?��	�ZJ���	�D� �L�B`�W���D�75@� �'�+]���	����uT���@@�&����4؛��
+L�2����	@,�c��ͤ>]�_�$���`r�?��i	���&��	�����?)(M���`�@`�'��pE���7@��@@���v:�@U�m�0�
+�	��'��p��@`J�+��N�C�r��dQ�(�"��2�.�L�2�&���@	�����@Tp�9 ��m��@�<��V���0,�,����	�� M�~��"�&h�/M�‹@E
����] �&�7 ���Pj00�X��$����m�
+�@5
+�� ���xJJ��׀܀��&�z�PP"}����O{���>8�I������M�X��>	4�Q�@2s@�"б@Wh��d,�L�Ҟ�Y�?�Υ%� ��wH�@��1M�(ڌ����E]�Dĕ�����~�8���5:]�=��
�8T�:s2�b��h��4��i�`
+<�������U�I�lm@,u@FE K%P ���������%�:@,�
+@�'@�B`������S��@�*`	4;�%���	������@�(`0X�P���
+@�ij�%�S�����W`3�c��~
+<8���?Xu�O�6 F��P��; �G���t���`:��(��S�	@��p�P������$��g�^�8�VJ�c� ��Z���@�	����; �C`����Q��
+�Q�&�,�(��@�C`�S�	���|�
+(x
+<�耨��#�a@,�(��K�u��
+�@�_�V�"��� ��PT����F
+@�h�h��h���m�@\��@.(��r�,��?_�h
@�����o�t�z�`�O���T���(��	@1���U������:`��������c���@1۝ٯ�鬕ڮ����^�V/^���
����N�18�n}c
+����O�x�y0�x�9�W���ºB�>�x"�l��:�8���8~�L?0�#�$�$% R�X��17i*
�E�H�Zj_k������&w�޳7���7<gd����>w��oG���&w��Z*W�K���'^�6����9̢����	�r�d��y�]ì%��f`�7U:�Q��=���w��zf�l�-���	�~dnq�0 �?��MO����乾���l@il��?����o�f.��t,3T8yQ�J�w
+3��!8`t��E�o�z�{�f�R7T+���8G����%�L�
+UpF�ʿ@d���&������!�$	45.I,��$�Ps�;��L��[����rh������l���?I��7 ���pֵ�,Ԡ$WOB����eЙ	���H$��:�ch�����$�]�?��w�nH��Wpt|9;�z��+�
+SI4������
 p�/̺�t�
��S ��L�th.����g@R��;��`���t%O�����6�x�}�����X�JEc��һ
�T�ǁ�d?��\����I���:>�.��$�
��.�@c�* ��_�	,����(�I�=�Hm(6W�6	�9��;���3i�h&��1��ZQ��?����=j?q��0A�ϥ��Y6���})�����p��[@�D�h���rH��c�>��+w�'��^����2����ܭ�>G.N
+�PM��#P�N�G�OVA�B�	��(�<��a�0J�+V���2��g�2���&`x7�u����xc�VX�ٺ�_p}P��S@yɭ�B@�*�R���&�j
�(�C��~7(��m�~�S	P1�S�	����ry9��Q��)
+��-@yƕM�C�=����}N��/�g�Ů���^�ZBik�#��6���@y�-ô ���ƌ*�47�9k�5s ֶ�sM�$��Tß�o����]��@�_����$Hd5��V�O�d�Ca���x(�.��?���ֿ8�D-N7d58��}�(ۭTqX�>�
+��ipƑ$�w�W|yU;hMe����'�K<!�`��@Ҁ�Fꟛk��FN;��(��~�z�'�[0�	 8��<,����I��u����ЎGX�-]AFQϢT�����
+�Ҏ����[�h	F�z������{�a��>��8�t�y�+E�`d�À� 	��
�V	�yeK1�=
+\w�W�Vl
&�_��HwA�nA�#ٰQ�K�2s����w��FG1��|(�KP:����\��I�$�	@�<�A`���n/�_l52�iL��
��V����02��w>�w�X�?����6���F�`� ������Y�$`x������_�1k�Q��O�B��.~��`���r��[l&��|�;�@F�3�(����#Q�q��5@�:�����V������� �$ xE_���ŵr��.�~[��8���Y�`�}@j:8�ں
v���q�����s���L�fѷ4����.�C�����E��,��ϻu���LE�e¿T���m�k�L�S�m�?�}lEG1*
+z��-������^������M�������G/FG1���0�����^�{�UT������v5��qŨ�@��Ph��4�x%۷����J����yB�hq<��a�] �f,��	�s�x��u��p6FQ��]wȈ� *�0�V�`����`�`�"NA`Ȣ=�ӋGn�?~��9���~f�L3
+|��'	4X���G�<������|��Z�s��_����D�m�hfA��#��(x<��e�)�4�1kY���60	�U�;�"
�^@4��Y������3������ 3/0X�'�H�`���@f=�y
+(m�W�>q�S���Mȿ\O����x�&:���>2�;����s�@��+@��(p�O����������+��Ts��a'�s���s��+la౓��8��j�tֿC*.@��A_����y<�~n�l������EtS�_0���ih��B�S�>�G���c^���^��/o�G��=�(2�)�>px���A����?�����_�=����7��@�jd2��Q��_3j,�x�q�~�1?�v;�F����C��Q,`�8ujd&:��fв\�ڥ�'�҇���B#\�W@Ix S�_<���;��J��,���p��5�9�紎��Z?�\�At���Q����f��|02�!���}�EG\�At��)L]���-��"Q������'����ޭ�qP��FGI@[�� S�%A��Z�@D����R,@�s����-z�%�MX��b�@���E_x�C�7�"
+�9�L�B���~ih|��Ŕ�`�[ޗ��	�O	�;&@�8����~}Xgy���(����
+2�ӝQ��R�u��q���;�n�۰F�˻�)@�29_xnZ�Oo���ς�~����y	(o�ٝ��!vBÔ��2)�]�	�A��J���^�px���ۺ���ڌ�bx�����.�T�
+�g]	�z
+����v�+Fv���rtS�_-��]��gs���F8	��[ݫ?v����t;��?�8M��@�i���v�ɷ���i72�)���,����[j���DD7	����E�
+��	�G��Ô�d@��_�R�سx5�Q��<���?渇���+��� 
2�X��
+��
+2ע��b��y��^ȃ����Gxd��0�����/�-��'����E=�s ���.�L3������8+���БLYAd���p��$ȼ�jX�S����.o/:�)�/X/�k���H��� �(n/2�)�/(¬T��/����H�v���z�y֢�X{�� 6�Uz-��� s!�A`a��M���(��T=a=��5@xe���{zFS
��O���f�t@8� 0J��r�]}K�Q,���ɐF��(�2G�L
��vK�*D�=�I�'_��^����F�@{��n]yR��<:�z�sȤ�����Vt@��o���p���������z ��*�\���Л5t#0���(\��q@(8�?� ӼY�ޮ��$�M��iXp����v�D��/#�J5lP���1��b ȭc�?�R�$��~�����-�84��Q,x��>fz)����p1�@5mҍ���GG1���g�a��0� u�Q�" t#�I�9
S׿u`
���	����9���ĝߺ����/,H�N2��q����+��� 0�����(<���X�NO�t��\�1z�7�F`}L��X`�y2=����4rI�-��o�����	�����l�`�7@h\���hW�G\e��%�"Y|-^�z"��+��DT����X��(F����`,[���_�^�r@�!Nt#��O!T4L)���s���0��
g�R4@���� ���1��b�� �L�c�p������ G����(FM��2����$>�}� ��i� �����h)�\��$P����y[@���)���n�k�K�:�y���&�e���;Vj�R��Z� ���75����(4��>��ʜ�)Z��ʓ�E�� /t���.7���(F@���Բ.`P��GR��a���-i�6E}%�#�����R�u'���r4 �����i�t�T�����Wpp^���н9���V��Z:��P�%�gx��
+�
�ً�1�@��#<��j��6:�I��$��R�;�.`�8�h
+@��]�8���p[t�d�'�A����%p��Km����w�����b����b����WAAf޶�Lz��A4����'�+
+�j�4�7�>5��[I�)�!`��b�>�"�J;� ����ѝ-�u����=���^��3�d�c�=�n�z����՛�Jg�������_��zk�pz��w�yU����٪�H
�z���t}��-�IY
YxYp�_o�pu�@o���l�oY��XD�b����k�
+�[��Q������d��5`����w�2����:$�oETg�8�-�]�ڊ�0�C�Ρp����U��]��QTg�(��`wƛ�C�,�
+��Q�W��Q��}��7]�����V�F�P�p�V��{��k�:��P�*�Ҩb�ǩ����f7|= ��	^����(�;���Ϡ��kg�C����Ŏp�K��h(����P��������^Uu��4��ڄ�o����j ����z��W�Ҩ�`(���5����=�He���P�
+�g�2{�j���b��7��p/
�K���S����P��K�EM���K��T_'j�y8����G��k�:���P�
+�g�an`�����?�:��[ Ϋ,q�ӳƪ�H���@/Ϡ.��
߸��O��zuy�C�����W�
+�C��UA��Aݺ.\���J�>�J],���͡n+!lm�9���+H��� ϧ���0�9��A��Hu���4~�O]�73�"��~��\�);�����(*��-�Ԯ�4�k�'a�?��E���(��*�og`��PV�YA��(�g����C�c�l-�Q�O"����>�+���V���?E���J�h�:�/M���PH���l"��|)��U�_��wg$�U�G�� �v���=��Eke�'B[~�%��%W�&����9���ю�V��#��\����������`+�"����{�Zs�Ջ�@�x��X��?�CT���g��:�F�^����6�JED�{�Db�M�r�r3qpa?E%����+��sw��.��L�C������h�s%����:�K#4���F[���G#�8�M>�������si�+��}���4������
+���eDQ�.W*?���|���@���{
+�CmN���z�i9DO��D5��L���`߅��z���&����G*�ڎ^Ȭ�)��oz�9H�7���e��W��z�r��'���6�}H�m�b�8r��Jgѐ[{����ow�:�7u9�(�U�t���H��ߺ{�,�bY��.B)�_�!��"i�M�i�p
+�����4�,�"����C*�/@�=��a[d��>H�b���
i�m�����'!��pV�{2)͖���m����8�p6�z��-�E��UA�
+����.��l�L�{��!�%@s�2�"��PrRw�4ې�ْx�n�MA:H����l�*�os�o��V�?����G�^�-2
����$�hB*�-2
������o�I�8���˶�6�89HC=bk�&�"���tAJ%@Q�Td[d�>������P��x��O�E��9i�=	��
+�'l�l��i/	��.H�l�l���?I���3��-���4�y��� e�-�Y�tҁ\�{�`��(������x���}+�#���L@1Q���@}[�����8�89H�$��!�������`4z@�Z�􎍑>��^�i�4�p7���m�(�q�p@��$�iH��Y�Ҷ�0��$��v��l��@�H�$���
)����8�8W�J�)��z��zH>��m9HWB]�_؃����:����^H�a��O,B�ckd��K^C*$��e��@kd��K�Cz�&P�ng m�5��%m��2c��������p�j�ѐ7��V�t�͑�ڲ�വ�-@�0�$�Y�����<��?_@�O�	=�v������;	����/��<�8Ð�:��Pa�[l�����鸞M��*!�����U��e =s�w����6���������P�R�#���~�uHw�3 ݇��#�- Y>�F�$�[�O��#����O�P�ƳD��g@{d�$��;� �'+@�v ���!�8��v��p�y��<���"���P�
+�+��L�l�MA1��25,�d�dh�Z�-���@MU��/YSo1M���3_@"���P<��!�
+��"�D�C)(
+I��`R���@@	�X�ӯ���[P,�dtD6��C�*��&��Y��GPl&�/y�M��Z�-=�8YHo���|wR/�AV@6��@���p�M����'�^2~��A~��fݮ�b?�
(:�2[�M��P���
+��E?{B���
+z�B����;�xƞ�Y��U�o��*���u���*���	���ڱ�vb;^�b�}!�� �@�t/Z|��w����m�&�WPd\#~|�";�^
2�V�,y�w���{C���M(v�x�Ϡ�`o�[�p?ܟ��I|�ϋP��?d�dX7������B�g���^^�b�>�Uٻ�Y��zo�]���4k�������=��<4�#2
��	�%4�K�w����c���y��<�Q�#�D�[@�
+�!4E����|�m��E`�9(:s��B��^��!��*�4r�L/C�"�3 z�4�K7��t�_d��&�hV9f�e�޶��0������w]��k�>���D9#��D����-Z��@��I�A&fv�亐�	w���ŗ&d�9�/WBrd��[ sO?�]�y\��� o�@&r,��<����� o=-B�V��Q2�6r6�ȫ�;�I���A��� D��� ����\r9�d�-�dS��"d"O�u���g2��q2s���!��#���	��?�	]�!�	����E8�L�9p>�!�x����;�=H��B�q���y��=���U�	HA��gH}��lPR%�)���:W�T�%� ��)�#�i�qH�j������T�ӛB��"U�٫7��U��I^��(�Lv�����`^���@x�uR{a���K�{HE��G]� {����`�#�<:�C�P(Cπ�7�����8�r7OB��k�V?X�ƺ��`x�d�-;`���+.#��	�HQ�X
+� 7�ܒ�qr7B!r3�H�!W�Xm����:���� Ձ���S���r����`��8����R�b��;�@.�ـ^r�k����*0�
+�E�|�v���|�ydDp�����9hr5��=��@�*<�����G�/��9�V��^�@�Aʡ����s������
�6o�}@n����5�̆`$# ��\jF�Z_Zy�Ƣ����[@r�$��4�\G`$��!�l��Pn��	��mL�0k
+��
+��� ���M�4�}�����k�"T���
��!��uZ��nK�&|c6��d�-@�Cq&�̍�206�kI��\6C1.7�͜���M�/��9�iƆl.��Mo`,��2u4��5�0��fc���<��W�a���o��|{:H�`"�+����TI�XZ���>L$�+��� ?��`��~o���4��wȱ�/bK?a����jf��ο N`�f�5�O�<�D�]�����T����"7��+�!�x��Zf"<?1��S]�w/r�̦r�2�v��3�;ay�]W���v��0/(�~'܉�ܜ�o�٭���i��s
+T{X��$X"��@����\�˜�y#�5�x]��!�`�hk����R�8�H��<:�.3
+����N�j��o�N�q�9�j_���FB��Jku>��!���"��J#��i���|DL�����k
+��������"������N��.]l �����
���Cl�۾�&��}����Ў���PIb�Ka�?c3gS��n���Ѻ�f�*O�i�a���a��V�?���*7L`3ɻ��i�3��2\*M�������1�M��#.��(6/-����~asݳQ_�V�3�a��C+�#�@һ���^U�H��� "���*�|q�����d886�[�z�ܱ^�{�t�o���(69�d�b;͟�8�:���w�E�x�_$a]||�k���A{VL���-�g�U�I�xsY�vb'���Q6%L�/�?�&Il)�K�{En����܇��zcخ��׭gGG�����Y�B1ر�iLm3�����&\那�>���(���j���UA���m����?�F��ՂO�%�Y���z��6ӡ���r�����v�ۚ����uM���?�bM�{�+�1��Hu�P��ղ���V]ϢP#�`?���V}��}{em��
+2��V���._��x�}m�>i�ީ���t��{���<����-�q�YO㧾H����Q���s������32��&���SO�	��#���H�-����(v)?+�x��,��
��K5��(v�Q�r?ڭ�����N�>��]�6�x�ck�� ��v�!X��4j#��{�E��r��J�Qߏc�X��hW������ ��ݵTv�+~���K�gœ�Ii<��
��4[��ȶC�V����	�_��o�a��0����AX@�+@A��E`A��@���}A��9�RP�8�p��(��FA��7
+��)����4
l%�>��f@|.��96U�5��H�� ��\�|N����v��@������lAqg6��,1�I ��7��9��H�~p7�8'��@��8'��&��&��f�m�H�@�,�m3���j�����&ж	����|j��h��m��6�6�6@�̿m�m�m���j����N$��&�B�����IEND�B`�
\ No newline at end of file
diff --git a/web/modules/redirect/migrations/d6_path_redirect.yml b/web/modules/redirect/migrations/d6_path_redirect.yml
index 8de3bef31f106d1d5c0d8d235db31df97a5f1f26..6e1e96e579064d0bc7941353fb38dfc14b245c25 100644
--- a/web/modules/redirect/migrations/d6_path_redirect.yml
+++ b/web/modules/redirect/migrations/d6_path_redirect.yml
@@ -11,8 +11,8 @@ process:
   redirect_redirect:
     plugin: d6_path_redirect
     source:
-        - redirect
-        - query
+      - redirect
+      - query
   language:
     plugin: default_value
     source: language
diff --git a/web/modules/redirect/modules/redirect_404/redirect_404.info.yml b/web/modules/redirect/modules/redirect_404/redirect_404.info.yml
index e082a0c930d9f448d04afb61aa96f2783aeef605..e8877662707c921a2848cec9ccaa30c5c6c99426 100644
--- a/web/modules/redirect/modules/redirect_404/redirect_404.info.yml
+++ b/web/modules/redirect/modules/redirect_404/redirect_404.info.yml
@@ -1,14 +1,14 @@
 name: 'Redirect 404'
 type: module
 description: 'Logs 404 errors and allows users to create redirects for often requested but missing pages.'
-core_version_requirement: ^9.2 || ^10
+core_version_requirement: ^9.2 || ^10 || ^11
 configure: redirect_404.fix_404
 
 dependencies:
- - redirect:redirect
- - drupal:views
+  - redirect:redirect
+  - drupal:views
 
-# Information added by Drupal.org packaging script on 2023-08-30
-version: '8.x-1.9'
+# Information added by Drupal.org packaging script on 2024-08-10
+version: '8.x-1.10'
 project: 'redirect'
-datestamp: 1693393511
+datestamp: 1723277645
diff --git a/web/modules/redirect/modules/redirect_404/redirect_404.module b/web/modules/redirect/modules/redirect_404/redirect_404.module
index f7deb99d16d2f7a6f966ebc98478fd0b76bcb9f2..ce539beb7995d3d66dee7e30cc2d5812beb51309 100644
--- a/web/modules/redirect/modules/redirect_404/redirect_404.module
+++ b/web/modules/redirect/modules/redirect_404/redirect_404.module
@@ -41,7 +41,7 @@ function redirect_404_form_redirect_settings_form_alter(&$form, FormStateInterfa
     '#title' => t('404 error database logs to keep'),
     '#default_value' => $config->get('row_limit'),
     '#options' => [0 => t('All')] + array_combine($row_limits, $row_limits),
-    '#description' => t('The maximum number of 404 error logs to keep in the database log. Requires a <a href=":cron">cron maintenance task</a>.', [':cron' => Url::fromRoute('system.status')->toString()])
+    '#description' => t('The maximum number of 404 error logs to keep in the database log. Requires a <a href=":cron">cron maintenance task</a>.', [':cron' => Url::fromRoute('system.status')->toString()]),
   ];
 
   $form['reset_404'] = [
diff --git a/web/modules/redirect/modules/redirect_404/src/Controller/Fix404IgnoreController.php b/web/modules/redirect/modules/redirect_404/src/Controller/Fix404IgnoreController.php
index 06eda0bd76d0b7c2334e0a145c0ea2c5d20d998b..8317b69cd7ddbf0031598caf3f64d4ac348a3ad1 100644
--- a/web/modules/redirect/modules/redirect_404/src/Controller/Fix404IgnoreController.php
+++ b/web/modules/redirect/modules/redirect_404/src/Controller/Fix404IgnoreController.php
@@ -63,7 +63,6 @@ public function ignorePath(Request $request) {
     $editable = $this->configuration->getEditable('redirect_404.settings');
     $existing_config_raw = $editable->get('pages');
     $path = $request->query->get('path');
-    $langcode = $request->query->get('langcode');
 
     if (empty($existing_config_raw) || !empty($path) || !strpos($path, $existing_config_raw)) {
       $this->redirectStorage->resolveLogRequest($path);
diff --git a/web/modules/redirect/modules/redirect_404/src/EventSubscriber/Redirect404Subscriber.php b/web/modules/redirect/modules/redirect_404/src/EventSubscriber/Redirect404Subscriber.php
index 2ae545e630d2273989468cc1d4bad2631bd6e2c7..003c69c9f80fc01405a7f320a19565b4fb3b5c49 100644
--- a/web/modules/redirect/modules/redirect_404/src/EventSubscriber/Redirect404Subscriber.php
+++ b/web/modules/redirect/modules/redirect_404/src/EventSubscriber/Redirect404Subscriber.php
@@ -88,7 +88,7 @@ public function __construct(CurrentPathStack $current_path, PathMatcherInterface
   /**
    * {@inheritdoc}
    */
-  public static function getSubscribedEvents() {
+  public static function getSubscribedEvents(): array {
     $events[KernelEvents::EXCEPTION][] = 'onKernelException';
     return $events;
   }
@@ -96,7 +96,7 @@ public static function getSubscribedEvents() {
   /**
    * Logs an exception of 404 Redirect errors.
    *
-   * @param ExceptionEvent $event
+   * @param \Symfony\Component\HttpKernel\Event\ExceptionEvent $event
    *   Is given by the event dispatcher.
    */
   public function onKernelException(ExceptionEvent $event) {
diff --git a/web/modules/redirect/modules/redirect_404/src/Form/RedirectFix404Form.php b/web/modules/redirect/modules/redirect_404/src/Form/RedirectFix404Form.php
index 7e01d1af587a556f9a0b856b7eda7c5113d1e8d9..92c4aa53d6a70442b2a355f72204c701e2fbf41f 100644
--- a/web/modules/redirect/modules/redirect_404/src/Form/RedirectFix404Form.php
+++ b/web/modules/redirect/modules/redirect_404/src/Form/RedirectFix404Form.php
@@ -167,7 +167,7 @@ public function buildForm(array $form, FormStateInterface $form_state) {
       $rows[] = $row;
     }
 
-    $form['redirect_404_table']  = [
+    $form['redirect_404_table'] = [
       '#theme' => 'table',
       '#header' => $header,
       '#rows' => $rows,
diff --git a/web/modules/redirect/modules/redirect_404/tests/src/Functional/Fix404RedirectUILanguageTest.php b/web/modules/redirect/modules/redirect_404/tests/src/Functional/Fix404RedirectUILanguageTest.php
index 3a079a4346ee09c68d60f81f07d17ea86ccdd81e..4af5a0205b7b9f2e3f03f7a954ac2cfd39d68c6f 100644
--- a/web/modules/redirect/modules/redirect_404/tests/src/Functional/Fix404RedirectUILanguageTest.php
+++ b/web/modules/redirect/modules/redirect_404/tests/src/Functional/Fix404RedirectUILanguageTest.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace Drupal\Tests\redirect_404\Functional;
 
 use Drupal\Component\Utility\UrlHelper;
@@ -122,7 +124,7 @@ public function testFix404RedirectList() {
     $this->drupalGet('admin/config/search/redirect/404');
     $this->assertLanguageInTableBody('French');
     // Check the error path visit count.
-    $this->assertSession()->elementTextContains('xpath', '//table/tbody/tr/td[2]', 2);
+    $this->assertSession()->elementTextContains('xpath', '//table/tbody/tr/td[2]', '2');
     $this->clickLink('Add redirect');
     // Save the redirect with a different langcode.
     $this->assertSession()->fieldValueEquals('redirect_source[0][path]', 'testing');
diff --git a/web/modules/redirect/modules/redirect_404/tests/src/Functional/Fix404RedirectUITest.php b/web/modules/redirect/modules/redirect_404/tests/src/Functional/Fix404RedirectUITest.php
index ca318ff260d62deeba55015d3d826ab6f19cb56d..86928b3ebad006a547b52f4ed42374cc11acc8cd 100644
--- a/web/modules/redirect/modules/redirect_404/tests/src/Functional/Fix404RedirectUITest.php
+++ b/web/modules/redirect/modules/redirect_404/tests/src/Functional/Fix404RedirectUITest.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace Drupal\Tests\redirect_404\Functional;
 
 use Drupal\Component\Utility\UrlHelper;
@@ -177,7 +179,7 @@ public function testIgnorePages() {
     $this->drupalGet('admin/config/search/redirect/settings');
     $xpath = $this->xpath('//*[@id="edit-ignore-pages"]')[0]->getHtml();
     // Check that the new page to ignore has been saved with leading slash.
-    $this->assertSession()->elementContains('css', '#edit-ignore-pages', '/'. $nodes_to_ignore);
+    $this->assertSession()->elementContains('css', '#edit-ignore-pages', '/' . $nodes_to_ignore);
     $this->assertSession()->elementContains('css', '#edit-ignore-pages', $terms_to_ignore);
     $this->assertSession()->elementNotContains('css', '#edit-ignore-pages', $node_to_ignore);
     $this->assertSession()->elementNotContains('css', '#edit-ignore-pages', $path_to_ignore);
@@ -226,8 +228,7 @@ public function testIgnorePages() {
   }
 
   /**
-   * Tests the redirect ignore pages for users without the 'administer redirect
-   * settings' permission.
+   * Tests the redirect ignore pages for users without the 'administer redirect settings' permission.
    */
   public function testIgnorePagesNonAdmin() {
     // Create a node.
diff --git a/web/modules/redirect/modules/redirect_404/tests/src/Functional/Redirect404LogSuppressorTest.php b/web/modules/redirect/modules/redirect_404/tests/src/Functional/Redirect404LogSuppressorTest.php
index 6cb317dff8cc3fadccc045cec8ea9cb959db97d2..b8c2332a3096549ff800dbf2372d41148959424d 100644
--- a/web/modules/redirect/modules/redirect_404/tests/src/Functional/Redirect404LogSuppressorTest.php
+++ b/web/modules/redirect/modules/redirect_404/tests/src/Functional/Redirect404LogSuppressorTest.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace Drupal\Tests\redirect_404\Functional;
 
 use Drupal\Core\Database\Database;
@@ -80,4 +82,5 @@ public function testSuppress404Events() {
     $this->assertEquals(2, Database::getConnection()->query("SELECT COUNT(*) FROM {watchdog} WHERE type = 'access denied'")->fetchField());
 
   }
+
 }
diff --git a/web/modules/redirect/modules/redirect_404/tests/src/Functional/Redirect404TestBase.php b/web/modules/redirect/modules/redirect_404/tests/src/Functional/Redirect404TestBase.php
index 45114d43f0aea540c7e0413dec05e9af3abe2350..0c9b7ad108003b5fddb3d6eb81ded6ba04aa4012 100644
--- a/web/modules/redirect/modules/redirect_404/tests/src/Functional/Redirect404TestBase.php
+++ b/web/modules/redirect/modules/redirect_404/tests/src/Functional/Redirect404TestBase.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace Drupal\Tests\redirect_404\Functional;
 
 use Drupal\Tests\BrowserTestBase;
diff --git a/web/modules/redirect/modules/redirect_404/tests/src/Kernel/Fix404RedirectCronJobTest.php b/web/modules/redirect/modules/redirect_404/tests/src/Kernel/Fix404RedirectCronJobTest.php
index ea4e98e4494b3910017f20623e43f042b9169c4a..4dd297147734978bad8788ce005208b5fe27c1b0 100644
--- a/web/modules/redirect/modules/redirect_404/tests/src/Kernel/Fix404RedirectCronJobTest.php
+++ b/web/modules/redirect/modules/redirect_404/tests/src/Kernel/Fix404RedirectCronJobTest.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace Drupal\Tests\redirect_404\Kernel;
 
 use Drupal\KernelTests\KernelTestBase;
@@ -38,7 +40,7 @@ protected function setUp(): void {
   /**
    * Tests adding and deleting rows from redirect_404 table.
    */
-  function testRedirect404CronJob() {
+  public function testRedirect404CronJob() {
     // Set the limit to 3 just for the test.
     \Drupal::configFactory()
       ->getEditable('redirect_404.settings')
@@ -78,7 +80,7 @@ function testRedirect404CronJob() {
   /**
    * Tests adding rows and deleting one row from redirect_404 table.
    */
-  function testRedirect404CronJobKeepAllButOne() {
+  public function testRedirect404CronJobKeepAllButOne() {
     // Set the limit to 5 just for the test.
     \Drupal::configFactory()
       ->getEditable('redirect_404.settings')
@@ -118,7 +120,7 @@ function testRedirect404CronJobKeepAllButOne() {
   /**
    * Tests resetting the daily counts in the redirect_404 table.
    */
-  function testRedirect404CronJobDailyCountReset() {
+  public function testRedirect404CronJobDailyCountReset() {
     // Check that there are 2 rows with daily count value bigger than 0.
     $result = \Drupal::database()->query("SELECT COUNT(*) FROM {redirect_404} WHERE daily_count > 0")
       ->fetchField();
@@ -221,4 +223,5 @@ protected function assert404RowHelper($path, $langcode = 'en', $not_exists = TRU
       $this->assertEquals($path, $result);
     }
   }
+
 }
diff --git a/web/modules/redirect/modules/redirect_404/tests/src/Unit/SqlRedirectNotFoundStorageTest.php b/web/modules/redirect/modules/redirect_404/tests/src/Unit/SqlRedirectNotFoundStorageTest.php
index 424a4966c9ff85006b2c5e42a32253258c6fa592..eb9dc5eb454be36105042441d473b33b18ba739c 100644
--- a/web/modules/redirect/modules/redirect_404/tests/src/Unit/SqlRedirectNotFoundStorageTest.php
+++ b/web/modules/redirect/modules/redirect_404/tests/src/Unit/SqlRedirectNotFoundStorageTest.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace Drupal\Tests\redirect_404\Unit;
 
 use Drupal\Core\Database\Connection;
diff --git a/web/modules/redirect/modules/redirect_domain/redirect_domain.info.yml b/web/modules/redirect/modules/redirect_domain/redirect_domain.info.yml
index 0975acb25388dcb4f015eb9dd40964c651980f74..75e2953612d03a750048af3afc28fbf908acae65 100644
--- a/web/modules/redirect/modules/redirect_domain/redirect_domain.info.yml
+++ b/web/modules/redirect/modules/redirect_domain/redirect_domain.info.yml
@@ -1,13 +1,13 @@
 name: 'Redirect Domain'
 type: module
 description: 'Allows users to redirect between domains.'
-core_version_requirement: ^9.2 || ^10
+core_version_requirement: ^9.2 || ^10 || ^11
 configure: redirect_domain.domain_list
 
 dependencies:
- - redirect:redirect
+  - redirect:redirect
 
-# Information added by Drupal.org packaging script on 2023-08-30
-version: '8.x-1.9'
+# Information added by Drupal.org packaging script on 2024-08-10
+version: '8.x-1.10'
 project: 'redirect'
-datestamp: 1693393511
+datestamp: 1723277645
diff --git a/web/modules/redirect/modules/redirect_domain/redirect_domain.module b/web/modules/redirect/modules/redirect_domain/redirect_domain.module
index a8699ed9477fc309a592f0915526ae9d999f634d..cef637b868d49716fff05c3a4cd3ff76ea70be9e 100644
--- a/web/modules/redirect/modules/redirect_domain/redirect_domain.module
+++ b/web/modules/redirect/modules/redirect_domain/redirect_domain.module
@@ -1,11 +1,16 @@
 <?php
 
+/**
+ * @file
+ * The redirect domain module.
+ */
+
 use Drupal\Core\Routing\RouteMatchInterface;
 use Drupal\Core\Url;
 
 /**
-* Implements hook_help().
-*/
+ * Implements hook_help().
+ */
 function redirect_domain_help($route_name, RouteMatchInterface $route_match) {
   $output = '';
   switch ($route_name) {
@@ -16,6 +21,7 @@ function redirect_domain_help($route_name, RouteMatchInterface $route_match) {
       $output .= '<dt>' . t('Manage domain redirects') . '</dt>';
       $output .= '<dd>' . t('The domain redirect is accessed through <a href=":domainlist">Domain Redirects</a>. The user can add the domain redirects through the domain redirect table which consists of the domain from which it needs to be redirected, the sub path and the complete url destination to which it needs to be redirected. The module also supports the usage of a wildcard redirecting, thus many requests can be handled with one instance of domain redirect.', [':domainlist' => Url::fromRoute('redirect_domain.domain_list')->toString()]) . '</dd>';
       return $output;
+
     case 'redirect_domain.domain_list':
       $output = '<p>' . t('The domain redirect table consists of the domain from which it needs to be redirected, the sub path and the complete url destination to which it needs to be redirected.') . '</p>';
       $output .= '<h5>' . t('Example Configuration') . '</h5>';
diff --git a/web/modules/redirect/modules/redirect_domain/src/EventSubscriber/DomainRedirectRequestSubscriber.php b/web/modules/redirect/modules/redirect_domain/src/EventSubscriber/DomainRedirectRequestSubscriber.php
index 066869255eac7487e49ca08a6020672bcb5b3251..76f016a5f3060d20f88d6921fbb974ac5e126cb7 100644
--- a/web/modules/redirect/modules/redirect_domain/src/EventSubscriber/DomainRedirectRequestSubscriber.php
+++ b/web/modules/redirect/modules/redirect_domain/src/EventSubscriber/DomainRedirectRequestSubscriber.php
@@ -40,7 +40,7 @@ class DomainRedirectRequestSubscriber implements EventSubscriberInterface {
    *
    * @var \Drupal\Core\Config\Config
    */
-  protected  $redirectConfig;
+  protected $redirectConfig;
 
   /**
    * Constructs a \Drupal\redirect\EventSubscriber\RedirectRequestSubscriber object.
@@ -127,7 +127,7 @@ protected function setResponse(RequestEvent $event, Url $url) {
   /**
    * {@inheritdoc}
    */
-  public static function getSubscribedEvents() {
+  public static function getSubscribedEvents(): array {
     // This needs to run before RouterListener::onKernelRequest(), which has
     // a priority of 32 and
     // RedirectRequestSubscriber::onKernelRequestCheckRedirect(), which has
diff --git a/web/modules/redirect/modules/redirect_domain/src/Form/RedirectDomainForm.php b/web/modules/redirect/modules/redirect_domain/src/Form/RedirectDomainForm.php
index 46f1a6903e6c4869d235c957107e028280b405e2..a1dbad629e4385348ceb8248e23e28b755a2032c 100644
--- a/web/modules/redirect/modules/redirect_domain/src/Form/RedirectDomainForm.php
+++ b/web/modules/redirect/modules/redirect_domain/src/Form/RedirectDomainForm.php
@@ -18,8 +18,8 @@ public function getFormId() {
   }
 
   /**
-  * {@inheritdoc}
-  */
+   * {@inheritdoc}
+   */
   protected function getEditableConfigNames() {
     return [
       'redirect_domain.domains',
@@ -40,13 +40,12 @@ public function buildForm(array $form, FormStateInterface $form_state) {
       '#header' => [
         $this->t('From domain'),
         $this->t('Sub path'),
-        $this->t('Destination')
+        $this->t('Destination'),
       ],
       '#prefix' => '<div id="redirect-domain-wrapper">',
       '#suffix' => '</div>',
     ];
 
-    $rows = [];
     // Obtain domain redirects from configuration.
     if ($domain_redirects = $this->config('redirect_domain.domains')->get('domain_redirects')) {
       foreach ($domain_redirects as $key => $value) {
@@ -54,7 +53,7 @@ public function buildForm(array $form, FormStateInterface $form_state) {
           $form['redirects'][] = [
             'from' => [
               '#type' => 'textfield',
-              '#value' => str_replace(':','.',$key),
+              '#value' => str_replace(':', '.', $key),
             ],
             'sub_path' => [
               '#type' => 'textfield',
@@ -154,7 +153,7 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
           $redirect['from'] = str_replace('.', ':', $redirect['from']);
           $domain_redirects[$redirect['from']][] = [
             'sub_path' => '/' . ltrim($redirect['sub_path'], '/'),
-            'destination' => $redirect['destination']
+            'destination' => $redirect['destination'],
           ];
         }
       }
@@ -163,4 +162,5 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
     $domain_config->save();
     $this->messenger()->addMessage($this->t('The domain redirects have been saved.'));
   }
+
 }
diff --git a/web/modules/redirect/modules/redirect_domain/tests/src/FunctionalJavascript/RedirectDomainUITest.php b/web/modules/redirect/modules/redirect_domain/tests/src/FunctionalJavascript/RedirectDomainUITest.php
index 40d04699517614c5073bb47afbbf57e9ddef05b9..ed3403aac2badbd1fb0e641f094bba3c07223c07 100644
--- a/web/modules/redirect/modules/redirect_domain/tests/src/FunctionalJavascript/RedirectDomainUITest.php
+++ b/web/modules/redirect/modules/redirect_domain/tests/src/FunctionalJavascript/RedirectDomainUITest.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace Drupal\Tests\redirect_domain\FunctionalJavascript;
 
 use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
@@ -32,7 +34,7 @@ public function testDomainRedirect() {
     $user = $this->drupalCreateUser([
       'administer site configuration',
       'access administration pages',
-      'administer redirects'
+      'administer redirects',
     ]);
     $this->drupalLogin($user);
     $this->drupalGet('/admin/config/search/redirect/domain');
@@ -66,4 +68,5 @@ public function testDomainRedirect() {
     $this->assertSession()->fieldValueEquals('redirects[0][sub_path]', '/sub-path');
     $this->assertSession()->fieldValueEquals('redirects[1][sub_path]', '/');
   }
+
 }
diff --git a/web/modules/redirect/modules/redirect_domain/tests/src/Unit/DomainRedirectRequestSubscriberTest.php b/web/modules/redirect/modules/redirect_domain/tests/src/Unit/DomainRedirectRequestSubscriberTest.php
index 28884512ea0b063e18b386b3e4291b873840c41a..2efde626fd02d83b6d9587f79c830b1857a3dd9c 100644
--- a/web/modules/redirect/modules/redirect_domain/tests/src/Unit/DomainRedirectRequestSubscriberTest.php
+++ b/web/modules/redirect/modules/redirect_domain/tests/src/Unit/DomainRedirectRequestSubscriberTest.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace Drupal\Tests\redirect_domain\Unit;
 
 use Drupal\Core\Path\PathMatcher;
@@ -18,7 +20,7 @@
  *
  * @group redirect_domain
  *
- * @coversDefaultClass Drupal\redirect_domain\EventSubscriber\DomainRedirectRequestSubscriber
+ * @coversDefaultClass \Drupal\redirect_domain\EventSubscriber\DomainRedirectRequestSubscriber
  */
 class DomainRedirectRequestSubscriberTest extends UnitTestCase {
 
@@ -126,14 +128,14 @@ public function testDomainRedirect($request_url, $response_url) {
    * @param $query_string
    *   The query string in the url.
    *
-   * @return RequestEvent
+   * @return \Symfony\Component\HttpKernel\Event\RequestEvent
    *   The response for the request.
    */
   protected function getGetResponseEventStub($path_info, $query_string) {
     $request = Request::create($path_info . '?' . $query_string, 'GET', [], [], [], ['SCRIPT_NAME' => 'index.php']);
 
     $http_kernel = $this->createMock(HttpKernelInterface::class);
-    return new RequestEvent($http_kernel, $request, HttpKernelInterface::MASTER_REQUEST);
+    return new RequestEvent($http_kernel, $request, HttpKernelInterface::MAIN_REQUEST);
   }
 
   /**
@@ -155,4 +157,5 @@ public function providerDomains() {
     $datasets[] = ['http://wildcardtest.com/does-not-exist', 'http://wildcardredirect.com'];
     return $datasets;
   }
+
 }
diff --git a/web/modules/redirect/phpstan.neon b/web/modules/redirect/phpstan.neon
new file mode 100644
index 0000000000000000000000000000000000000000..20815509dfca2d5f2e7f3033477df75fcac35f62
--- /dev/null
+++ b/web/modules/redirect/phpstan.neon
@@ -0,0 +1,11 @@
+# Configuration file for PHPStan static code checking, see https://phpstan.org.
+includes:
+  - phar://phpstan.phar/conf/bleedingEdge.neon
+
+parameters:
+  level: 2
+  paths:
+    - .
+  ignoreErrors:
+    # new static() is a best practice in Drupal, so we cannot fix that.
+    - "#^Unsafe usage of new static#"
diff --git a/web/modules/redirect/redirect.drush.inc b/web/modules/redirect/redirect.drush.inc
deleted file mode 100644
index af728da72f048a33b0f4ce5dc9fc38df1103e8ff..0000000000000000000000000000000000000000
--- a/web/modules/redirect/redirect.drush.inc
+++ /dev/null
@@ -1,72 +0,0 @@
-<?php
-
-/**
- * @file
- * Drush integration for the redirect module.
- */
-use Drupal\Component\Utility\Environment;
-/**
- * Implements hook_drush_command().
- */
-function redirect_drush_command() {
-  $items['generate-redirects'] = [
-    'description' => 'Create redirects.',
-    'drupal dependencies' => ['devel_generate'],
-    'arguments' => [
-      'count' => 'Number of redirects to generate.',
-    ],
-    'options' => [
-      'delete' => 'Delete all redirects before generating new ones.',
-    ],
-  ];
-
-  return $items;
-}
-
-/**
- * Command callback. Generate a number of redirects.
- */
-function drush_redirect_generate_redirects($count = NULL) {
-  if (drush_generate_is_number($count) == FALSE) {
-    return drush_set_error('DEVEL_GENERATE_INVALID_INPUT', t('Invalid number of redirects.'));
-  }
-  \Drupal::moduleHandler()->loadInclude('redirect', 'inc', 'redirect.generate');
-  drush_generate_include_devel();
-  redirect_run_unprogressive_batch('redirect_generate_redirects_batch_info', $count, drush_get_option('delete'));
-}
-
-/**
- * Perform an unprogressive batch process for CLI.
- */
-function redirect_run_unprogressive_batch() {
-  $batch = batch_get();
-  if (!empty($batch)) {
-    // If there is already something in the batch, don't run.
-    return FALSE;
-  }
-
-  $args = func_get_args();
-  $batch_callback = array_shift($args);
-
-  if (!lock_acquire($batch_callback)) {
-    return FALSE;
-  }
-
-  // Attempt to increase the execution time.
-  Environment::setTimeLimit(240);
-
-  // Build the batch array.
-  $batch = call_user_func_array($batch_callback, $args);
-  batch_set($batch);
-
-  // We need to manually set the progressive variable again.
-  // @todo Remove when http://drupal.org/node/638712 is fixed.
-  $batch =& batch_get();
-  $batch['progressive'] = FALSE;
-
-  // Run the batch process.
-  batch_process();
-
-  lock_release($batch_callback);
-  return TRUE;
-}
diff --git a/web/modules/redirect/redirect.generate.inc b/web/modules/redirect/redirect.generate.inc
deleted file mode 100644
index e4e02676ec036159cb30c71ec09d307ab8306c1d..0000000000000000000000000000000000000000
--- a/web/modules/redirect/redirect.generate.inc
+++ /dev/null
@@ -1,195 +0,0 @@
-<?php
-
-/**
- * @file
- * Generate callbacks for the redirect module.
- */
-
-use Drupal\devel_generate\DevelGenerateBase;
-use Drupal\node\NodeInterface;
-use Drupal\redirect\Entity\Redirect;
-use Drupal\Core\Database\Database;
-
-/**
- * @file
- * Devel generate integration for the redirect module.
- */
-
-function redirect_generate_form() {
-  $form['count'] = [
-    '#type' => 'textfield',
-    '#title' => t('How many URL redirects would you like to generate?'),
-    '#default_value' => 50,
-    '#size' => 4,
-  ];
-  $form['delete'] = [
-    '#type' => 'checkbox',
-    '#title' => t('Delete all URL redirects before generating new URL redirects.'),
-    '#default_value' => FALSE,
-  ];
-  $form['submit'] = [
-    '#type' => 'submit',
-    '#value' => t('Generate'),
-  ];
-
-  return $form;
-}
-
-function redirect_generate_form_submit(&$form, &$form_state) {
-  // Run the batch.
-  $batch = redirect_generate_redirects_batch_info($form_state['values']['count'], $form_state['values']['delete']);
-  batch_set($batch);
-}
-
-function redirect_generate_redirects_batch_info($count, $delete = FALSE) {
-  if ($delete) {
-    $operations[] = ['redirect_generate_batch_delete', []];
-  }
-
-  $operations[] = ['redirect_generate_batch_generate', [$count]];
-
-  return [
-    'operations' => $operations,
-    'finished' => 'redirect_generate_batch_finished',
-    'file' => \Drupal::service('extension.list.module')->getPath('redirect') . '/redirect.generate.inc',
-  ];
-}
-
-function redirect_generate_batch_delete(array &$context) {
-  if (empty($context['sandbox'])) {
-    $context['sandbox'] = [];
-    $context['sandbox']['progress'] = 0;
-    $context['sandbox']['current_rid'] = 0;
-    $context['sandbox']['max'] = Database::getConnection()->query('SELECT COUNT(DISTINCT rid) FROM {redirect}')->fetchField();
-  }
-
-  $limit = 20;
-  $rids = Database::getConnection()->queryRange("SELECT rid FROM {redirect} WHERE rid > :rid ORDER BY rid", 0, $limit, [':rid' => $context['sandbox']['current_rid']])->fetchCol();
-  foreach (redirect_repository()->loadMultiple($rids) as $redirect) {
-    $redirect->delete();
-  }
-
-  // Update our progress information.
-  $context['sandbox']['progress'] += count($rids);
-  $context['sandbox']['current_rid'] = end($rids);
-  $context['message'] = t('Deleted URL redirect @rid.', ['@rid' => end($rids)]);
-
-  // Inform the batch engine that we are not finished,
-  // and provide an estimation of the completion level we reached.
-  if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
-    $context['finished'] = ($context['sandbox']['progress'] >= $context['sandbox']['max']);
-  }
-}
-
-function redirect_generate_batch_generate($num, array &$context) {
-  if (empty($context['sandbox'])) {
-    $context['sandbox'] = [];
-    $context['sandbox']['progress'] = 0;
-    $context['sandbox']['max'] = $num;
-    $query = \Drupal::database()->select('node', 'n');
-    $query->addField('n', 'nid');
-    $query->condition('n.status', NodeInterface::PUBLISHED);
-    $query->addTag('node_access');
-    $context['sandbox']['nids'] = $query->execute()->fetchAllKeyed(0, 0);
-  }
-
-  \Drupal::moduleHandler()->loadInclude('devel_generate', 'inc');
-
-  $limit = 20;
-  $types = array_keys(redirect_status_code_options());
-  $languages = \Drupal::moduleHandler()->moduleExists('locale') ? array_keys(\Drupal::languageManager()->getLanguages()) : [];
-
-  for ($i = 0; $i < min($limit, $context['sandbox']['max'] - $context['sandbox']['progress']); $i++) {
-    $rand = mt_rand(0, 100);
-
-    $redirect = Redirect::create();
-
-    $source = _redirect_generate_url();
-    $source_options = [];
-    $redirect_options = [];
-
-    if ($context['sandbox']['nids'] && $rand >= 40) {
-      $redirect_target = 'node/' . array_rand($context['sandbox']['nids']);
-    }
-    else {
-      $redirect_target = _redirect_generate_url(TRUE);
-      if ($rand <= 20) {
-        $redirect_options['query'] = _redirect_generate_querystring();
-      }
-      if ($rand <= 5) {
-        $redirect_options['fragment'] = DevelGenerateBase::generateWord(mt_rand(4, 8));
-      }
-    }
-
-    if ($rand <= 20) {
-      $redirect->setStatusCode($types[array_rand($types)]);
-    }
-
-    if ($languages && $rand <= 20) {
-      $redirect->setLanguage($languages[array_rand($languages)]);
-    }
-
-    $query = [];
-    if ($rand <= 30) {
-      $query = _redirect_generate_querystring();
-    }
-
-    $redirect->setSource($source, $query);
-    $redirect->setRedirect($redirect_target);
-
-    $redirect->save();
-
-    if (mt_rand(0, 1)) {
-    $query = \Drupal::database();
-    $query->update('redirect')
-      ->fields([
-        'count' => mt_rand(1, 500),
-        'access' => mt_rand(Drupal::time()->getRequestTime() - 31536000, Drupal::time()->getRequestTime()),
-      ])
-      ->condition('rid', $redirect->id())
-      ->execute();
-    }
-
-    $context['results'][] = $redirect->id();
-  }
-
-  // Update our progress information.
-  $context['sandbox']['progress'] += $limit;
-  //$context['message'] = t('Deleted URL redirect @rid.', array('@rid' => end($rids)));
-
-  // Inform the batch engine that we are not finished,
-  // and provide an estimation of the completion level we reached.
-  if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
-    $context['finished'] = ($context['sandbox']['progress'] >= $context['sandbox']['max']);
-  }
-}
-
-function redirect_generate_batch_finished($success, $results, $operations) {
-  if ($success) {
-    \Drupal::messenger()->addMessage(\Drupal::translation()->formatPlural(count($results), 'One URL redirect created.', '@count URL redirects created.'));
-  }
-  else {
-    // An error occurred.
-    // $operations contains the operations that remained unprocessed.
-    $error_operation = reset($operations);
-    \Drupal::messenger()->addMessage(t('An error occurred while processing @operation with arguments : @args', ['@operation' => $error_operation[0], '@args' => print_r($error_operation[0], TRUE)]));
-  }
-}
-
-function _redirect_generate_url($external = FALSE, $max_levels = 2) {
-  $url = [];
-  if ($external) {
-    $tlds = ['com', 'net', 'org'];
-    $url[] = 'http://www.example.'. $tlds[array_rand($tlds)];
-  }
-  $max_levels = mt_rand($external ? 0 : 1, $max_levels);
-  for ($i = 1; $i <= $max_levels; $i++) {
-    $url[] = DevelGenerateBase::generateWord(mt_rand(6 / $i, 8));
-  }
-  return implode('/', $url);
-}
-
-function _redirect_generate_querystring() {
-  $query = [DevelGenerateBase::generateWord(mt_rand(1, 3)) => DevelGenerateBase::generateWord(mt_rand(2, 4))];
-  return $query;
-}
diff --git a/web/modules/redirect/redirect.info.yml b/web/modules/redirect/redirect.info.yml
index 51f144337f514bb4928bbc41748a8634eaca6024..1e98375b09881d0201bf3749e7c0560cd62c24ae 100644
--- a/web/modules/redirect/redirect.info.yml
+++ b/web/modules/redirect/redirect.info.yml
@@ -1,15 +1,15 @@
 name: Redirect
 type: module
 description: Allows users to redirect from old URLs to new URLs.
-core_version_requirement: ^9.2 || ^10
+core_version_requirement: ^9.2 || ^10 || ^11
 configure: redirect.settings
 
 dependencies:
- - drupal:path_alias
- - drupal:link
- - drupal:views
+  - drupal:path_alias
+  - drupal:link
+  - drupal:views
 
-# Information added by Drupal.org packaging script on 2023-08-30
-version: '8.x-1.9'
+# Information added by Drupal.org packaging script on 2024-08-10
+version: '8.x-1.10'
 project: 'redirect'
-datestamp: 1693393511
+datestamp: 1723277645
diff --git a/web/modules/redirect/redirect.install b/web/modules/redirect/redirect.install
index 49aa39d8edcbf7e8e4603155cb26fdb159ffedb3..5ca6327d415ffef1be8e907ed9dad65a1d35c619 100644
--- a/web/modules/redirect/redirect.install
+++ b/web/modules/redirect/redirect.install
@@ -34,7 +34,7 @@ function redirect_update_8100(&$sandbox) {
     ->execute();
 
   foreach ($result as $row) {
-    $query = !empty($row->redirect_source__query) ? unserialize($row->redirect_source__query): [];
+    $query = !empty($row->redirect_source__query) ? unserialize($row->redirect_source__query) : [];
     $new_hash = Redirect::generateHash($row->redirect_source__path, (array) $query, $row->language);
     if ($row->hash != $new_hash) {
       // Do a direct query to speed things up.
@@ -51,7 +51,6 @@ function redirect_update_8100(&$sandbox) {
   $sandbox['#finished'] = empty($sandbox['max']) ? 1 : ($sandbox['progress'] / $sandbox['max']);
 }
 
-
 /**
  * Update the {redirect} table.
  */
diff --git a/web/modules/redirect/redirect.module b/web/modules/redirect/redirect.module
index 42371af4543cc07ba794c2628c5cda658a80c446..74bc4906c76d12ebf7b3c10afef36fddf9f85d1f 100644
--- a/web/modules/redirect/redirect.module
+++ b/web/modules/redirect/redirect.module
@@ -12,6 +12,7 @@
 use Drupal\Core\Url;
 use Drupal\path_alias\PathAliasInterface;
 use Drupal\redirect\Entity\Redirect;
+use Symfony\Component\Routing\Exception\MissingMandatoryParametersException;
 use Symfony\Component\Routing\Exception\RouteNotFoundException;
 
 /**
@@ -61,7 +62,6 @@ function redirect_help($route_name, RouteMatchInterface $route_match) {
       $output .= '<dd>' . t('The <a href=":settings">"Settings"</a> page presents you with a number of means to adjust redirect settings.', [':settings' => Url::fromRoute('redirect.settings')->toString()]) . '</dd>';
       $output .= '</dl>';
       return $output;
-      break;
   }
 }
 
@@ -77,7 +77,7 @@ function redirect_entity_delete(EntityInterface $entity) {
       redirect_delete_by_path('entity:' . $entity->getEntityTypeId() . '/' . $entity->id());
     }
   }
-  catch (RouteNotFoundException $e) {
+  catch (RouteNotFoundException | MissingMandatoryParametersException $e) {
     // This can happen if a module incorrectly defines a link template, ignore
     // such errors.
   }
@@ -211,7 +211,7 @@ function redirect_delete_by_path($path, $langcode = NULL, $match_subpaths_and_re
  * @param $callback
  *   The sorting callback to use (e.g. 'sort', 'ksort', 'asort').
  *
- * @return
+ * @return bool
  *   TRUE on success or FALSE on failure.
  */
 function redirect_sort_recursive(&$array, $callback = 'sort') {
@@ -234,7 +234,7 @@ function redirect_status_code_options($code = NULL) {
     305 => t('305 Use Proxy'),
     307 => t('307 Temporary Redirect'),
   ];
-  return isset($codes[$code]) ? $codes[$code] : $codes;
+  return $codes[$code] ?? $codes;
 }
 
 /**
@@ -242,7 +242,7 @@ function redirect_status_code_options($code = NULL) {
  *
  * Why the fuck do we have to do this? Why is there not an easier way???
  *
- * @return
+ * @return bool
  *   TRUE if the current page is a 404, or FALSE otherwise.
  */
 function redirect_is_current_page_404() {
@@ -250,7 +250,9 @@ function redirect_is_current_page_404() {
 }
 
 /**
- * Implements hook_form_FORM_ID_alter() on behalf of locale.module.
+ * Implements hook_form_FORM_ID_alter().
+ *
+ * (on behalf of locale.module)
  */
 function locale_form_redirect_edit_form_alter(array &$form, FormStateInterface $form_state) {
   $form['language'] = [
diff --git a/web/modules/redirect/redirect.services.yml b/web/modules/redirect/redirect.services.yml
index 578acb00b391b0c14372496d1deb59722d4e0ad9..2e8e36bc59076c4368b2feb8ef3a9bf0ce2a54c3 100644
--- a/web/modules/redirect/redirect.services.yml
+++ b/web/modules/redirect/redirect.services.yml
@@ -6,19 +6,21 @@ services:
     arguments: ['@entity_type.manager', '@database', '@config.factory']
     tags:
       - { name: backend_overridable }
+  Drupal\redirect\RedirectRepository: '@redirect.repository'
   redirect.checker:
     class: Drupal\redirect\RedirectChecker
     arguments: ['@config.factory', '@state', '@access_manager', '@current_user', '@router.route_provider']
+  Drupal\redirect\RedirectChecker: '@redirect.checker'
   redirect.request_subscriber:
     class: Drupal\redirect\EventSubscriber\RedirectRequestSubscriber
     arguments: ['@redirect.repository', '@language_manager', '@config.factory', '@path_alias.manager', '@module_handler', '@entity_type.manager', '@redirect.checker', '@router.request_context', '@path_processor_manager']
     tags:
       - { name: event_subscriber }
   redirect.settings_cache_tag:
-        class: Drupal\redirect\EventSubscriber\RedirectSettingsCacheTag
-        arguments: ['@cache_tags.invalidator']
-        tags:
-          - { name: event_subscriber }
+    class: Drupal\redirect\EventSubscriber\RedirectSettingsCacheTag
+    arguments: ['@cache_tags.invalidator']
+    tags:
+      - { name: event_subscriber }
   redirect.route_normalizer_request_subscriber:
     class: Drupal\redirect\EventSubscriber\RouteNormalizerRequestSubscriber
     arguments: ['@url_generator', '@path.matcher', '@config.factory', '@redirect.checker']
diff --git a/web/modules/redirect/src/Entity/Redirect.php b/web/modules/redirect/src/Entity/Redirect.php
index e2b6bafe7ca24dd836d9abe5f73bb2c6a125c396..494b94756c09518bd650b2b6cc01609f93e59c9f 100644
--- a/web/modules/redirect/src/Entity/Redirect.php
+++ b/web/modules/redirect/src/Entity/Redirect.php
@@ -60,6 +60,8 @@ class Redirect extends ContentEntityBase {
    *   Base 64 hash.
    */
   public static function generateHash($source_path, array $source_query, $language) {
+    // Remove leading and trailing slashes, and convert to lowercase.
+    $source_path = trim(mb_strtolower($source_path), '/');
     $hash = [
       'source' => mb_strtolower($source_path),
       'language' => $language,
@@ -249,7 +251,7 @@ public function getRedirectOptions() {
    */
   public function getRedirectOption($key, $default = NULL) {
     $options = $this->getRedirectOptions();
-    return isset($options[$key]) ? $options[$key] : $default;
+    return $options[$key] ?? $default;
   }
 
   /**
@@ -310,7 +312,7 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       ->setTranslatable(FALSE)
       ->setSettings([
         'link_type' => LinkItemInterface::LINK_GENERIC,
-        'title' => DRUPAL_DISABLED
+        'title' => DRUPAL_DISABLED,
       ])
       ->setDisplayOptions('form', [
         'type' => 'link',
diff --git a/web/modules/redirect/src/EventSubscriber/RedirectRequestSubscriber.php b/web/modules/redirect/src/EventSubscriber/RedirectRequestSubscriber.php
index 33206922d3cf7c4c22abeab3c94028316927a3db..7ff815f14447fbf1338ec5f73fcc6a33388128cb 100644
--- a/web/modules/redirect/src/EventSubscriber/RedirectRequestSubscriber.php
+++ b/web/modules/redirect/src/EventSubscriber/RedirectRequestSubscriber.php
@@ -25,7 +25,9 @@
  */
 class RedirectRequestSubscriber implements EventSubscriberInterface {
 
-  /** @var  \Drupal\redirect\RedirectRepository */
+  /**
+   * @var  \Drupal\redirect\RedirectRepository
+   */
   protected $redirectRepository;
 
   /**
@@ -87,8 +89,10 @@ class RedirectRequestSubscriber implements EventSubscriberInterface {
    *   The entity type manager.
    * @param \Drupal\redirect\RedirectChecker $checker
    *   The redirect checker service.
-   * @param \Symfony\Component\Routing\RequestContext
+   * @param \Symfony\Component\Routing\RequestContext $context
    *   Request context.
+   * @param \Drupal\Core\PathProcessor\InboundPathProcessorInterface $path_processor
+   *   The path processor.
    */
   public function __construct(RedirectRepository $redirect_repository, LanguageManagerInterface $language_manager, ConfigFactoryInterface $config, AliasManagerInterface $alias_manager, ModuleHandlerInterface $module_handler, EntityTypeManagerInterface $entity_type_manager, RedirectChecker $checker, RequestContext $context, InboundPathProcessorInterface $path_processor) {
     $this->redirectRepository = $redirect_repository;
diff --git a/web/modules/redirect/src/EventSubscriber/RedirectSettingsCacheTag.php b/web/modules/redirect/src/EventSubscriber/RedirectSettingsCacheTag.php
index 7dfb063b36e7bffc8d77bfc43336a3355223acb8..969e606a80e85b1de1ec5a4742de6b194fe2321d 100644
--- a/web/modules/redirect/src/EventSubscriber/RedirectSettingsCacheTag.php
+++ b/web/modules/redirect/src/EventSubscriber/RedirectSettingsCacheTag.php
@@ -46,7 +46,7 @@ public function onSave(ConfigCrudEvent $event) {
   /**
    * {@inheritdoc}
    */
-  public static function getSubscribedEvents() {
+  public static function getSubscribedEvents(): array {
     $events[ConfigEvents::SAVE][] = ['onSave'];
     return $events;
   }
diff --git a/web/modules/redirect/src/EventSubscriber/RouteNormalizerRequestSubscriber.php b/web/modules/redirect/src/EventSubscriber/RouteNormalizerRequestSubscriber.php
index 0b091ccc5cfede6a66566219948eb699a4be1609..1f3718ab698f483da5fc1bbf05e1e64d81fcff33 100644
--- a/web/modules/redirect/src/EventSubscriber/RouteNormalizerRequestSubscriber.php
+++ b/web/modules/redirect/src/EventSubscriber/RouteNormalizerRequestSubscriber.php
@@ -106,7 +106,7 @@ public function onKernelRequestRedirect(RequestEvent $event) {
 
       // Strip off query parameters added by the route such as a CSRF token.
       if (strpos($redirect_uri, '?') !== FALSE) {
-        $redirect_uri  = strtok($redirect_uri, '?');
+        $redirect_uri = strtok($redirect_uri, '?');
       }
 
       // Append back the request query string from $_SERVER.
@@ -134,7 +134,7 @@ public function onKernelRequestRedirect(RequestEvent $event) {
   /**
    * {@inheritdoc}
    */
-  static function getSubscribedEvents() {
+  public static function getSubscribedEvents(): array {
     $events[KernelEvents::REQUEST][] = ['onKernelRequestRedirect', 30];
     return $events;
   }
diff --git a/web/modules/redirect/src/Exception/RedirectLoopException.php b/web/modules/redirect/src/Exception/RedirectLoopException.php
index 2482862df99c5aa929b3a81c4eec979aaf404bee..faf4ae6785738406105195ec73abed488895146a 100644
--- a/web/modules/redirect/src/Exception/RedirectLoopException.php
+++ b/web/modules/redirect/src/Exception/RedirectLoopException.php
@@ -53,7 +53,6 @@ public function getPath() {
    *
    * @return int
    *   The redirect ID.
-   *
    */
   public function getRedirectId() {
     return $this->rid;
diff --git a/web/modules/redirect/src/Form/RedirectForm.php b/web/modules/redirect/src/Form/RedirectForm.php
index 23fd3add6da78de6086459c009675df6993e51f9..ed6670bfdb6d668a2299f76ca468b4085a531fc0 100644
--- a/web/modules/redirect/src/Form/RedirectForm.php
+++ b/web/modules/redirect/src/Form/RedirectForm.php
@@ -67,7 +67,7 @@ public function form(array $form, FormStateInterface $form_state) {
     $redirect = $this->entity;
 
     // Only add the configured languages and a single key for all languages.
-    if (isset($form['language']['widget'][0]['value']))  {
+    if (isset($form['language']['widget'][0]['value'])) {
       foreach (\Drupal::languageManager()->getLanguages(LanguageInterface::STATE_CONFIGURABLE) as $langcode => $language) {
         $form['language']['widget'][0]['value']['#options'][$langcode] = $language->getName();
       }
@@ -125,8 +125,8 @@ public function validateForm(array &$form, FormStateInterface $form_state) {
     }
 
     $parsed_url = UrlHelper::parse(trim($source['path']));
-    $path = isset($parsed_url['path']) ? $parsed_url['path'] : NULL;
-    $query = isset($parsed_url['query']) ? $parsed_url['query'] : NULL;
+    $path = $parsed_url['path'] ?? NULL;
+    $query = $parsed_url['query'] ?? NULL;
     $hash = Redirect::generateHash($path, $query, $form_state->getValue('language')[0]['value']);
 
     // Search for duplicate.
@@ -140,7 +140,9 @@ public function validateForm(array &$form, FormStateInterface $form_state) {
         $form_state->setErrorByName('redirect_source', $this->t('The source path %source is already being redirected. Do you want to <a href="@edit-page">edit the existing redirect</a>?',
           [
             '%source' => $source['path'],
-            '@edit-page' => $redirect->toUrl('edit-form')->toString()]));
+            '@edit-page' => $redirect->toUrl('edit-form')->toString(),
+          ]
+        ));
       }
     }
   }
@@ -153,4 +155,5 @@ public function save(array $form, FormStateInterface $form_state) {
     $this->messenger()->addMessage($this->t('The redirect has been saved.'));
     $form_state->setRedirect('redirect.list');
   }
+
 }
diff --git a/web/modules/redirect/src/Form/RedirectSettingsForm.php b/web/modules/redirect/src/Form/RedirectSettingsForm.php
index 1cfe0caa8c945f738090c7756495654c1b85dd6f..faaef37c4326fef1b597e9c18cecb8a8aaab394d 100644
--- a/web/modules/redirect/src/Form/RedirectSettingsForm.php
+++ b/web/modules/redirect/src/Form/RedirectSettingsForm.php
@@ -13,6 +13,7 @@ class RedirectSettingsForm extends ConfigFormBase {
   public function getFormId() {
     return 'redirect_settings_form';
   }
+
   /**
    * {@inheritdoc}
    */
@@ -69,7 +70,7 @@ public function buildForm(array $form, FormStateInterface $form_state) {
     $form['globals']['redirect_access_check'] = [
       '#type' => 'checkbox',
       '#title' => $this->t('Check access to the redirected page'),
-      '#description' => $this->t('This helps to stop redirection on protected pages and avoids giving away <em>secret</em> URL\'s. <strong>By default this feature is disabled to avoid any unexpected behavior</strong>'),
+      '#description' => $this->t("This helps to stop redirection on protected pages and avoids giving away <em>secret</em> URL's. <strong>By default this feature is disabled to avoid any unexpected behavior</strong>"),
       '#default_value' => $config->get('access_check'),
     ];
 
diff --git a/web/modules/redirect/src/Plugin/Action/DeleteRedirect.php b/web/modules/redirect/src/Plugin/Action/DeleteRedirect.php
index 305a465a6bb10d59cf81a4aad6e139c602a6bb07..a0f2faff37adfa4a8f95da56da5b38f7d22b35b6 100644
--- a/web/modules/redirect/src/Plugin/Action/DeleteRedirect.php
+++ b/web/modules/redirect/src/Plugin/Action/DeleteRedirect.php
@@ -45,7 +45,7 @@ class DeleteRedirect extends ActionBase implements ContainerFactoryPluginInterfa
    *   The plugin implementation definition.
    * @param \Drupal\Core\TempStore\PrivateTempStoreFactory $temp_store_factory
    *   The tempstore factory.
-   * @param AccountInterface $current_user
+   * @param \Drupal\Core\Session\AccountInterface $current_user
    *   Current user.
    */
   public function __construct(array $configuration, $plugin_id, $plugin_definition, PrivateTempStoreFactory $temp_store_factory, AccountInterface $current_user) {
@@ -85,7 +85,7 @@ public function execute($object = NULL) {
   /**
    * {@inheritdoc}
    */
-  public function access($object, AccountInterface $account = NULL, $return_as_object = FALSE) {
+  public function access($object, ?AccountInterface $account = NULL, $return_as_object = FALSE) {
     return $object->access('delete', $account, $return_as_object);
   }
 
diff --git a/web/modules/redirect/src/Plugin/Field/FieldWidget/RedirectSourceWidget.php b/web/modules/redirect/src/Plugin/Field/FieldWidget/RedirectSourceWidget.php
index 1db991f4f092594143a6fe90c182b302d9575fe6..1977a494e9a4039a30e30a4402cb0e7f91dd576d 100644
--- a/web/modules/redirect/src/Plugin/Field/FieldWidget/RedirectSourceWidget.php
+++ b/web/modules/redirect/src/Plugin/Field/FieldWidget/RedirectSourceWidget.php
@@ -3,6 +3,7 @@
 namespace Drupal\redirect\Plugin\Field\FieldWidget;
 
 use Drupal\Component\Utility\UrlHelper;
+use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\Field\FieldItemListInterface;
 use Drupal\Core\Field\WidgetBase;
 use Drupal\Core\Url;
@@ -63,12 +64,18 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
         $source_path = trim($source_path);
 
         // Warning about creating a redirect from a valid path.
-        // @todo - Hmm... exception driven logic. Find a better way how to
+        // @todo Hmm... exception driven logic. Find a better way how to
         //   determine if we have a valid path.
         try {
           \Drupal::service('router')->match('/' . $form_state->getValue(['redirect_source', 0, 'path']));
-          $element['status_box'][]['#markup'] = '<div class="messages messages--warning">' . $this->t('The source path %path is likely a valid path. It is preferred to <a href="@url-alias">create URL aliases</a> for existing paths rather than redirects.',
-              ['%path' => $source_path, '@url-alias' => Url::fromRoute('entity.path_alias.add_form')->toString()]) . '</div>';
+
+          $url = Url::fromRoute('entity.path_alias.add_form');
+          if ($url->access()) {
+            $element['status_box'][]['#markup'] = '<div class="messages messages--warning">' . $this->t('The source path %path is likely a valid path. It is preferred to <a href="@url-alias">create URL aliases</a> for existing paths rather than redirects.', [
+              '%path' => $source_path,
+              '@url-alias' => $url->toString(),
+            ]) . '</div>';
+          }
         }
         catch (ResourceNotFoundException $e) {
           // Do nothing, expected behaviour.
@@ -79,7 +86,7 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
 
         // Warning about the path being already redirected.
         $parsed_url = UrlHelper::parse($source_path);
-        $path = isset($parsed_url['path']) ? $parsed_url['path'] : NULL;
+        $path = $parsed_url['path'] ?? NULL;
         if (!empty($path)) {
           /** @var \Drupal\redirect\RedirectRepository $repository */
           $repository = \Drupal::service('redirect.repository');
@@ -120,4 +127,13 @@ public function massageFormValues(array $values, array $form, FormStateInterface
     }
     return $values;
   }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function isApplicable(FieldDefinitionInterface $field_definition): bool {
+    $entity_type = $field_definition->getTargetEntityTypeId();
+    return $entity_type === 'redirect';
+  }
+
 }
diff --git a/web/modules/redirect/src/Plugin/Validation/Constraint/SourceLinkTypeConstraint.php b/web/modules/redirect/src/Plugin/Validation/Constraint/SourceLinkTypeConstraint.php
index 96a4595ae094bdac6b80db65ae58e8687d5351b2..9dfe8aadb12d58108d135cf26636a5fc44ea0da6 100644
--- a/web/modules/redirect/src/Plugin/Validation/Constraint/SourceLinkTypeConstraint.php
+++ b/web/modules/redirect/src/Plugin/Validation/Constraint/SourceLinkTypeConstraint.php
@@ -30,7 +30,7 @@ class SourceLinkTypeConstraint extends Constraint implements ConstraintValidator
   protected $context;
 
   /**
-   * {@inheritDoc}
+   * {@inheritdoc}
    */
   public function initialize(ExecutionContextInterface $context) {
     $this->context = $context;
@@ -39,7 +39,7 @@ public function initialize(ExecutionContextInterface $context) {
   /**
    * {@inheritdoc}
    */
-  public function validatedBy() {
+  public function validatedBy(): string {
     return get_class($this);
   }
 
@@ -49,7 +49,7 @@ public function validatedBy() {
   public function validate($value, Constraint $constraint) {
     if (isset($value)) {
       $url_is_valid = TRUE;
-      /** @var $link_item \Drupal\link\LinkItemInterface */
+      /** @var \Drupal\link\LinkItemInterface $link_item */
       $link_item = $value;
       $link_type = $link_item->getFieldDefinition()->getSetting('link_type');
       $url_string = $link_item->url;
@@ -88,5 +88,5 @@ public function validate($value, Constraint $constraint) {
       }
     }
   }
-}
 
+}
diff --git a/web/modules/redirect/src/Plugin/migrate/process/d7/PathRedirect.php b/web/modules/redirect/src/Plugin/migrate/process/d7/PathRedirect.php
index 0f4417096dffa739960a03e32900aea4ab15eb55..799a3809cde965488eda32a0ea3c45a42a9aeb29 100644
--- a/web/modules/redirect/src/Plugin/migrate/process/d7/PathRedirect.php
+++ b/web/modules/redirect/src/Plugin/migrate/process/d7/PathRedirect.php
@@ -1,10 +1,5 @@
 <?php
 
-/**
- * @file
- * Contains \Drupal\redirect\Plugin\migrate\process\d7\PathRedirect.
- */
-
 namespace Drupal\redirect\Plugin\migrate\process\d7;
 
 use Drupal\migrate\MigrateExecutableInterface;
@@ -51,4 +46,4 @@ public function transform($value, MigrateExecutableInterface $migrate_executable
     return $uri;
   }
 
-}
\ No newline at end of file
+}
diff --git a/web/modules/redirect/src/Plugin/migrate/process/d7/RedirectSourceQuery.php b/web/modules/redirect/src/Plugin/migrate/process/d7/RedirectSourceQuery.php
index 8548d80a5f1529a3058c0a9b37b05bd9e26c4e63..b02abfa28c0310dc180e0ec52f284166fba68bc4 100644
--- a/web/modules/redirect/src/Plugin/migrate/process/d7/RedirectSourceQuery.php
+++ b/web/modules/redirect/src/Plugin/migrate/process/d7/RedirectSourceQuery.php
@@ -1,10 +1,5 @@
 <?php
 
-/**
- * @file
- * Contains \Drupal\redirect\Plugin\migrate\process\d7\RedirectSourceQuery.
- */
-
 namespace Drupal\redirect\Plugin\migrate\process\d7;
 
 use Drupal\migrate\MigrateExecutableInterface;
diff --git a/web/modules/redirect/src/Plugin/migrate/source/d7/PathRedirect.php b/web/modules/redirect/src/Plugin/migrate/source/d7/PathRedirect.php
index 7ddcd244cec16fe30cf191dbba64de21dc9f5d49..a7a87e8c7bd95b47b2f43a68b5290272f7b784b6 100644
--- a/web/modules/redirect/src/Plugin/migrate/source/d7/PathRedirect.php
+++ b/web/modules/redirect/src/Plugin/migrate/source/d7/PathRedirect.php
@@ -1,10 +1,5 @@
 <?php
 
-/**
- * @file
- * Contains \Drupal\redirect\Plugin\migrate\source\d7\PathRedirect.
- */
-
 namespace Drupal\redirect\Plugin\migrate\source\d7;
 
 use Drupal\migrate\Row;
diff --git a/web/modules/redirect/src/RedirectChecker.php b/web/modules/redirect/src/RedirectChecker.php
index d1aa829b35f4e1bddd2e1635a42831005773adf9..826e7743be52837b358a79beac9e985519db6e7b 100644
--- a/web/modules/redirect/src/RedirectChecker.php
+++ b/web/modules/redirect/src/RedirectChecker.php
@@ -51,7 +51,7 @@ public function __construct(ConfigFactoryInterface $config, StateInterface $stat
   /**
    * Determines if redirect may be performed.
    *
-   * @param Request $request
+   * @param \Symfony\Component\HttpFoundation\Request $request
    *   The current request object.
    * @param string $route_name
    *   The current route name.
diff --git a/web/modules/redirect/src/RedirectRepository.php b/web/modules/redirect/src/RedirectRepository.php
index db6c56951d0b91ea59fa022a5fc7cacf570690db..2168d2eaee9513dbd0ca3d19b7f4d7a242997bd8 100644
--- a/web/modules/redirect/src/RedirectRepository.php
+++ b/web/modules/redirect/src/RedirectRepository.php
@@ -40,6 +40,8 @@ class RedirectRepository {
    *   The entity type manager.
    * @param \Drupal\Core\Database\Connection $connection
    *   The database connection.
+   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
+   *   The config factory.
    */
   public function __construct(EntityTypeManagerInterface $manager, Connection $connection, ConfigFactoryInterface $config_factory) {
     $this->manager = $manager;
@@ -107,7 +109,7 @@ public function findMatchingRedirect($source_path, array $query = [], $language
   /**
    * Helper function to find recursive redirects.
    *
-   * @param \Drupal\redirect\Entity\Redirect
+   * @param \Drupal\redirect\Entity\Redirect $redirect
    *   The redirect object.
    * @param string $language
    *   The language to use.
@@ -178,7 +180,8 @@ public function load($redirect_id) {
    * @return \Drupal\redirect\Entity\Redirect[]
    *   List of redirect entities.
    */
-  public function loadMultiple(array $redirect_ids = NULL) {
+  public function loadMultiple(?array $redirect_ids = NULL) {
     return $this->manager->getStorage('redirect')->loadMultiple($redirect_ids);
   }
+
 }
diff --git a/web/modules/redirect/src/Routing/RouteSubscriber.php b/web/modules/redirect/src/Routing/RouteSubscriber.php
index 439093a5f1e0f8fe4cd290df137b18c82cf16aac..c0224e2ac715125b87989ab4f6e7cab9de64d40b 100644
--- a/web/modules/redirect/src/Routing/RouteSubscriber.php
+++ b/web/modules/redirect/src/Routing/RouteSubscriber.php
@@ -23,6 +23,12 @@ protected function alterRoutes(RouteCollection $collection) {
     if ($route = $collection->get('system.files')) {
       $route->setDefault('_disable_route_normalizer', TRUE);
     }
+    if ($route = $collection->get('system.js_asset')) {
+      $route->setDefault('_disable_route_normalizer', TRUE);
+    }
+    if ($route = $collection->get('system.css_asset')) {
+      $route->setDefault('_disable_route_normalizer', TRUE);
+    }
   }
 
 }
diff --git a/web/modules/redirect/tests/fixtures/drupal6.php b/web/modules/redirect/tests/fixtures/drupal6.php
index ca04d67d18b47b14744a342e7518ea3f2e85467f..ef909432d69fd44e85e671d26b128c68ee8eacae 100644
--- a/web/modules/redirect/tests/fixtures/drupal6.php
+++ b/web/modules/redirect/tests/fixtures/drupal6.php
@@ -1,4 +1,5 @@
 <?php
+
 /**
  * @file
  * A database agnostic dump for testing purposes.
diff --git a/web/modules/redirect/tests/fixtures/drupal7-no-default.php b/web/modules/redirect/tests/fixtures/drupal7-no-default.php
index 1ba0bb82976bc9ea3c1e7a20d66a407619940344..e6135af0a844dcbecf5ce980e96593a6abccf375 100644
--- a/web/modules/redirect/tests/fixtures/drupal7-no-default.php
+++ b/web/modules/redirect/tests/fixtures/drupal7-no-default.php
@@ -1,4 +1,5 @@
 <?php
+
 /**
  * @file
  * A database agnostic dump for testing purposes.
@@ -70,7 +71,7 @@
   'primary key' => ['rid'],
   'unique keys' => [
     'source_language' => ['source', 'language'],
-    'expires' => ['type', 'access']
+    'expires' => ['type', 'access'],
   ],
   'mysql_character_set' => 'utf8',
 ]);
@@ -204,26 +205,26 @@
 ]);
 
 $connection->insert('system')
-->fields([
-  'filename',
-  'name',
-  'type',
-  'owner',
-  'status',
-  'bootstrap',
-  'schema_version',
-  'weight',
-  'info',
-])
-->values([
-  'filename' => 'modules/contrib/redirect/redirect.module',
-  'name' => 'redirect',
-  'type' => 'module',
-  'owner' => '',
-  'status' => '1',
-  'bootstrap' => '0',
-  'schema_version' => '7000',
-  'weight' => '0',
-  'info' => 'a:13:{s:4:"name";s:8:"Redirect";s:11:"description";s:51:"Allows users to redirect from old URLs to new URLs.";s:4:"core";s:3:"7.x";s:5:"files";a:11:{i:0;s:15:"redirect.module";i:1;s:18:"redirect.admin.inc";i:2;s:16:"redirect.install";i:3;s:13:"redirect.test";i:4;s:24:"views/redirect.views.inc";i:5;s:47:"views/redirect_handler_filter_redirect_type.inc";i:6;s:48:"views/redirect_handler_field_redirect_source.inc";i:7;s:50:"views/redirect_handler_field_redirect_redirect.inc";i:8;s:52:"views/redirect_handler_field_redirect_operations.inc";i:9;s:51:"views/redirect_handler_field_redirect_link_edit.inc";i:10;s:53:"views/redirect_handler_field_redirect_link_delete.inc";}s:9:"configure";s:37:"admin/config/search/redirect/settings";s:7:"version";s:11:"7.x-1.0-rc1";s:7:"project";s:8:"redirect";s:9:"datestamp";s:10:"1347989995";s:5:"mtime";i:1347989995;s:12:"dependencies";a:0:{}s:7:"package";s:5:"Other";s:3:"php";s:5:"5.2.4";s:9:"bootstrap";i:0;}',
-])
-->execute();
+  ->fields([
+    'filename',
+    'name',
+    'type',
+    'owner',
+    'status',
+    'bootstrap',
+    'schema_version',
+    'weight',
+    'info',
+  ])
+  ->values([
+    'filename' => 'modules/contrib/redirect/redirect.module',
+    'name' => 'redirect',
+    'type' => 'module',
+    'owner' => '',
+    'status' => '1',
+    'bootstrap' => '0',
+    'schema_version' => '7000',
+    'weight' => '0',
+    'info' => 'a:13:{s:4:"name";s:8:"Redirect";s:11:"description";s:51:"Allows users to redirect from old URLs to new URLs.";s:4:"core";s:3:"7.x";s:5:"files";a:11:{i:0;s:15:"redirect.module";i:1;s:18:"redirect.admin.inc";i:2;s:16:"redirect.install";i:3;s:13:"redirect.test";i:4;s:24:"views/redirect.views.inc";i:5;s:47:"views/redirect_handler_filter_redirect_type.inc";i:6;s:48:"views/redirect_handler_field_redirect_source.inc";i:7;s:50:"views/redirect_handler_field_redirect_redirect.inc";i:8;s:52:"views/redirect_handler_field_redirect_operations.inc";i:9;s:51:"views/redirect_handler_field_redirect_link_edit.inc";i:10;s:53:"views/redirect_handler_field_redirect_link_delete.inc";}s:9:"configure";s:37:"admin/config/search/redirect/settings";s:7:"version";s:11:"7.x-1.0-rc1";s:7:"project";s:8:"redirect";s:9:"datestamp";s:10:"1347989995";s:5:"mtime";i:1347989995;s:12:"dependencies";a:0:{}s:7:"package";s:5:"Other";s:3:"php";s:5:"5.2.4";s:9:"bootstrap";i:0;}',
+  ])
+  ->execute();
diff --git a/web/modules/redirect/tests/fixtures/drupal7.php b/web/modules/redirect/tests/fixtures/drupal7.php
index 3652ee835d98bd510dc389786d4204eb7e934c29..03b341d33069da8b51cdce1f5824506b732087f3 100644
--- a/web/modules/redirect/tests/fixtures/drupal7.php
+++ b/web/modules/redirect/tests/fixtures/drupal7.php
@@ -1,4 +1,5 @@
 <?php
+
 /**
  * @file
  * A database agnostic dump for testing purposes.
@@ -70,7 +71,7 @@
   'primary key' => ['rid'],
   'unique keys' => [
     'source_language' => ['source', 'language'],
-    'expires' => ['type', 'access']
+    'expires' => ['type', 'access'],
   ],
   'mysql_character_set' => 'utf8',
 ]);
@@ -142,15 +143,15 @@
 ]);
 
 $connection->insert('variable')
-->fields([
-  'name',
-  'value',
-])
-->values([
-  'name' => 'redirect_default_status_code',
-  'value' => 's:3:"307";',
-])
-->execute();
+  ->fields([
+    'name',
+    'value',
+  ])
+  ->values([
+    'name' => 'redirect_default_status_code',
+    'value' => 's:3:"307";',
+  ])
+  ->execute();
 
 $connection->schema()->createTable('system', [
   'fields' => [
@@ -215,26 +216,26 @@
 ]);
 
 $connection->insert('system')
-->fields([
-  'filename',
-  'name',
-  'type',
-  'owner',
-  'status',
-  'bootstrap',
-  'schema_version',
-  'weight',
-  'info',
-])
-->values([
-  'filename' => 'modules/contrib/redirect/redirect.module',
-  'name' => 'redirect',
-  'type' => 'module',
-  'owner' => '',
-  'status' => '1',
-  'bootstrap' => '0',
-  'schema_version' => '7000',
-  'weight' => '0',
-  'info' => 'a:13:{s:4:"name";s:8:"Redirect";s:11:"description";s:51:"Allows users to redirect from old URLs to new URLs.";s:4:"core";s:3:"7.x";s:5:"files";a:11:{i:0;s:15:"redirect.module";i:1;s:18:"redirect.admin.inc";i:2;s:16:"redirect.install";i:3;s:13:"redirect.test";i:4;s:24:"views/redirect.views.inc";i:5;s:47:"views/redirect_handler_filter_redirect_type.inc";i:6;s:48:"views/redirect_handler_field_redirect_source.inc";i:7;s:50:"views/redirect_handler_field_redirect_redirect.inc";i:8;s:52:"views/redirect_handler_field_redirect_operations.inc";i:9;s:51:"views/redirect_handler_field_redirect_link_edit.inc";i:10;s:53:"views/redirect_handler_field_redirect_link_delete.inc";}s:9:"configure";s:37:"admin/config/search/redirect/settings";s:7:"version";s:11:"7.x-1.0-rc1";s:7:"project";s:8:"redirect";s:9:"datestamp";s:10:"1347989995";s:5:"mtime";i:1347989995;s:12:"dependencies";a:0:{}s:7:"package";s:5:"Other";s:3:"php";s:5:"5.2.4";s:9:"bootstrap";i:0;}',
-])
-->execute();
+  ->fields([
+    'filename',
+    'name',
+    'type',
+    'owner',
+    'status',
+    'bootstrap',
+    'schema_version',
+    'weight',
+    'info',
+  ])
+  ->values([
+    'filename' => 'modules/contrib/redirect/redirect.module',
+    'name' => 'redirect',
+    'type' => 'module',
+    'owner' => '',
+    'status' => '1',
+    'bootstrap' => '0',
+    'schema_version' => '7000',
+    'weight' => '0',
+    'info' => 'a:13:{s:4:"name";s:8:"Redirect";s:11:"description";s:51:"Allows users to redirect from old URLs to new URLs.";s:4:"core";s:3:"7.x";s:5:"files";a:11:{i:0;s:15:"redirect.module";i:1;s:18:"redirect.admin.inc";i:2;s:16:"redirect.install";i:3;s:13:"redirect.test";i:4;s:24:"views/redirect.views.inc";i:5;s:47:"views/redirect_handler_filter_redirect_type.inc";i:6;s:48:"views/redirect_handler_field_redirect_source.inc";i:7;s:50:"views/redirect_handler_field_redirect_redirect.inc";i:8;s:52:"views/redirect_handler_field_redirect_operations.inc";i:9;s:51:"views/redirect_handler_field_redirect_link_edit.inc";i:10;s:53:"views/redirect_handler_field_redirect_link_delete.inc";}s:9:"configure";s:37:"admin/config/search/redirect/settings";s:7:"version";s:11:"7.x-1.0-rc1";s:7:"project";s:8:"redirect";s:9:"datestamp";s:10:"1347989995";s:5:"mtime";i:1347989995;s:12:"dependencies";a:0:{}s:7:"package";s:5:"Other";s:3:"php";s:5:"5.2.4";s:9:"bootstrap";i:0;}',
+  ])
+  ->execute();
diff --git a/web/modules/redirect/tests/modules/redirect_test/redirect_test.info.yml b/web/modules/redirect/tests/modules/redirect_test/redirect_test.info.yml
index c0ab2ec973f55a278222805ded561ee17221f59b..d652a68d51f761a4eeeaa632cc14e4ddd6c70803 100644
--- a/web/modules/redirect/tests/modules/redirect_test/redirect_test.info.yml
+++ b/web/modules/redirect/tests/modules/redirect_test/redirect_test.info.yml
@@ -5,7 +5,7 @@ package: Testing
 dependencies:
   - drupal:redirect
 
-# Information added by Drupal.org packaging script on 2023-08-30
-version: '8.x-1.9'
+# Information added by Drupal.org packaging script on 2024-08-10
+version: '8.x-1.10'
 project: 'redirect'
-datestamp: 1693393511
+datestamp: 1723277645
diff --git a/web/modules/redirect/tests/src/Functional/AssertRedirectTrait.php b/web/modules/redirect/tests/src/Functional/AssertRedirectTrait.php
index a16908cacff745db64c00c359b8436bef5d17789..5f490b0212fb88b34a998f96e144e020061d0ce0 100644
--- a/web/modules/redirect/tests/src/Functional/AssertRedirectTrait.php
+++ b/web/modules/redirect/tests/src/Functional/AssertRedirectTrait.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace Drupal\Tests\redirect\Functional;
 
 use Drupal\Core\Url;
@@ -31,8 +33,9 @@ public function assertRedirect($path, $expected_ending_url, $expected_ending_sta
     /** @var \Psr\Http\Message\ResponseInterface $response */
     $url = $this->getAbsoluteUrl($path);
     try {
-      $response = $client->request($method, $url, ['allow_redirects' => false]);
-    } catch (ClientException $e) {
+      $response = $client->request($method, $url, ['allow_redirects' => FALSE]);
+    }
+    catch (ClientException $e) {
       $this->assertEquals($expected_ending_status, $e->getResponse()->getStatusCode());
       return $e->getResponse();
     }
diff --git a/web/modules/redirect/tests/src/Functional/GlobalRedirectTest.php b/web/modules/redirect/tests/src/Functional/GlobalRedirectTest.php
index 220830020ed657e37133995df50e806e104b99f2..9006061a8ab9c7c5d304e9cb76b3874a2823585b 100644
--- a/web/modules/redirect/tests/src/Functional/GlobalRedirectTest.php
+++ b/web/modules/redirect/tests/src/Functional/GlobalRedirectTest.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace Drupal\Tests\redirect\Functional;
 
 use Drupal\Core\Language\Language;
@@ -28,7 +30,6 @@ class GlobalRedirectTest extends BrowserTestBase {
     'node',
     'redirect',
     'taxonomy',
-    'forum',
     'views',
     'language',
     'content_translation',
@@ -49,11 +50,6 @@ class GlobalRedirectTest extends BrowserTestBase {
    */
   protected $config;
 
-  /**
-   * @var \Drupal\Core\Entity\ContentEntityInterface
-   */
-  protected $forumTerm;
-
   /**
    * @var \Drupal\Core\Entity\ContentEntityInterface
    */
@@ -125,15 +121,6 @@ protected function setUp(): void {
     // "redirect with permissions testing" test.
     $this->createPathAlias('/admin/config/system/site-information', '/site-info');
 
-    // Create a taxonomy term for the forum.
-    $term = Term::create([
-      'name' => 'Test Forum Term',
-      'vid' => 'forums',
-      'langcode' => Language::LANGCODE_NOT_SPECIFIED,
-    ]);
-    $term->save();
-    $this->forumTerm = $term;
-
     // Create another taxonomy vocabulary with a term.
     $vocab = Vocabulary::create([
       'name' => 'test vocab',
@@ -208,9 +195,9 @@ public function testRedirects() {
     $this->assertNoRedirect('admin/config/system/site-information', 403);
 
     $this->config->set('access_check', FALSE)->save();
-    // @todo - here it seems that the access check runs prior to our redirecting
+    // @todo Here it seems that the access check runs prior to our redirecting
     //   check why so and enable the test.
-    //$this->assertRedirect('admin/config/system/site-information', 'site-info');
+    //   $this->assertRedirect('admin/config/system/site-information', 'site-info');
 
     // Test original query string is preserved with alias normalization.
     $this->assertRedirect('Test-node?&foo&.bar=baz', 'test-node?&foo&.bar=baz');
@@ -264,7 +251,7 @@ public function testLanguageRedirects() {
       'language_configuration[content_translation]' => TRUE,
     ];
     $this->drupalGet('admin/structure/types/manage/page');
-    $this->submitForm($edit, 'Save content type');
+    $this->submitForm($edit, 'Save');
     $this->assertSession()->responseContains('The content type <em class="placeholder">Page</em> has been updated.');
 
     $spanish_node = $this->drupalCreateNode([
@@ -321,7 +308,7 @@ protected function assertNoRedirect($path, $status_code = 200) {
 
     $assert_session = $this->assertSession();
     $assert_session->statusCodeEquals($status_code);
-    $assert_session->responseHeaderEquals('Location', NULL);
+    $assert_session->responseHeaderDoesNotExist('Location');
     $assert_session->responseNotContains('http-equiv="refresh');
     $assert_session->addressEquals($path);
 
diff --git a/web/modules/redirect/tests/src/Functional/RedirectHooksTest.php b/web/modules/redirect/tests/src/Functional/RedirectHooksTest.php
index 0d1b246fc69b9be85f75ef196c7b2d99af38f708..94f4c078a17c39ef0092eff005592dc51b6a605d 100644
--- a/web/modules/redirect/tests/src/Functional/RedirectHooksTest.php
+++ b/web/modules/redirect/tests/src/Functional/RedirectHooksTest.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace Drupal\Tests\redirect\Functional;
 
 use Drupal\redirect\Entity\Redirect;
diff --git a/web/modules/redirect/tests/src/Functional/RedirectNodeFormTest.php b/web/modules/redirect/tests/src/Functional/RedirectNodeFormTest.php
index 704445292c35d9dd2ee528a0a129d01484cd92ba..9d719edb9c4ce04f43cc00fb4b1503fefe1d83b8 100644
--- a/web/modules/redirect/tests/src/Functional/RedirectNodeFormTest.php
+++ b/web/modules/redirect/tests/src/Functional/RedirectNodeFormTest.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace Drupal\Tests\redirect\Functional;
 
 use Drupal\Tests\BrowserTestBase;
diff --git a/web/modules/redirect/tests/src/Functional/RedirectUILanguageTest.php b/web/modules/redirect/tests/src/Functional/RedirectUILanguageTest.php
index a7dfbe549ae5cc57f94abf97bfdf84c7352c1682..79481feea7b69abd9c0e098a8001cfcc1b25e8fc 100644
--- a/web/modules/redirect/tests/src/Functional/RedirectUILanguageTest.php
+++ b/web/modules/redirect/tests/src/Functional/RedirectUILanguageTest.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace Drupal\Tests\redirect\Functional;
 
 use Drupal\language\Entity\ConfigurableLanguage;
diff --git a/web/modules/redirect/tests/src/Functional/RedirectUITest.php b/web/modules/redirect/tests/src/Functional/RedirectUITest.php
index 01fa5e44f0cab9169d022c8a9f604d62592023a8..16b1702b2ed6d08960b0d2bf57904cf1de1cd868 100644
--- a/web/modules/redirect/tests/src/Functional/RedirectUITest.php
+++ b/web/modules/redirect/tests/src/Functional/RedirectUITest.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace Drupal\Tests\redirect\Functional;
 
 use Drupal\Core\Language\Language;
diff --git a/web/modules/redirect/tests/src/FunctionalJavascript/RedirectJavascriptTest.php b/web/modules/redirect/tests/src/FunctionalJavascript/RedirectJavascriptTest.php
index b3b7840239e8440dcba1bab622f419add387ede1..03c4057088dcde6db267a5d7a30c97303e96413a 100644
--- a/web/modules/redirect/tests/src/FunctionalJavascript/RedirectJavascriptTest.php
+++ b/web/modules/redirect/tests/src/FunctionalJavascript/RedirectJavascriptTest.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace Drupal\Tests\redirect\FunctionalJavascript;
 
 use Drupal\Core\Url;
@@ -104,7 +106,6 @@ public function testRedirectUI() {
     $this->assertSession()->addressEquals('admin/config/search/redirect');
     $this->assertSession()->pageTextContains('non-existing');
     $this->assertSession()->linkExists(Url::fromUri('base:node')->toString());
-    $this->assertSession()->pageTextContains('Not specified');
 
     // Test the edit form and update action.
     $this->clickLink('Edit');
@@ -256,9 +257,9 @@ public function testRedirectUI() {
     $this->getSession()->getPage()->selectFieldOption("action", "redirect_delete_action", TRUE);
     $this->submitForm($edit, 'Apply to selected items');
     $this->assertSession()->pageTextContains('Are you sure you want to delete these redirects?');
-    $this->clickLink('Cancel');
 
     // Test the delete action.
+    $this->drupalGet('admin/config/search/redirect');
     $page->find('css', '.dropbutton-toggle button')->press();
     $this->clickLink('Delete');
     $this->assertSession()->responseContains(
diff --git a/web/modules/redirect/tests/src/Kernel/Migrate/d6/PathRedirectTest.php b/web/modules/redirect/tests/src/Kernel/Migrate/d6/PathRedirectTest.php
index 51b8eb6bb1552a7ed2c28f85be384a0511845613..9220e2adb282b70b9caf8f5f951ea6dc8e931508 100644
--- a/web/modules/redirect/tests/src/Kernel/Migrate/d6/PathRedirectTest.php
+++ b/web/modules/redirect/tests/src/Kernel/Migrate/d6/PathRedirectTest.php
@@ -1,11 +1,12 @@
 <?php
 
+declare(strict_types=1);
+
 namespace Drupal\Tests\redirect\Kernel\Migrate\d6;
 
 use Drupal\redirect\Entity\Redirect;
 use Drupal\Tests\migrate_drupal\Kernel\MigrateDrupalTestBase;
 
-
 /**
  * Tests the d6_path_redirect source plugin.
  *
@@ -24,7 +25,8 @@ class PathRedirectTest extends MigrateDrupalTestBase {
   protected function setUp(): void {
     parent::setUp();
     $this->installEntitySchema('redirect');
-    $this->loadFixture( __DIR__ . '/../../../../../tests/fixtures/drupal6.php');
+    $this->installEntitySchema('path_alias');
+    $this->loadFixture(__DIR__ . '/../../../../../tests/fixtures/drupal6.php');
 
     $this->executeMigrations(['d6_path_redirect']);
   }
@@ -34,7 +36,7 @@ protected function setUp(): void {
    */
   public function testPathRedirect() {
 
-    /** @var Redirect $redirect */
+    /** @var \Drupal\redirect\Entity\Redirect $redirect */
     $redirect = Redirect::load(5);
     $this->assertSame($this->getMigration('d6_path_redirect')
       ->getIdMap()
@@ -46,4 +48,5 @@ public function testPathRedirect() {
     $this->assertSame("/test/source/url2", $redirect->getSourceUrl());
     $this->assertSame("http://test/external/redirect/url?foo=bar&biz=buz", $redirect->getRedirectUrl()->toUriString());
   }
+
 }
diff --git a/web/modules/redirect/tests/src/Kernel/Migrate/d7/PathRedirectSourceTest.php b/web/modules/redirect/tests/src/Kernel/Migrate/d7/PathRedirectSourceTest.php
index 6708f1c8fa0f1867871850b321ed23e33d8ab554..a6b90e3e719fe6f8db840690160b4d0e6ec04e08 100644
--- a/web/modules/redirect/tests/src/Kernel/Migrate/d7/PathRedirectSourceTest.php
+++ b/web/modules/redirect/tests/src/Kernel/Migrate/d7/PathRedirectSourceTest.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace Drupal\Tests\redirect\Kernel\Migrate\d7;
 
 use Drupal\Tests\migrate\Kernel\MigrateSqlSourceTestBase;
@@ -26,7 +28,7 @@ public function providerSource() {
       [
         'name' => 'redirect_default_status_code',
         'value' => 's:3:"307";',
-      ]
+      ],
     ];
 
     $tests[0]['source_data']['redirect'] = [
diff --git a/web/modules/redirect/tests/src/Kernel/Migrate/d7/PathRedirectTest.php b/web/modules/redirect/tests/src/Kernel/Migrate/d7/PathRedirectTest.php
index a21d8016ca1ac47369cbf2c011f513101a0a4fe6..58cd9ea2a530aeebedd33cb7c971f51863096746 100644
--- a/web/modules/redirect/tests/src/Kernel/Migrate/d7/PathRedirectTest.php
+++ b/web/modules/redirect/tests/src/Kernel/Migrate/d7/PathRedirectTest.php
@@ -1,9 +1,6 @@
 <?php
 
-/**
- * @file
- * Contains \Drupal\Tests\redirect\Kernel\Migrate\d7\PathRedirectTest.
- */
+declare(strict_types=1);
 
 namespace Drupal\Tests\redirect\Kernel\Migrate\d7;
 
diff --git a/web/modules/redirect/tests/src/Kernel/Migrate/d7/PathRedirectTestBase.php b/web/modules/redirect/tests/src/Kernel/Migrate/d7/PathRedirectTestBase.php
index 00bdef9648fe43c3d143a237e76e67610db2e5d9..78943464215ff5452de9ac92a9d89bee2c65789e 100644
--- a/web/modules/redirect/tests/src/Kernel/Migrate/d7/PathRedirectTestBase.php
+++ b/web/modules/redirect/tests/src/Kernel/Migrate/d7/PathRedirectTestBase.php
@@ -1,9 +1,6 @@
 <?php
 
-/**
- * @file
- * Contains \Drupal\Tests\redirect\Kernel\Migrate\d7\PathRedirectTestBase.
- */
+declare(strict_types=1);
 
 namespace Drupal\Tests\redirect\Kernel\Migrate\d7;
 
@@ -22,6 +19,14 @@ abstract class PathRedirectTestBase extends MigrateDrupalTestBase {
    */
   protected static $modules = ['redirect', 'link', 'path_alias'];
 
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+    $this->installEntitySchema('path_alias');
+  }
+
   /**
    * Asserts various aspects of a redirect entity.
    *
@@ -35,7 +40,7 @@ abstract class PathRedirectTestBase extends MigrateDrupalTestBase {
    *   The expected status code.
    */
   protected function assertEntity($id, $source_url, $redirect_url, $status_code) {
-    /** @var Redirect $redirect */
+    /** @var \Drupal\redirect\Entity\Redirect $redirect */
     $redirect = Redirect::load($id);
     $this->assertSame($this->getMigration('d7_path_redirect')
       ->getIdMap()
diff --git a/web/modules/redirect/tests/src/Kernel/Migrate/d7/PathRedirectWithoutDefaultTest.php b/web/modules/redirect/tests/src/Kernel/Migrate/d7/PathRedirectWithoutDefaultTest.php
index 4622bdec20e2496d619c16075139c7d8bc4c9715..dcb1a5cdb2367399058ec951b27de0968992fc87 100644
--- a/web/modules/redirect/tests/src/Kernel/Migrate/d7/PathRedirectWithoutDefaultTest.php
+++ b/web/modules/redirect/tests/src/Kernel/Migrate/d7/PathRedirectWithoutDefaultTest.php
@@ -1,9 +1,6 @@
 <?php
 
-/**
- * @file
- * Contains \Drupal\Tests\redirect\Kernel\Migrate\d7\PathRedirectWithoutDefaultTest.
- */
+declare(strict_types=1);
 
 namespace Drupal\Tests\redirect\Kernel\Migrate\d7;
 
diff --git a/web/modules/redirect/tests/src/Kernel/RedirectAPITest.php b/web/modules/redirect/tests/src/Kernel/RedirectAPITest.php
index bf235ee3d0800fe65090803eb80513ad68d02268..4eb286960aae6d46696f052505b3df8694ae7dcb 100644
--- a/web/modules/redirect/tests/src/Kernel/RedirectAPITest.php
+++ b/web/modules/redirect/tests/src/Kernel/RedirectAPITest.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace Drupal\Tests\redirect\Kernel;
 
 use Drupal\language\Entity\ConfigurableLanguage;
@@ -37,6 +39,7 @@ public function setUp(): void {
 
     $this->installEntitySchema('redirect');
     $this->installEntitySchema('user');
+    $this->installEntitySchema('path_alias');
     $this->installConfig(['redirect']);
 
     $language = ConfigurableLanguage::createFromLangcode('de');
@@ -266,22 +269,6 @@ public function testLoopDetectionReset() {
     $this->assertEquals($target->id(), $found->id());
   }
 
-  /**
-   * Test redirect_parse_url().
-   */
-  public function testParseURL() {
-    //$test_cases = array(
-    //  array(
-    //    'input' => array('b' => 'aa', 'c' => array('c2' => 'aa', 'c1' => 'aa'), 'a' => 'aa'),
-    //    'expected' => array('a' => 'aa', 'b' => 'aa', 'c' => array('c1' => 'aa', 'c2' => 'aa')),
-    //  ),
-    //);
-    //foreach ($test_cases as $index => $test_case) {
-    //  $output = redirect_parse_url($test_case['input']);
-    //  $this->assertIdentical($output, $test_case['expected']);
-    //}
-  }
-
   /**
    * Test multilingual redirects.
    */
diff --git a/web/modules/redirect/tests/src/Unit/RedirectCheckerTest.php b/web/modules/redirect/tests/src/Unit/RedirectCheckerTest.php
index 69355fd72c609211857ec64f2c4a482c6df04170..a411c12c07e1cf2539ec7f775e69063c1b4cf8b6 100644
--- a/web/modules/redirect/tests/src/Unit/RedirectCheckerTest.php
+++ b/web/modules/redirect/tests/src/Unit/RedirectCheckerTest.php
@@ -1,10 +1,12 @@
 <?php
 
+declare(strict_types=1);
+
 namespace Drupal\Tests\redirect\Unit;
 
 use Drupal\redirect\RedirectChecker;
 use Drupal\Tests\UnitTestCase;
-use Symfony\Component\HttpFoundation\ParameterBag;
+use Symfony\Component\HttpFoundation\InputBag;
 use Symfony\Component\Routing\Route;
 
 /**
@@ -56,7 +58,6 @@ public function testCanRedirect() {
     $request = $this->getRequestStub('index.php', 'POST');
     $this->assertFalse($checker->canRedirect($request), 'Cannot redirect other than GET method');
 
-
     // Route access check, deny access.
     $request = $this->getRequestStub('index.php', 'GET');
     $this->assertFalse($checker->canRedirect($request, 'denied_route'), 'Can not redirect');
@@ -100,27 +101,24 @@ public function testCanRedirect() {
       ->with('system.maintenance_mode')
       ->will($this->returnValue(FALSE));
 
-//    $checker = new RedirectChecker($this->getConfigFactoryStub($config), $state);
-//
-//    $route = $this->getMockBuilder('Symfony\Component\Routing\Route')
-//      ->disableOriginalConstructor()
-//      ->getMock();
-//    $route->expects($this->any())
-//      ->method('getOption')
-//      ->with('_admin_route')
-//      ->will($this->returnValue('system.admin_config_search'));
-//
-//    $request = $this->getRequestStub('index.php', 'GET',
-//      array(RouteObjectInterface::ROUTE_OBJECT => $route));
-//    $this->assertFalse($checker->canRedirect($request), 'Cannot redirect if we are requesting a admin path');
-//
-//    // We are at admin path with ignore_admin_path set to TRUE.
-//    $config['redirect.settings']['ignore_admin_path'] = TRUE;
-//    $checker = new RedirectChecker($this->getConfigFactoryStub($config), $state);
-//
-//    $request = $this->getRequestStub('index.php', 'GET',
-//      array(RouteObjectInterface::ROUTE_OBJECT => $route));
-//    $this->assertTrue($checker->canRedirect($request), 'Can redirect a admin with ignore_admin_path set to TRUE');
+    // $checker = new RedirectChecker($this->getConfigFactoryStub($config), $state);
+    //
+    // $route = $this->getMockBuilder('Symfony\Component\Routing\Route')->disableOriginalConstructor()->getMock();
+    // $route->expects($this->any())
+    // ->method('getOption')
+    // ->with('_admin_route')
+    // ->will($this->returnValue('system.admin_config_search'));
+    //
+    // $request = $this->getRequestStub('index.php', 'GET', array(RouteObjectInterface::ROUTE_OBJECT => $route));
+    // $this->assertFalse($checker->canRedirect($request), 'Cannot redirect if we are requesting a admin path');
+    //
+    // // We are at admin path with ignore_admin_path set to TRUE.
+    // $config['redirect.settings']['ignore_admin_path'] = TRUE;
+    // $checker = new RedirectChecker($this->getConfigFactoryStub($config), $state);
+    //
+    // $request = $this->getRequestStub('index.php', 'GET',
+    // array(RouteObjectInterface::ROUTE_OBJECT => $route));
+    // $this->assertTrue($checker->canRedirect($request), 'Can redirect a admin with ignore_admin_path set to TRUE');
   }
 
   /**
@@ -147,8 +145,8 @@ protected function getRequestStub($script_name, $method, array $attributes = [],
       ->method('isMethod')
       ->with($this->anything())
       ->will($this->returnValue($method == 'GET'));
-    $request->query = new ParameterBag($query);
-    $request->attributes = new ParameterBag($attributes);
+    $request->query = new InputBag($query);
+    $request->attributes = new InputBag($attributes);
 
     return $request;
   }
diff --git a/web/modules/redirect/tests/src/Unit/RedirectRequestSubscriberTest.php b/web/modules/redirect/tests/src/Unit/RedirectRequestSubscriberTest.php
index 18c179b380460def824d8d042d7505ff121d14bb..08da5ac45f4124ad537e1ace9c1d7639e49478ee 100644
--- a/web/modules/redirect/tests/src/Unit/RedirectRequestSubscriberTest.php
+++ b/web/modules/redirect/tests/src/Unit/RedirectRequestSubscriberTest.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace Drupal\Tests\redirect\Unit;
 
 use Drupal\Core\Entity\EntityTypeManagerInterface;
@@ -255,15 +257,17 @@ protected function getPostResponseEvent($headers = []) {
    * Gets response event object.
    *
    * @param $path_info
+   *   The "pathinfo" (the url without querystring).
    * @param $query_string
+   *   The query string.
    *
-   * @return RequestEvent
+   * @return \Symfony\Component\HttpKernel\Event\RequestEvent
    */
   protected function getGetResponseEventStub($path_info, $query_string) {
     $request = Request::create($path_info . '?' . $query_string, 'GET', [], [], [], ['SCRIPT_NAME' => 'index.php']);
 
     $http_kernel = $this->createMock('\Symfony\Component\HttpKernel\HttpKernelInterface');
-    return new RequestEvent($http_kernel, $request, HttpKernelInterface::MASTER_REQUEST);
+    return new RequestEvent($http_kernel, $request, HttpKernelInterface::MAIN_REQUEST);
   }
 
   /**
diff --git a/web/modules/redirect/tests/src/Unit/RedirectSourceWidgetTest.php b/web/modules/redirect/tests/src/Unit/RedirectSourceWidgetTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..301aa53be611a4487b36e8afa6f473b06b4f660e
--- /dev/null
+++ b/web/modules/redirect/tests/src/Unit/RedirectSourceWidgetTest.php
@@ -0,0 +1,47 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\Tests\redirect\Unit;
+
+use Drupal\Core\Field\FieldDefinitionInterface;
+use Drupal\redirect\Plugin\Field\FieldWidget\RedirectSourceWidget;
+use Drupal\Tests\UnitTestCase;
+
+/**
+ * Redirect source widget should only be applicable on redirect entities.
+ *
+ * @group redirect
+ */
+class RedirectSourceWidgetTest extends UnitTestCase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'path',
+    'path_alias',
+    'redirect',
+  ];
+
+  /**
+   * Tests the isApplicable method for redirect entities.
+   */
+  public function testIsApplicableForRedirectEntity(): void {
+    $field_definition = $this->createMock(FieldDefinitionInterface::class);
+    $field_definition->method('getTargetEntityTypeId')->willReturn('redirect');
+
+    $this->assertTrue(RedirectSourceWidget::isApplicable($field_definition));
+  }
+
+  /**
+   * Tests the isApplicable method for non-redirect entities.
+   */
+  public function testIsApplicableForNonRedirectEntity(): void {
+    $field_definition = $this->createMock(FieldDefinitionInterface::class);
+    $field_definition->method('getTargetEntityTypeId')->willReturn('node');
+
+    $this->assertFalse(RedirectSourceWidget::isApplicable($field_definition));
+  }
+
+}
diff --git a/web/modules/redirect/tests/src/Unit/RouteNormalizerRequestSubscriberTest.php b/web/modules/redirect/tests/src/Unit/RouteNormalizerRequestSubscriberTest.php
index de3d3dda292fba88d74130d9a31e0600ddcf1fd3..1f4906414ccfd787992cb26faf996cffb923a21e 100644
--- a/web/modules/redirect/tests/src/Unit/RouteNormalizerRequestSubscriberTest.php
+++ b/web/modules/redirect/tests/src/Unit/RouteNormalizerRequestSubscriberTest.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace Drupal\Tests\redirect\Unit;
 
 use Drupal\Tests\UnitTestCase;
@@ -69,7 +71,7 @@ public function testSkipIfRequestAttribute() {
     $request_uri = 'https://example.com/route-to-normalize';
     $request_query = [];
 
-    $event = $this->getGetResponseEventStub($request_uri, http_build_query($request_query), HttpKernelInterface::MASTER_REQUEST, TRUE);
+    $event = $this->getGetResponseEventStub($request_uri, http_build_query($request_query), HttpKernelInterface::MAIN_REQUEST, TRUE);
     // We set '_disable_route_normalizer' as a request attribute and expect to leave onKernelRequestRedirect at the beginning,
     // i.e. $this->redirectChecker->canRedirect($request) should never be called.
     $subscriber = $this->getSubscriber($request_uri, TRUE, FALSE);
@@ -207,7 +209,7 @@ protected function getRedirectCheckerStub($call_expected = TRUE) {
    *
    * @return \Symfony\Component\HttpKernel\Event\RequestEvent
    */
-  protected function getGetResponseEventStub($path_info, $query_string, $request_type = HttpKernelInterface::MASTER_REQUEST, $set_request_attribute = FALSE) {
+  protected function getGetResponseEventStub($path_info, $query_string, $request_type = HttpKernelInterface::MAIN_REQUEST, $set_request_attribute = FALSE) {
     $request = Request::create($path_info . '?' . $query_string, 'GET', [], [], [], ['SCRIPT_NAME' => 'index.php', 'SCRIPT_FILENAME' => 'index.php']);
 
     if ($set_request_attribute === TRUE) {